半公开 Shadowsocks 架设注意事项

作为一个轻量级代理工具,安装配置很方便,基本上照着 README 做就行了。
这里说下在 Linux VPS 上架设半公开 Shdowsocks 服务可能需要用到的两项额外配置

同样由于为了保持轻量,Shadowsocks(这类)工具并不提供访问控制(ACL)和流量控制(TC)功能。 这在某些情景下可能产生安全隐患:公开或半公开帐号,可能有不信任的人使用;服务器上同时运行了其他服务。

禁止访问本机与内网

在 Linux 中,使用 TCP/UDP 在进程间通讯十分常见,比如 MySQL、PHP-FPM、Memcached… 它们在 127.0.0.1 上开一个端口,让其他程序连接。

localhost 只有本地应用才可访问,所以一般认为是安全的。但挂上 Shadowsocks 后,在客户端发起的请求,在系统看来,就是本地应用发出的。

感谢 @lilydjwg 的提醒,可以这么做:

Step 1  以outwall用户身份运行 Shadowsocks

su -c "ssserver -c /path/to/config.json" outwall

或者,Ubuntu 用户可使用 Upstart 运行:

# /etc/init/ssserver.conf
description "Shadowsocks Server"
start on runlevel [2345]
stop on runlevel [016]
setuid outwall
setgid outwall
respawn
exec ssserver -c /path/to/config.json

(日志将保存在 /var/log/upstart/ 下)

再或者,更高大上的 systemd:不会

Step 2  用 owner 模块匹配进程 UID

iptables -A OUTPUT ! -o eth0 -m owner --uid-owner outwall \
    -j REJECT --reject-with icmp-host-prohibited

这样,Shadowsocks 就只能连接外网(eth0)了。

另外,如 @clowwindy 所言单机使用时用 Unix Socket 代替 TCP/UDP 个好主意

2015-03-12 更新:
Shadowsocks (Python) 最新版已可以通过--forbidden-ip IPLIST参数禁止访问指定 IP。

流量控制

之前用美帝的 VPS 就完全不用在意带宽问题.. 少说 100Mbps 多则 1Gbps 的口,不限也大丈夫… 换成港服后就蛋疼了…

试着用 tc/tcng 来做流量控制,似乎挺复杂的,我就说下大致思路吧:
将 SS 的上行流量分两类:发回墙内的 与 发给墙外的
前者优先级低于后者,两者均低于本机的其他服务。

发回墙内的,由于源端口总是为 SS 监听端口,所以直接在 tc 里匹配端口即可;
发给墙外的,端口不一,可用 iptables owner 匹配后打上 mark,再用 tc 匹配 mark。

iptables -t mangle -A POSTROUTING -m owner --uid-owner outwall
    -j MARK --set-mark 2

tc 略复杂啊,我觉得我没法讲清楚了(是你压根就不懂吧喂
有一个坑点需要注意,rate 有两重含义,一个是“保证带宽”,是一个确切的值。另一个是权重,可用带宽会按 rate 的比例分配。

2015-03-12 更新:
如果嫌 tc 麻烦,可使用 iptables 的hashlimit模块来实现限速。

半公开 Shadowsocks 架设注意事项》上有3条评论

    1. Null 文章作者

      我问了客服,他说我现在用的是他们的旧系统,没有内地特快线路这个选项。
      我这台最近到内地也不是太稳定的样子…

      回复

发表评论

电子邮件地址不会被公开。 必填项已用*标注