Shadowsocks 的破晓之火:点燃去中心化开源生态
用极简的对称加密隧道撕开网络封锁的铁幕,在告别中点燃不可扑灭的燎原火种
第一幕 · 破晓:在深度包检测的铁幕下突围
2012 年初,中文互联网的网络审查与突破封锁正经历着严峻的至暗时刻。
当时主流的翻墙手段主要依赖两类:一是以 OpenVPN、PPTP、L2TP 为代表的传统系统级 VPN;二是以 GoAgent 为代表、基于 Google App Engine 的 HTTP 代理。
随着防火长城(GFW)对深度包检测(DPI)与机器学习指纹算法的工业化部署,传统 VPN 因其握手阶段鲜明的明文协商特征和固定的协议头部屡遭精准重置与阻断,如同在透明玻璃管道中运送信件;而 GoAgent 则因公共 IP 段遭遇地毯式封锁与单请求配额受限而频频瘫痪。
更痛苦的是,普通用户往往只需对受阻的海外学术与社交域名进行分流加速,传统 VPN 却只能将整机的所有本地流量无差别地导入耗费昂贵带宽的远端隧道,造成国内网站极度迟滞。
在这一逼仄的技术僵局中,开发者 clowwindy 构想出了一种极其克制却足以颠覆战局的全新范式。
2012 年 4 月 20 日,他在 GitHub 创建了项目仓库,并在 V2EX 社区发布了历史性首帖:《发一个自用了一年多的翻墙工具 shadowsocks》。
他在创世 README 中留下了那句精炼而直击本质的定调:“A lightweight tunnel proxy which can help you get through firewalls.”(一个能帮你穿越防火墙的轻量级隧道代理)。
该方案彻底摒弃了繁重的系统级虚拟网卡,创造性地采用本地 SOCKS5 代理无感接收应用程序连接,再在客户端与自建的远端服务器之间建立一条轻量、对称加密的私有传输管道。
在外部审查设备眼中,整条连接在流量特征上完全表现为毫无规律的高随机度二进制加密流,没有明文握手,没有特征证书,以最小的工程代价奇迹般避开了特征匹配系统的围剿。[1][2]
第二幕 · 极简:单文件重塑范式与「为什么不应该用 SSL」
Shadowsocks 最初的参考实现仅仅是用 Python 编写的数百行代码,甚至单文件即可独立启动。
它的通信时序优雅而高效:本地客户端在本地监听 1080 端口扮演 SOCKS5 代理服务器,无感接收来自浏览器或操作系统的网络连接;随后将目标地址类型(IPv4、IPv6 或域名)、目标端口与有效载荷紧凑打包,利用预共享密钥与随机初始向量(IV)进行对称流加密,直连发送至远端服务端;服务端解密后代为发起真实 TCP/UDP 连接,并将回传流量加密捎回本地。
整个运行完全在普通用户态空间完成,无需 root 权限;并与系统 PAC(代理自动配置)脚本完美契合,使得“国内直连、海外走代理”的分流第一次走入千家万户。
面对当时技术社区关于“为何不直接使用标准 HTTPS / SSL / TLS 进行代理”的疑问,clowwindy 于 2013 年 7 月 8 日在 GitHub Gist(Gist 5947691)发表了著名的技术备忘录《为什么不应该用 SSL 翻墙》。
他一针见血地指出:SSL 的初衷是防止内容篡改、防止冒充服务器身份以及加密通信内容,但在翻墙对抗的特殊场景下,防冒充的证书验证机制反而成为了致命软肋。
“SSL 不适合翻墙。”
clowwindy 敏锐分析道,SSL 握手过程中必须明文交换服务器证书信息,防火墙只要嗅探到证书,就能以极低成本识别并封锁提供代理服务的 IP;而 Shadowsocks 选择纯粹的高随机度对称密文流,彻底剥离了证书特征,从设计根源上剥夺了审查设备通过证书识别端点的可能。
2013 年 11 月 9 日,面对社区用户对长期维护的关切与感谢,clowwindy 在 Issue #124 中坦诚回复道:“最开始只是我自己写来用的,但很高兴能帮到大家。这个项目属于社区,只要有需求,它就会一直存在下去。”[2][6][7]
第三幕 · 远征:移动端拓荒与多语言分布式矩阵
随着智能手机时代的全面到来,翻墙需求迅速从 PC 桌面蔓延至掌上移动设备。
2012 年底,clowwindy 与社区开发者敏锐捕捉到了 Android 4.0 引入的 VpnService 框架,开启了移动端原生客户端的拓荒征途。
2012 年 12 月 15 日,Shadowsocks Android 客户端迎来了早期的核心代码提交(Commit 2e0a6fc6),将后台代理守护进程、本地端口转发与系统 VPN 服务深度缝合,首次在不需 Root 提权的普通 Android 手机上实现了全局透明代理。
随后,针对 iOS 越狱生态的 Shadowsocks-iOS 亦应运而生,为移动生态的规则代理播下了最早的火种。
几乎在同一时期,Shadowsocks 从单一的 Python 实现迅速演进为多语言百花齐放的开源矩阵。
clowwindy 本人于 2012 年 10 月主导创建了基于 Node.js 异步事件循环的 shadowsocks-nodejs;
2012 年底至 2013 年初,开发者 Max Lv(madeye)介入纯 C 语言重构,诞生了专为 16MB/32MB 极低内存路由器量身定制的 shadowsocks-libev,直接开启了家用软路由全屋翻墙时代;
C# 版的 shadowsocks-windows 与 Go 语言实现的 shadowsocks-go 亦相继涌现。
第四幕 · 摩擦:开源公地的悲剧与对「造墙文化」的反思
伴随着影响力的几何级裂变,开源公地的悲剧与复杂的社会现实开始向项目涌来。
2014 至 2015 年间,大量商业化 VPN/翻墙服务商开始恶意抢注域名,甚至以 Shadowsocks.com 等官方名义大肆招揽付费用户,将无辜的用户引向劣质服务,反将无数售后怒火倾泻至开源代码仓库中。
2015 年 1 月 29 日,不堪其扰的 clowwindy 在 V2EX 发布公开澄清声明《[PSA] Shadowsocks.com 所售服务与 Shadowsocks 项目无关》。
在长期回复了数千条缺乏基本信息与自理能力的质问(“不能用了?”)后,clowwindy 写下了一段引人深思的社会学反思:
“维护这个项目到现在大概总共回复过几千个问题,开始慢慢想清楚了一件事,为什么会存在 GFW……政府无限的权力,都是大部分人自己放弃的。……文化创造出了家长式威权政府,GFW 正是在这种背景下产生的,一个社会矛盾的终极调和器,最终生活不能自理的你每天做的每一件事情都要给政府审查一遍,以免伤害到其他同样生活不能自理的人。这是一个零和游戏,越和这样的用户打交道,越对未来持悲观态度……”
2015 年 8 月 18 日,在 shadowsocks-windows 的 Issue #293 中,面对社区部分二次封装者违反开源协议搞小圈子、强制回帖抱团的恶习,clowwindy 再次留下了振聋发聩的辛辣批判:
“最适合这个民族的其实是一群小白围着大大转,大大通过小白的夸奖获得自我满足,然后小白的吃喝拉撒都包给大大解决的模式。通过这个项目我感觉我已经彻底认识到这个民族的前面为什么会有一堵墙了。没有墙哪来的大大。……不需要政府造墙,网民也会自发造墙。这尼玛连做个翻墙软件都要造墙,真是令人叹为观止。”
他深刻地洞察到:网络审查的技术高墙固然严密,但人心深处对权威的盲从与在虚拟世界中自发筑起的圈子之墙,才是更深沉的技术与文化悲剧。[8][9]
第五幕 · 诀别:八月的风暴与「无所恐惧地编写代码」
2015 年 8 月 22 日,命运的齿轮在沉闷的夏末骤然加速。
下午 13:48(UTC+8),GitHub 上的 shadowsocks/shadowsocks 仓库收到了编号为 938bba32a4008bdde9c064dda6a0597987ddef54 的提交。
提交日志只有苍白而决绝的六个英文字母:
remove
顷刻间,主仓库中的所有核心 Python 代码被清空殆尽。
随后,在 shadowsocks-iOS 的 Issue #124 中,面对正在讨论 iOS 9 Network Extension 新架构的开发者们,clowwindy 留下了那段载入世界互联网史册的最后留言:
“Two days ago the police came to me and wanted me to stop working on this. Today they asked me to delete all the code from GitHub. I have no choice but to obey.”
(两天前警察找到我,要求我停止开发。今天他们要求我删除 GitHub 上的所有代码。我别无选择只能服从。)
他紧接着写下了那句震撼无数工程师灵魂的心声:
“I hope one day I'll live in a country where I have freedom to write any code I like without fearing. I believe you guys will make great stuff with Network Extensions. Cheers!”
(我希望有一天,我能生活在一个可以自由编写任何我喜欢的代码而无所恐惧的国家。我相信你们会利用 Network Extensions 做出伟大的作品。干杯!)
在社交平台上,他亦留下平静的告别:“声明:本人不再参与 Shadowsocks 的开发。(完)”
他深情地叮嘱同道:“最希望的是,大家不要理那些人。如果你们真的支持我,就不要为我抱不平,也不要把这件事搞大。……维护好你们手上的分支,保护好你们自己。”
2015 年 8 月 28 日,国际数字人权组织电子前沿基金会(EFF)发表全球专题深度报道《Speech that Enables Speech: China Takes Aim at Its Coders》,将这一事件定义为开源软件抗审查史上的最沉重转折点。[10][11][12][13]
第六幕 · 余响:火种燎原与不可磨灭的技术遗产
原始仓库被清空了,但去中心化的开源网络在这一刻展现出了不可摧毁的韧性。
在主仓库变成空白之前,全球早已存在成千上万个代码 Fork,火种早已分散在世界的每一个角落。
就在 clowwindy 被迫退场的短短一周后(2015 年 8 月 29 日),开发者 Victoria Raymond 在 GitHub 提交了 Project V(V2Ray)的创世代码,并在立项宣言中明确将 Shadowsocks 与 GoAgent 的被迫关停作为发起新一代复合代理平台的核心动力。
以 Max Lv(madeye)为代表的社区核心成员迅速接棒维系了 shadowsocks 组织的日常运作;
面对后续主动探测攻击对早期流加密的威胁,社区制定了 SIP003 插件标准与 SIP004 AEAD 认证加密规范,并在 2022 年进一步推出了 Shadowsocks 2022 规范,将协议推向现代密码学前沿;
与此同时,clowwindy 告别时预言的 Network Extensions 果然在苹果生态中结出了丰硕的果实——Surge、Shadowrocket、Quantumult 等划时代的移动客户端相继诞生,而 Clash 与 sing-box 则将规则分流与跨平台体验推向了极致。
一行代码可以被删除,一个账号可以被注销,甚至一个人可以被迫隐入黑夜;
但一种关于自由互联与去中心化抗争的思想,一旦被代码具象化,就再也无法被任何力量从人类数字文明的星空中抹去。[14][15][16]