起源:在深度包检测的铁幕下突围
在 2012 年初 Shadowsocks 诞生之前,中文互联网的突破封锁手段正经历着前所未有的至暗时刻。当时主流的翻墙方案主要依赖两类:一是以 OpenVPN、PPTP、L2TP 为代表的传统系统级 VPN;二是以 GoAgent 为代表、基于 Google App Engine 搭建的 HTTP 反向代理。
随着防火长城(GFW)对深度包检测(DPI)技术和动态机器学习指纹的全面部署,传统 VPN 因其握手阶段鲜明的明文协商特征和固定的协议头部屡遭精准重置与阻断,如同在透明玻璃管道中运送信件;而依赖第三方公共云的 GoAgent 则因 IP 段遭遇地毯式封锁与单请求大小受限而频频瘫痪。更痛苦的是,普通用户只需要对受阻的海外学术与社交域名进行分流加速,传统 VPN 却只能将整机的所有本地流量无差别地导入耗费昂贵带宽的远端隧道,造成国内网站极度迟滞。
在这一逼仄的技术僵局中,clowwindy 于 2012 年 4 月 20 日在 GitHub 创建了项目,并在创世 README 中留下了那句精炼而直击本质的定调:“A lightweight tunnel proxy which can help you get through firewalls.”(一个能帮你穿越防火墙的轻量级隧道代理)。他构想出了一种极其克制却足以颠覆战局的全新模型:利用本机成熟的 SOCKS5 协议静默接收应用程序流量,再在客户端与自建的境外远程服务器之间建立一条轻量、对称加密的私有传输管道。在外部审查设备眼中,这条连接在流量特征上完全表现为毫无规律的高随机度二进制加密流,没有明文握手,没有特征证书,从而以最小的工程代价奇迹般避开了所有特征匹配系统。[4]
极简设计:单文件脚本重塑代理工程范式
Shadowsocks 最初的实现仅仅是用 Python 编写的数百行代码,甚至单文件即可独立启动。它的通信时序优雅而高效:本地客户端在本地监听 1080 端口扮演 SOCKS5 代理服务器,无感接收来自浏览器或操作系统的网络连接;随后将目标地址类型(IPv4、IPv6 或域名)、目标端口与有效载荷紧凑打包,利用预共享密钥与随机初始向量(IV)进行对称流加密,直连发送至远端服务端;服务端解密后代为发起真实 TCP/UDP 连接,并将回传流量加密捎回本地。
2013 年 11 月 9 日,面对社区用户对长期维护的关切与感谢,clowwindy 在 Issue #124 中坦诚回复道:“最开始只是我自己写来用的,但很高兴能帮到大家。这个项目属于社区,只要有需求,它就会一直存在下去。”这种纯粹的开源信念与极简设计互相辉映,带来了降维打击般的技术红利:协议开销被压缩到极致,吞吐性能远超传统协议;完全运行在普通用户态空间,无需 root 权限;并与系统 PAC 脚本完美契合,使得“国内直连、海外走代理”的分流第一次走入千家万户。
尽管在数年后的密码学攻防演进中,单纯流加密与缺乏密文完整性校验的机制在面对主动探测(Active Probing)重放攻击时暴露出局限,催生出社区制定 AEAD 加密规范乃至后来的 Shadowsocks 2022 提案,但 clowwindy 在 2012 年以惊人直觉确立的基础通信范式,无可争议地奠定了整整一代开源代理协议的技术底色。[4][5][2]
告别的八月:一次震惊社区的仓库清空
2015 年 8 月 22 日 13:48,GitHub 上的 shadowsocks/shadowsocks 仓库记录了一次具有划时代象征意义的代码提交(commit 938bba32a4008bdde9c064dda6a0597987ddef54),提交日志仅有六个英文字母:“remove”。仓库中全部核心 Python 源码被作者一键清空。
在随后公开的 Issue #124 告别声明中,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 on GitHub. I have no choice but to obey. I hope you will understand.”(两天前警察找到我,要求我停止开发。今天他们要求我删除 GitHub 上的所有代码。我别无选择只能服从。希望大家能够理解。)
面对突如其来的不可抗力,clowwindy 在社交平台上留下了最后的温情嘱托:“最希望的是,大家不要理那些人。如果你们真的支持我,就不要为我抱不平,也不要把这件事搞大。……维护好你们手上的分支,保护好你们自己。”并饱含深情地写下那句震撼无数工程师的话语:“我希望有一天,我能在一个真正自由的国度生活,在那里,我不仅可以自由地写代码,也可以自由地说话。”电子前沿基金会(EFF)于 2015 年 8 月 28 日发布的深度专题报道记录了这一历史全貌。这成为了世界开源软件抗审查历史上最凝重、最标志性的转折点。[1][3][2]
燎原之火:代码可以被删除,但思想永不磨灭
当 clowwindy 挥手告别、主仓库变成空白时,许多人曾悲观地以为这项技术将就此终结。然而,去中心化开源网络的惊人生命力在此刻彻底爆发。在仓库被清空之前,全球早已有成千上万名开发者 Fork 了代码,火种早已分散至天涯海角。
几乎在原作者退场的同一时刻,分布式社区接力全面启动:专注于极致性能与嵌入式路由器移植的 C 语言版 shadowsocks-libev 扛起了核心重任,Go、Rust、C# 与移动端原生实现相继涌现,形成多语言百花齐放的抗封锁矩阵。更具戏剧性的是,就在 Shadowsocks 删库后短短一周(2015 年 8 月底),V2Ray 的初始提交与首份 README 便明确将 Shadowsocks 与 GoAgent 的被迫关停记录为立项动机,拉开了模块化复合协议的新篇章。
正如 EFF 与开源技术倡导者所评价的那样:关闭一个代码仓库并不能消灭一种思想。clowwindy 虽然被迫告别了项目,但他亲手点燃的这柄火炬,早已照亮了去中心化抗审查生态浩瀚的星空。[1][3]