2012–2015 年 · 工具興衰

Shadowsocks(影梭):被刪掉的代碼,刪不掉的梯子

2012 年 4 月 22 日,技術論壇 V2EX 上出現一個不起眼的帖子。發帖人網名 clowwindy,說要分享一個自己「用了一年多」的翻牆小工具,代碼開源,放在 GitHub 上。

沒有發布會,沒有白皮書,甚至沒有一句口號。往後十年裡牆內外攻防的主角,就這樣登場了。它叫 Shadowsocks——中文圈慣稱「SS」,或者,「影梭」。

它解決的是什麼問題

在 Shadowsocks 之前,普通人翻牆主要靠兩類東西:VPN,和 SSH 隧道

它們有同一個致命傷:長相太好認。VPN 協議(PPTP、L2TP、OpenVPN)都有標準的握手流程,就像每次出門都穿同一件印著名字的制服——牆不需要破解你的加密,只要認出制服,掐斷即可。SSH 隧道也一樣,特徵明顯,且一條隧道全程背著所有流量,又慢又脆。

這不是巧合:回推那句「自用一年多」,clowwindy 動筆的 2011 年,正是 SSH 隧道開始被大規模干擾的年份。梯子被掐的人裡,有一個會寫代碼的,決定自己造一把。

clowwindy 的思路是釜底抽薪:不穿制服。Shadowsocks 把代理拆成牆內、牆外兩半,兩半之間只流動加密後的字節——沒有標準握手、沒有協議頭、沒有任何可供指認的招牌,在監控者眼裡只是一段無意義的噪音。牆擅長認臉,它就把臉抹掉。

再加上三個樸素的工程優點——輕(一個小腳本就能跑)、開源(人人可審計、可移植)、易架設(租台海外便宜主機,十分鐘自建一條專屬通道)——結果是深遠的:翻牆從此去中心化了。沒有一家公司可以被約談,沒有一個伺服器集群可以被一鍋端;千千萬萬個小節點散在世界各地,封掉一個,再開一個。

它迅速被移植到各種語言與平台,從路由器到手機。往後幾年,它是中文世界事實上的翻牆標準。

大炮打不動的倉庫

Shadowsocks 的代碼放在 GitHub 上,這件事本身就是一層鎧甲。牆試過咬它:2013 年 1 月 20 日,GFW 用 DNS 污染把 GitHub 整站封掉——中國程序員的工作流一夜癱瘓,李開復在微博抗議「這會讓國內程序員與國際脫軌」,三小時內轉發逾三萬次。三天後,GitHub 解封。牆退了:這個網站上跑著中國整個科技行業的日常,封它的代價付不起。

於是 2015 年 3 月,世界見識了牆的姊妹兵器。境外用戶訪問百度旗下的腳本被半路劫持,一小部分被注入惡意 JavaScript代碼——全世界不知情的用戶們,就這樣被徵用成一支殭屍軍團,朝指定目標齊射。炮口轉向 GitHub,精確瞄準其上的反審查項目頁面——GitHub 遭遇了創站以來最大的 DDoS 攻擊。多倫多大學公民實驗室拆解流量後,給這門武器定了名:大炮(Great Cannon)——不是防火長城的延伸,而是一件獨立的進攻性武器。

但 GitHub 扛住了,也沒有下架任何內容。封不得、打不動。

2015 年 8 月 22 日

然而,警察上門了。

2015 年 8 月 22 日,clowwindy 清空了 GitHub 上的 Shadowsocks 倉庫。在 issue 區,他留下了整個翻牆史上被引用最多的一段話:

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 上的全部代碼。我別無選擇,只能服從。)

倉庫頁面只剩一句「Removed according to regulations」。issue 區湧入成千上萬的網友,點起一排排蠟燭表情。同一個星期,另一個著名翻牆工具 GoAgent 的作者也刪掉了自己的倉庫——那是另一個節點的故事。

電子前哨基金會(EFF)當時的評論一針見血:這是對「使言論成為可能的言論」下手——代碼本身就是一種表達,而中國選擇的執法方式,不是立法禁止工具,而是直接找上寫工具的人。

clowwindy 從此在網上沉寂。沒有審判,沒有罪名,甚至沒有一個正式的禁令——只有一個消失的作者,和一段被刪除的代碼。

作者退場,專案不死

但刪除來得太晚了。代碼是開源的,早已散落在無數的分支與鏡像裡;社群接過維護權,Shadowsocks 組織在其他維護者手中繼續發布新版本。作者被消音之後,這個專案反而長得比以前更大。

牆當然也沒有閒著。往後幾年,雙方在暗處持續過招:牆學會了主動探測——先憑首包猜出「這可能是 Shadowsocks」,再偽裝成用戶向可疑伺服器發出多種試探包,確認後精準封殺。2020 年,研究團隊 GFW Report 在網路測量頂級會議 IMC 發表論文,第一次完整拆解了這套探測機器:七種探測包、數千個探測 IP、背後高度中心化的控制結構。社群則以協議升級回應——修補可被試探的破綻,再往後,乾脆把流量偽裝成最尋常的 HTTPS。那是 V2Ray、Trojan 們的時代,本站會另立節點細講。

一個帖子的開始,一句留言的結束

Shadowsocks 的故事有一個罕見的完整弧線:以論壇上一句「分享個自用的小工具」開始,以「我別無選擇,只能服從」結束。中間隔著三年,和幾千萬個因它而看見完整互聯網的人。

它留下兩筆遺產。技術上,它確立了此後所有翻牆工具的第一設計原則——別讓牆認出你;後來的每一代協議,都是這個原則在新一輪軍備競賽下的變奏。而在技術之外,它留下了一個問題,掛在每一個寫代碼的人頭上:

當一段開源代碼可以讓警察上門,寫代碼這件事,還是不是安全的?

2015 年 8 月的那個星期給出的答案,至今沒有變過。

參考來源