我用 shadowsocks 很长时间了,最开始是从 V2EX 的这个帖子开始:发一个自用了一年多的翻墙工具 shadowsocks 。还记得那个时候这个小工具还只是一个900行左右的自用脚本,现在已经发展成功能齐备、拥有多种语言和平台 port 的社区项目、大家族了。虽然我认为它的发展在某种意义上偏离了一开始的理念——简单的架构,任何程序员都可以自己修改协议和加密部分,从而使得拦截变得困难——现在的 shadowsocks 毫无疑问已经形成了自己的一套协议,若要享受数量庞大的 ports ,自行修改协议变得不切实际了起来;然而更加丰富的功能、更稳定的程序、更快的速度也的确是为更广泛的群体提供了一个非常方便的工具。今天就简单说一下这么长时间以来的一些使用经验,以及其他一些废话。

不要使用公用服务

首先,免费服务肯定是不可接受的。一来是稳定性,免费服务难以保证,三天两头折腾、找新服务器是肯定的;二来是安全性,把所有流量交给一个身份不明、可信度为0的免费服务器,实在可怕。如果真的有这方面的需求,花点小钱是完全值得而且也是必须的。

其次,收费 shadowsocks 也不是一个好主意。 shadowsocks 从一开始就不是为了这种使用场景设计的,不像 VPN 。它没有可靠的 QoS (带宽/连接限制等)、没有成熟的账号系统,甚至多端口实例、大量并发的性能也不好( shadowsocks-go 在这方面稍好一些)。把它当做收费服务大批量售卖,是无法保证用户体验的。

版本选择

(写于2014年6月21日,考虑到各 port 更新很快,今后的情况可能有很大变化,仅供参考。Update: 刚说着, shadowsocks-nodejs 就被 deprecate 了,现在推荐的是 Python 和 libev 版…… Update 2:最新版 Python port 没有再遇到过卡死的情况,也是现在的官方推荐版本了。最近几版去掉了很多依赖,性能据说也提升不少。)

首先要看看这个 Wiki 页面: Ports and Clients

虽然我是半个 Python 程序员,也坚持用了“原版”的 shadowsocks-python 很久,但是我还是得说——如果可以,请尽量不要使用 Python 版本,不论是服务器还是客户端。 Python 版本的性能、稳定性、资源占用都不占优势(连接数大的时候遇到了几次 100% CPU 占用、 IO 卡死的情况,平时的 CPU 占用也可观),作为“原版”,就连新功能的实现也要慢半拍。

主推基于 libev/libuv 的版本——作为重度网络 IO 应用,使用高性能异步 IO 无疑对性能有很大帮助。经过一些尝试,我目前选择的是 shadowsocks-libev 作为服务器端:纯 C 语言实现,内存控制优秀,在低端 VPS 上有很好的表现,运行也很稳定(推荐编译安装,官方 Debian 源更新很慢)。而客户端则使用 shadowsocks-nodejs :得益于 Node.js 的 libuv ,性能出色,而且本地不用在意那么一点点内存占用, npm 还可以省去编译、安装的麻烦。 shadowsocks-nodejs 要求较高版本的 node 环境, Ubuntu 12.04 、 Debian Stable 不能满足,所以装在系统较老的服务器上反而比 shadowsocks-libev 更折腾。另外 C 语言版的 shadowsocks-libuv 不很稳定,长期没有更新,不支持 UDP 转发等新功能,没有多尝试。

最后是 shadowsocks-go ,据说是服务器端的 state-of-art ,适合大规模使用,没有尝试过……

其他还有 Erlang 、 Python Tornado 等等 ports ,不过考虑到最近 shadowsocks 不时推出新功能,为了能够获得新功能、和大多数客户端正常工作,还是使用由 clowwindy 、 madeye 等几个核心开发者维护的、更新较为频繁的版本比较好。

其他注意事项

  • 请一定要加密,并且绝对不要使用 table (不一定非要 aes-256-cfb 就是)。
  • 未雨绸缪,使用常见大流量端口或经常更换端口,以防特定端口流量过大被封。
  • 最好在服务器端配置 iptables 规则以防止被 DoS 。
  • 尽量把 DNS 请求也都代理了,不要依赖 hosts 。浏览器会自动把所有 DNS 请求通过 socks5 代理发送,不用操心。安卓手机需要在服务器端和客户端都开启 UDP 转发。
  • TCP Fast Open 看起来很美,但一定要经过测试,表现稳定后才用。如果你已经使用了 VPN 之类的网络层封装/隧道,不推荐开启 TCP Fast Open ,不确定能被正确封装并且被隧道另一头支持(我们学校使用 L2TP 出外网,就无法正常使用 TCP Fast Open )。

将来

最后泼一盆冷水—— no silver bullet 。不要以为 shadowsocks 无状态、没有明显特征,无法被拦截,事实上恰恰相反:特定端口,大量短连接、并发连接( HTTP 为主,连接长度、大小等模式都很有特点),大流量,流量内容加密,只要稍微机器学习一下很容易就能识别出来并阻断。

很多人觉得 tor 天天被封、很难用。事实上, tor 除了进入网络阶段比较麻烦(可能还需要依赖网桥)以外,协议本身现在是较难被识别的,从 obfs1/2 到即将到来的 obfs4 ,他们在混淆上投入了相当大的精力。难道是越混淆越容易被封?显然不是,是因为它的威胁太大、名气太旺、功能可怕(理想情况下几乎不可追踪,还有 tor “暗网站”),吸引了比较多的注意和资金,才使得它即使采取了这么多混淆手段还是一次又一次被识别。 shadowsocks 这样的小工具,如果发展到一定程度,也定难逃一劫。

总而言之,这一定是一个魔高一尺、道高一丈、魔再高一尺的无尽(?)斗争。