Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
shadowsocks 公共代理的必要设置
good, 你已经有了一个自己的shadowsocks代理了,现在想要把这个代理公布出去给所有人分享。
但是没有两个小时,代理就没法使用了,为什么?因为你需要额外注意以下事项(以下步骤需要比较高的linux技能)
本文只关注于确保shadowsocks服务还“活着”,如果你希望让其跑得更快,请参考
https://github.com/clowwindy/shadowsocks/wiki/Optimizing-Shadowsocks
1、 shadowsocks的timeout设置
超时时间越长,连接被保持得也就越长,导致并发的tcp的连接数也就越多。对于公共代理,这个值应该调整得小一些。推荐60秒。
2、 检查操作系统的各种限制
对于openvz的vps,特别需要检查一下
shell# cat /proc/user_beancounters
Version: 2.5
uid resource held maxheld barrier limit failcnt
1005: kmemsize 6499239 34332672 50331648 50331648 0
lockedpages 0 0 12288 12288 0
privvmpages 20185 89959 9223372036854775807 9223372036854775807 0
shmpages 654 670 9223372036854775807 9223372036854775807 0
dummy 0 0 9223372036854775807 9223372036854775807 0
numproc 26 102 9223372036854775807 9223372036854775807 0
physpages 12181 24887 0 24576 536
vmguarpages 0 0 9223372036854775807 9223372036854775807 0
oomguarpages 7054 30538 9223372036854775807 9223372036854775807 473
numtcpsock 52 1500 1500 2000 21583239
numflock 1 5 9223372036854775807 9223372036854775807 0
numpty 1 16 9223372036854775807 9223372036854775807 0
numsiginfo 0 63 9223372036854775807 9223372036854775807 0
tcpsndbuf 7497680 29165536 104857600 209715200 0
tcprcvbuf 18891984 88633288 104857600 209715200 0
othersockbuf 39304 386848 9223372036854775807 9223372036854775807 0
dgramrcvbuf 0 166480 9223372036854775807 9223372036854775807 0
numothersock 27 37 1500 2000 0
dcachesize 2293779 25165824 25165824 25165824 0
numfile 362 1910 9223372036854775807 9223372036854775807 0
dummy 0 0 9223372036854775807 9223372036854775807 0
dummy 0 0 9223372036854775807 9223372036854775807 0
dummy 0 0 9223372036854775807 9223372036854775807 0
numiptent 30 30 9223372036854775807 9223372036854775807 0
其中 numtcpsock 表示 tcp 连接数。像上面这样的情况,就不适合用于公共代理,因为vps商限制了并发的tcp连接数。
shell# ulimit -n
1024
这个命令检查默认的一个进程可以打开的文件数。1024这个默认值是不够的。推荐设置为8000
shell# ulimit -n 8000
shell# ss-server -s 0.0.0.0 -p 1080 -k xxxx -m rc4
上面启动ss-server的命令只是示意性的,请替换成你自己的启动命令。ulimit的设置是一次性的,每次启动ss-server之前都要设置一下。
3、 防止vps被用于暴力破解ssh密码等非法行为
只要shadowsocks被公开出去,肯定会有人拿代理用于暴力破解ssh的密码。
推荐你把shadowsocks限制为只允许访问443和80两个端口。如果你不添加这样的限制,
很多vps商都会因为ssh连接开得太多而暂停对你的服务。
shell# adduser http-ss
shell# su http-ss -c "ss-server -s 0.0.0.0 -p 1080 -k xxxx -m rc4"
让ss-server以特定的用户启动
shell# iptables -t filter -A OUTPUT -d 127.0.0.1 -j ACCEPT
shell# iptables -t filter -m owner --uid-owner http-ss -A OUTPUT -p tcp --sport 1080 -j ACCEPT
shell# iptables -t filter -m owner --uid-owner http-ss -A OUTPUT -p tcp --dport 80 -j ACCEPT
shell# iptables -t filter -m owner --uid-owner http-ss -A OUTPUT -p tcp --dport 443 -j ACCEPT
shell# iptables -t filter -m owner --uid-owner http-ss -A OUTPUT -p tcp -j REJECT --reject-with tcp-reset
对于http-ss用户,限制其不能访问80,443之外的端口
4、 防止DMCA Compliant
虽然你已经把shadowsocks限制为只能访问80/443端口,但是对于美国的vps,仍然有额外的一点需要注意。
因为美国的vps需要遵从美国的DMCA版权法律,如果该vps被用于bt下载,而且正好遇上了电影公司设置的蜜罐的话,
你的vps的ip就会被记录下来。然后DMCA Compliant律师函会被送往你的vps商那,然后就会被停止服务。
为了避免shadowsocks帐号被用于bt下载,你不得不对80端口的流量再进一步进行限制
shell# apt-get update && apt-get install -y nginx
安装nginx
server {
listen 127.0.0.1:3128;
server_name localhost;
resolver 8.8.8.8;
location / {
set $upstream_host $host;
if ($request_uri ~ "^/announce.*") {
return 403;
}
if ($request_uri ~ "^.*torrent.*") {
return 403;
}
proxy_set_header Host $upstream_host;
proxy_pass http://$upstream_host;
proxy_buffers 8 32k;
proxy_buffering off;
}
}
然后配置nginx的server
shell# iptables -t nat -m owner --uid-owner http-ss -A OUTPUT -p tcp --dport 80 -j REDIRECT --to-port 3128
把所有的80端口流量转到nginx来处理
@clowwindy

This comment has been minimized.

Copy link

@clowwindy clowwindy commented Jun 21, 2014

  1. 考虑到很多人看不懂 user_beancounters 各项的含义,可以解释一下 numtcpsock 表示 tcp 连接数
  2. 防 ssh 破解密码可以 apt-get install denyhosts
  3. 很多人用的是网上找的一键安装脚本或者傻瓜教程,他们可能没有能力在此基础上再做其它的修改。不如直接提供一个优化好的一键安装脚本。 或许你可以直接改一改我的这个脚本把端口限制加进去。
@kyalipay

This comment has been minimized.

Copy link

@kyalipay kyalipay commented Jun 21, 2014

把所有的80端口流量转到nginx来处理就可以防止bt,有效吗?

@v3aqb

This comment has been minimized.

Copy link

@v3aqb v3aqb commented Jun 21, 2014

把80端口流量发到http反向代理,然后再把bt请求过滤掉

@fqrouter

This comment has been minimized.

Copy link
Owner Author

@fqrouter fqrouter commented Jun 23, 2014

上面很多费功夫的地方在于用各种工具拼装出一个解决方案来。优化好的一键安装包的实质是把这些工具提前打包好,也就是整合出一个公共代理专用的加强版shadowsocks。

@liruqi

This comment has been minimized.

Copy link

@liruqi liruqi commented Sep 10, 2014

denyhosts 规则也太强了。
我这几天一直登录有问题,排查发现是这货导致的。
ssh_exchange_identification: read: Connection reset by peer
还好有 Lish。

@kkxxxxxxx

This comment has been minimized.

Copy link

@kkxxxxxxx kkxxxxxxx commented Feb 3, 2015

转发80到Nginx过滤,如此VPS上的网站如何不受影响

@AndrewRussellGarfield

This comment has been minimized.

Copy link

@AndrewRussellGarfield AndrewRussellGarfield commented May 12, 2015

怎么限制每个端口的连接的终端数呢
比方每个用户最多3个设备同时在线 该怎么设置呢

@492162921

This comment has been minimized.

Copy link

@492162921 492162921 commented Nov 3, 2015

NICE

@usami-mizugi

This comment has been minimized.

Copy link

@usami-mizugi usami-mizugi commented Feb 21, 2016

请问关于SS限定单一端口连接数和流量统计与速度限制怎样实现?

@ty-me

This comment has been minimized.

Copy link

@ty-me ty-me commented Apr 27, 2016

直接不開起nginx可以嗎?

@QuanTengjiao

This comment has been minimized.

Copy link

@QuanTengjiao QuanTengjiao commented Feb 7, 2017

vps上nginx有网站的话,可以新建一个ssr.conf,把上面的内容写到ssr.conf,然后放到nginx的conf.d或者在nginx.conf里
http {
include "ssr.conf";

@zagfai

This comment has been minimized.

Copy link

@zagfai zagfai commented Aug 17, 2017

限制剩下80 和443 google push都用不了了吧?

@lailongmen

This comment has been minimized.

Copy link

@lailongmen lailongmen commented Mar 30, 2018

请问,我想把自建的ss广泛分享出去,但限制访问特定网站可以吗?要如何设置?
比如,只能用这个ss访问谷歌。

@woOzZ2

This comment has been minimized.

Copy link

@woOzZ2 woOzZ2 commented Mar 7, 2020

修改/etc/nginx/sites-available/default文件的配置如下

server {
listen 127.0.0.1:3128;
server_name localhost;
resolver 8.8.8.8;
location / {
set $upstream_host $host;
if ($request_uri ~ "^/announce.*") {
return 403;
}
if ($request_uri ~ "^.torrent.") {
return 403;
}
proxy_set_header Host $upstream_host;
proxy_pass http://$upstream_host;
proxy_buffers 8 32k;
proxy_buffering off;
}
}

然后iptables -t nat -A OUTPUT -p tcp --dport 80 -j REDIRECT --to-port 3128
iptables -t nat -A OUTPUT -p tcp --dport 443 -j REDIRECT --to-port 3128
这样就不能访问任何网页了,并没有起到过滤URL的作用

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment