clowwindy

协议与传输

Shadowsocks 创始开发者 · 2012 — 2015

又名 C神

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 亦相继涌现。

Shadowsocks 不再仅仅是一个脚本,它演进为一个席卷全球的分布式开源协议生态。[4][3][5]

第四幕 · 摩擦:开源公地的悲剧与对「造墙文化」的反思

伴随着影响力的几何级裂变,开源公地的悲剧与复杂的社会现实开始向项目涌来。

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]

本站收录作品

已收录 1 款主导开发应用
Shadowsocks Android
Android

Shadowsocks 官方 Android 与 ChromeOS 客户端,使用 shadowsocks-rust,并提供系统 VPN 接入。

代表作品与核心贡献

Shadowsocks (Python)

访问作品

最初的原型与参考实现,奠定了本地 SOCKS5 结合远端轻量对称加密流的抗审查通信规范

Shadowsocks Android

访问作品

早期与社区共同推进的移动端开源客户端探索,奠定基于系统 VpnService 的移动代理基准

Shadowsocks iOS

访问作品

早期 iOS 平台的网络扩展探索,见证了不可抗力事件下的历史告别声明

Shadowsocks (Node.js)

访问作品

早期基于 Node.js 异步事件循环的多平台并发实现探索

为什么不应该用 SSL 翻墙

访问作品

阐释密码学设计目标与对抗流量嗅探差异的经典技术备忘录

致敬开发者的坚守

代码或许归档,但火种永不熄灭。为推动网络对抗演进与底层工程突破的开拓者献上一份敬意。

单设备 1 小时内限致敬 1 次 · 匿名无感不收集隐私

编年大事记

GitHub 原始公开仓库建立与 V2EX 创世发布

clowwindy 在 GitHub 创建仓库并在 V2EX 发帖《发一个自用了一年多的翻墙工具 shadowsocks》,确立“穿越防火墙的轻量级隧道代理”核心使命。[1][2]

创建 shadowsocks-nodejs 实现

发布基于 Node.js 异步事件循环的多平台实现,推动轻量代理的高并发网络吞吐探索。[3]

Shadowsocks Android 客户端核心代码公开

提交核心客户端代码(Commit 2e0a6fc6),利用 Android 4.0 引入的 VpnService 开启免 Root 移动端透明代理新纪元。[4]

发表 Gist 技术备忘录《为什么不应该用 SSL 翻墙》

剖析公钥证书握手特征在审查对抗中的致命隐患,奠定高随机度对称密文流的设计理论根基。[6]

确立“项目属于社区”的开源定调

clowwindy 在 Issue #124 坦诚表态“项目属于社区,只要有需求就会一直存在下去”,奠定去中心化传承基调。[7]

shadowsocks-libev 分支诞生

由 Max Lv(madeye)等社区维护者接力打造的纯 C 语言轻量实现诞生,常驻内存低至数兆字节,开启 OpenWrt 家用软路由时代。[5]

发表澄清声明并深入反思网络审查社会学

在 V2EX 发表 PSA 声明厘清开源项目与商业侵权服务的边界,深刻反思威权审查与用户依赖心理的深层共生结构。[8]

在 Windows 版 Issue #293 抨击圈子造墙文化

痛斥开源社区内部违反协议、搞小圈子“大大”文化的封闭心态,呼吁真正的开放与互相尊重。[9]

原始代码仓库清空与划时代告别声明

13:48 提交 commit 938bba3(“remove”)清空源码,并在 Issue #124 发表著名告别留言:“I hope one day I'll live in a country where I have freedom to write any code I like without fearing”。[10][11][12]

电子前沿基金会(EFF)发表全球专题报道

EFF 刊文《Speech that Enables Speech》,记录维护者受压清空仓库及抗审查开源软件的法律与人权背景。[13]

V2Ray 创世提交开启生态接力

Victoria Raymond 提交 V2Ray 初始代码(Commit a4d4c5c2),明确将 Shadowsocks 与 GoAgent 的被迫关停记录为构建新一代复合平台的动力。[14]

社区引入 SIP004 / AEAD 认证加密规范

Shadowsocks 协议引入带有关联数据的认证加密(AEAD),彻底根除针对无认证流密码的主动探测与重放漏洞。[15]

社区发布 Shadowsocks 2022 规范

全面重构握手报文与会话独立密钥派生,提供更强的抗重放攻击与多用户管理能力。[16]

一手来源与考据

小传正文中的关键事实与时间点均基于以下公开一手记录或权威报道:

  1. [1]

    clowwindy 首次在技术社区公开发布 Shadowsocks,阐述自用一年的轻量隧道设计初衷

    https://web.archive.org/web/20140719051716/https://www.v2ex.com/t/32777
  2. [2]

    确立“A lightweight tunnel proxy which can help you get through firewalls”核心使命与 SOCKS5 中继架构

    https://github.com/shadowsocks/shadowsocks/blob/master/README.md
  3. [3]

    clowwindy 探索基于 Node.js 异步事件驱动模型的高并发代理实现

    https://github.com/shadowsocks/shadowsocks-nodejs
  4. [4]

    加入 AndroidManifest、客户端 UI 与后台服务,开启基于 VpnService 的免 Root 移动端时代

    https://github.com/shadowsocks/shadowsocks-android/commit/2e0a6fc6f57e1f779db3057aa4023ae4eee253b3
  5. [5]

    社区接力打造的纯 C 语言轻量实现,开启 OpenWrt 嵌入式软路由透明代理时代

    https://github.com/shadowsocks/shadowsocks-libev
  6. [6]

    剖析 SSL 握手明文证书特征对翻墙隐蔽性的致命危害,阐明自研高随机度对称加密流的底层哲学

    https://gist.github.com/clowwindy/5947691
  7. [7]

    clowwindy 明确表态“这个项目属于社区,只要有需求,它就会一直存在下去”

    https://github.com/shadowsocks/shadowsocks/issues/124
  8. [8]

    澄清官方开源项目与商业侵权站点的边界,深入反思网络审查与用户依赖心理的社会学根源

    https://web.archive.org/web/20150131184242/https://www.v2ex.com/t/166417
  9. [9]

    clowwindy 针对部分社区封锁源码、搞小圈子“大大”文化的辛辣批评

    https://github.com/shadowsocks/shadowsocks-windows/issues/293#issuecomment-132253168
  10. [10]

    2015-08-22 13:48 作者清空全部 Python 核心代码的历史提交记录

    https://github.com/shadowsocks/shadowsocks/commit/938bba32a4008bdde9c064dda6a0597987ddef54
  11. [11]

    记录作者因警方约谈被迫删库的完整说明,留下“I hope one day I'll live in a country where I have freedom to write any code I like without fearing”

    https://web.archive.org/web/20150822042959/https://github.com/shadowsocks/shadowsocks-iOS/issues/124#issuecomment-133630294
  12. [12]

    作者宣布不再参与开发,嘱托社区保护好手上的分支与自身安全

    https://archive.ph/gBO4I
  13. [13]

    电子前沿基金会权威专题报道,记录 Shadowsocks 作者被迫清空仓库与抗审查开源法律背景

    https://www.eff.org/deeplinks/2015/08/speech-enables-speech-china-takes-aim-its-coders
  14. [14]

    Shadowsocks 删库后一周,V2Ray 发布首个提交并记录受 Shadowsocks 关停启发的立项动机

    https://github.com/v2fly/v2ray-core/commit/a4d4c5c234a5d3f2ef1c1955d8f6d8920409a244
  15. [15]

    社区制定的认证加密规范,标志着流加密向 AEAD 的演进

    https://shadowsocks.org/doc/aead.html
  16. [16]

    重构握手与会话独立密钥派生,提供更强的抗重放攻击能力

    https://shadowsocks.org/doc/shadowsocks-2022.html
资料边界与事实声明

本文严格基于公开代码仓库提交记录(shadowsocks/shadowsocks、shadowsocks/shadowsocks-android、shadowsocks/shadowsocks-iOS)、官方技术文档与 Gist、历史网络快照(V2EX、Web Archive)及第三方权威公益组织(电子前沿基金会 EFF)的公开报道。恪守开源社区伦理底线,绝不调查、推测或记录开发者的现实生活、线下单位与地理行踪;对于 2015 年 8 月仓库清空与告别事件,仅客观引述作者本人在提交日志、Issue 留言与社交平台上的公开陈述以及 EFF 的公开调查报道。

修订历史:
  • :基于 Git 真实提交(2012-04-20 创世仓库、2012-12-15 移动端提交 2e0a6fc6、2015-08-22 删库提交 938bba32)、Gist 架构备忘录、V2EX 早期交流、Issue #124 与 EFF 专题报道,重构六幕非虚构小说化叙事与编年大事记。
  • :深度考据 GitHub commit、Issue #124 与 EFF 专题报道,引入 2012 创世宣言、2013 社区愿景与 2015-08-22 删库告别原话。

发现人物信息不准确?

写明需要纠正的内容,可附相关链接。资料会在人工核验后更新。