笑死我了,SSH 隧道居然复活了!我这是上小学时候的上网方式,23333333333333333333333333333333 。不过想想就笑不出来了。首先是因为我居然也是能给网民讲故事的老人了,岁月是把杀猪刀。其次是因为,这段历史是中国网络安全领域最重要的历史,居然如今已经有新人不知道了,历史的速度消失惊人。
那就来讲讲故事吧,以防后人忘记了。
首先关于楼主的 SSH 隧道的评论:我上中学时候,SSH 就不能用了。众所周知,我们今天所知所有常用代理工具,几乎都是 SSH/OpenVPN 等工具在 2013-2014 年被封后的连锁反应。假如 SSH 没被封,今天估计人人还在用 SSH ,根本不会有过去十年的历史。
不过楼主引入反向连接,可能还是有创新的——也许反向隧道的检测力度真的不大?或者是因为 SSH 隧道正因为被封了,很少有人用了,检测力度反而下降了?反向隧道也几乎不检测了?又或者说,SSH 只有动态代理模式( ssh -D )频繁建立连接而特征明显,容易被检测,固定静态隧道反而特征少一些?很遗憾,我在 2014 年技术太差,不然我一定会测试反向连接 + 静态隧道好不好用。当年被封的都是正向隧道,反向隧道我个人没听说过有人用。所以这事情已经成了历史谜案,当年这么用究竟会不会被封呢?
然后我们来讲故事。
正向 SSH 的 Socks5 代理( ssh -D <port>)是中国大陆最早流行的代理服务器,在 2007-2013 年间非常流行,见 [1]。我记得当时的标配,一个是 Firefox 浏览器:当年大多数软件只支持 SOCKS 4 ,不支持 OpenSSH 的 SOCKS 5 ,也不支持用代理做 DNS 解析。Firefox 是必须的,而且要进入 about:config 手动开启 network.proxy.socks_remote_dns ;另一个就是 MyEntunnel:Windows XP 下的 SSH 前端,不会输入命令行也能使用。
服务器都预装了 SSH ,默认允许转发流量。有普通账号就能用,不需要权限,曾火遍全网。当年网上能找到一堆来路不明的免费 SSH 账号网站。[2]
当年另一种常见的使用方法是购买 GoDaddy, Bluehost, DreamHost 等公司入门级的个人主页托管业务,开通 SSH 登录。当时还没有 GitHub Pages 等免费静态网站托管,静态生成器也不流行。当年重度网民几乎人人都有 PHP 个人主页,于是同时解决上网与个人网站两个需求。
但这样做的性能并不好。SSH 协议开销大,特别是 -D 动态转发,效率格外低下。静态转发和 TUN 模式可能效率高(如楼主的做法),但我没用过。在后期,许多人都换成了 OpenVPN 做 NAT ,配合 chnroute 项目 [3] 维护的一份巨大的 IP 封禁路由表,决定是否走 VPN 。
然后从 2012 年末到 2013 年初,GFW 开始检测 OpenVPN 的 TLS 握手,看到证书就发 RST ,OpenVPN 暴毙。[4] 如果频繁更换端口,还会导致 IP 被封禁,我的 IP 就被封了。[5] 人们开始改用没有完整握手的静态密钥连接 OpenVPN 。但在我印象中,稳定性并不好。当时的网络传闻说,封禁使用了方滨兴等人在论文《网络流量分类研究进展与展望》[6] 中的技术,但我表示怀疑,实时部署机器学习模型成本似乎过高了。但毫无疑问的是,在 2013-2014 年的某个时刻(不太好查了),GFW 拥有了基于流量特征封禁 SSH 的技术,只要用 SSH 跑隧道,流量大必然封 IP ,但系统管理不受影响。我在 2014 年 7 月,就因为“手贱”在学校开 ssh -D ,导致 IP 被封了。[7]
同样在 2013 年,雪中送炭的是,就在 OpenVPN 检测全面推行时,Tor Project 对抗流量分析的 obfs2proxy 代理登场( 2012 年完成开发)[8],SSH/OpenVPN 套一层 obfs2proxy ,直接复活![6] 但这个协议有漏洞,后来一直改进到 obfs3 [9], obfs4 [10]。至今 obfs4 依然被认为是里程碑,没有明显漏洞。但是 obfsproxy 的性能依然差,而且由于需要编译 C 程序,还要自行叠加代理应用,其影响力仅仅局限于网络安全圈子,而不是普通的开发者圈。
就在这样的时代背景下,2012 年,clowwindy 在
v2ex.com 论坛(也就是这里)发表《发一个自用了一年多的翻墙工具 shadowsocks 》[11],本来是一个非常简易的 Python 脚本,就是把 socks 的内容过一遍 AES ,不支持公钥也不支持完整性校验,但恰恰因为协议极简,对称加密无握手特征,而且采用可移植的 Python ,易于传播。在 2013 年,在 VPN/SSH 等标准协议被封禁后,Shadowsocks 天时地利人和,迅速被大量应用。(也正是因为协议简易,也为日后的各种安全漏洞埋下了伏笔——但此时矛盾还未爆发)。
我有一张 2015 年 6 月的服务器登录截图,上面写着:请勿使用 "ssh -D" 开代理,请使用 "ss-server"。可见当时 ss-server 就是 SSH 的平替(上面还打趣的写着:如果你想开代理,请交 450 元/10 万元/70 万,左侧还有一个红白动漫角色的字符画——这是三个当时动漫圈的梗,留给读者作为练习)。[12]
2015 年,当局迫使 Clowwindy 停止开发工作。[13] 但 Clowwindy 退出的影响有限。由于 Shadowsocks 恰好赶上了后来的智能手机普及,以及 Node, Go, libev 等协程/异步编程新框架的普及,它极简的协议立刻成为网络编程的典型项目,被各种编程语言实现,被各种 iOS/Android 开发者实现。这使得 Shadowsocks 成为一举多得的项目:编程语言推广、网络编程、业余移动 App 、跨境代理,让它成为全网最流行的代理。
剩下的故事,正如人们所说的——就是历史了。
[1]
https://www.chinagfw.org/2007/10/myentunnel.html[2]
https://www.chinagfw.org/2010/09/ssh_17.html[3]
https://github.com/fivesheep/chnroutes[4]
https://www.chinagfw.org/2012/12/openvpngfw.html[5]
https://tomli.blog/archives/2013/02/1621.html[6]
https://doi.org/10.12146/j.issn.2095-3135.201205006[7]
https://tomli.blog/archives/2014/07/1874.html[8]
https://github.com/Yawning/obfsproxy/blob/master/doc/obfs2/obfs2-protocol-spec.txt[9]
https://github.com/Yawning/obfsproxy/blob/master/doc/obfs3/obfs3-protocol-spec.txt[10]
https://github.com/Yawning/obfs4/blob/master/doc/obfs4-spec.txt[11]
https://v2ex.com/t/32777[12]
https://web.archive.org/web/20261109102557/https://misskey-taube.s3.eu-central-1.wasabisys.com/files/10572e04-1782-4f22-bfa3-1f2b7ee6e52e.jpg[13]
https://www.eff.org/deeplinks/2015/08/speech-enables-speech-china-takes-aim-its-coders