Shadowsocks

**Shadowsocks**（簡稱 **SS**）是一種基於 Socks5 代理方式的加密傳輸協定，也可以指實現這個協定的各種開發包。目前套件使用 Python、C、C++、C#、Go 語言、Rust 等程式語言開發，大部分主要實現（iOS 平台的除外）採用 Apache 許可證、GPL、MIT 許可證等多種自由軟體許可協定開放原始碼。Shadowsocks 分為伺服器端和用戶端，在使用之前，需要先將伺服器端程式部署到伺服器上面，然後通過用戶端連接並建立本地代理。

在中國大陸，本工具廣泛用於突破防火長城（GFW），以瀏覽被封鎖、遮蔽或干擾的內容。2015 年 8 月 22 日，Shadowsocks 原作者 Clowwindy 稱受到了中國警方的壓力，宣布停止維護此計劃（專案）並移除其個人頁面所儲存的原始碼。

為了避免關鍵詞過濾，網友會根據諧音將 ShadowsocksR 稱為「酸酸乳」（SSR），將 Shadowsocks 稱為「酸酸」（SS）。另外，因為 Shadowsocks (R) 的圖示均為紙飛機，所以專門提供 Shadowsocks (R) 或類似服務（如 V2Ray 和 TROJAN）的網站則就被稱為了「機場」。

## 歷史

Shadowsocks 最早由 V2EX 使用者「clowwindy」2013 年 4 月發布在該論壇。

### 專案轉手

2015 年 8 月 22 日，其作者 Clowwindy 在 GitHub 上稱，警察在兩日前要求他停止開發 Shadowsocks 專案並刪除其所有代碼。之後，作者停止維護 Shadowsocks，其 GitHub 專案頁面已被清空。消息傳出後，許多中國大陸和外國開發商，以及 Shadowsocks 使用者，在 GitHub 中對作者表示了致謝，對已清空原始碼的專案頁面加星標，因此在當時 Shadowsocks 反而成為了 GitHub 上的「熱門專案（Trending）」。本以為是當局主動出擊，但另有消息據稱，原作者曾作出的「透露中國社會現狀」的發言可能遭到某些中華人民共和國政府支持者的檢舉，從而為後來被要求撤下專案原始碼的事件埋下伏筆，而類似的因個人網路發言而被檢舉的事件在中國大陸也「時有發生」。

8 月 25 日，另一個用於突破網路審查的 GoAgent 專案也被作者自行刪除。刪除後幾小時之內，GitHub 遭到了來自中國大陸的 DDoS 攻擊。據報這次攻擊與中華人民共和國政府有關，因為中國政府此前曾要求 GitHub 移除兩個對抗網路審查的項目但沒有被接受。

2015 年 8 月 28 日，電子前哨基金會針對 Shadowsocks 和 GoAgent 被刪除一事發表評論，對中華人民共和國政府針對翻牆軟體作者的打擊表示「強烈譴責」。

Git 倉庫的日誌顯示該項目被移除以前就有大量的復刻副本，不少副本仍然有使用者維護。所以儘管 Shadowsocks 專案頁經過此次打擊，也陸續恢復了內容，甚至本身並轉交由多人維護成不同版本，各大 Linux 套件的軟體倉庫均有各式 Shadowsocks 的實作的套件仍持續更新可用，目前的 Shadowsocks 更新基本上來自這些作者執行。

## 執行原理

Shadowsocks 的執行原理與其他代理工具基本相同，使用特定的中轉伺服器完成資料傳輸。例如，使用者無法直接存取 Google，但代理伺服器可以存取，且使用者可以直接連接代理伺服器，那麼使用者就可以通過特定軟體連接代理伺服器，然後由代理伺服器取得網站內容並回傳給使用者，從而實現代理上網的效果。伺服器和用戶端軟體會要求提供密碼和加密方式，雙方一致後才能成功連接。連接到伺服器後，用戶端會在本機構建一個本地 Socks5 代理（或 VPN、透明代理等）。瀏覽網路時，用戶端通過這個 Socks5（或其他形式）代理收集網路流量，然後再經混淆加密傳送到伺服器端，以防網路流量被辨識和攔截，反之亦然。

### 特點

* Shadowsocks 使用自行設計的協定進行加密通信。加密演算法有 AES-GCM、ChaCha20-Poly1305、2022-BLAKE3-AES-GCM 等，除建立 TCP 連接外無需握手，每次請求只轉發一個連接，無需保持「一直連線」的狀態，因此在行動裝置上相對較為省電。
* 所有的流量都經過演算法加密，允許自行選擇演算法。
* Shadowsocks 通過非同步 I/O 和事件驅動程式執行，回應速度快。
* 用戶端覆蓋多個主流作業系統和平台，包括 Windows、macOS、Android、Linux 和 iOS 系統和路由器（OpenWrt）等。

### 安全性

Clowwindy 稱 Shadowsocks 的最初只是「自用」，用來「翻牆」，而不是提供密碼學意義的安全，所以 Shadowsocks 自行設計的加密協定對雙方的身分驗證僅限於預共享金鑰，亦無完全前向保密，也未曾有安全專家公開分析或評估協定及其實現。

> 一個用 Python 寫的 socks 加密代理。加密方法很簡單，不過欺騙 GFW 足夠了。
> 
> 

Shadowsocks 的目標不在於提供完整的通信安全機制，主要是為了協助上網使用者在嚴苛的網路環境中突破封鎖，不能替代 TLS 或者 VPN。

AEAD 加密方式（AES-GCM、Chacha20-poly1305）在 SIP004 提案提出並在 SIP007 提案實現，這些加密方式被認為可以提供密碼學意義的安全（「保密性，完整性，可用性」），之前 AES CFB、AES CTR、RC4、Chacha20 等沒有認證的加密方式仍在一部分實現中被允許存在。Shadowsocks-windows 已經移除了非 AEAD 加密方式的支援。

Shadowsocks 多次被提到協定設計問題，有被主動探測的風險：

* 2015 年，ShadowsocksR 的原開發者 breakwa11 提到原協定設計導致沒有驗證封包完整性而被主動探測的風險，之後 Shadowsocks 的後繼開發者 madeye 引入 One Time Auth（OTA）方案試圖解決，但 breakwa11 指出還是不能避免主動探測風險，最終引入 AEAD 加密方式並放棄 OTA 方案。
* 2021 年 2 月 28 日，GitHub 使用者 RPRX 提出 Shadowsocks AEAD 加密方式設計存在嚴重漏洞，無法保證通信內容的可靠性，隨後開發者驗證了本地 echo 自交思路的可行性。3 月 1 日，RPRX 又提出可利用伺服器端防重放機制使 Shadowsocks、Vmess 等未知流量代理實質性失效，隨後 gfw-report（討論串下的一個使用者）驗證了這一思路的可行性。

### 外掛程式及流量混淆

2017 年 9 月 21 日，一篇名為《The Random Forest based Detection of Shadowsock's Traffic》的論文在 IEEE 發表，該論文介紹了通過隨機森林演算法檢測 Shadowsocks 流量的方法，並自稱可達到 85％的檢測精度，雖然該論文的有效性遭到網友質疑。但是使用機器學習來識別網路流量特徵的做法被認為是可行的，而且還適用於任何網路代理協定而不僅僅侷限於 Shadowsocks。

Shadowsocks 在 SIP003 提案中支援了外掛程式，外掛程式讓 Shadowsocks 的流量可以通過不同的外掛程式進行混淆加密或其他處理。目前使用較多的外掛程式有 v2ray-plugin、simple-obfs 等。

### 實作

目前 Shadowsocks 有多個實作支援，以自由軟體形式發佈的主要有

* 原始 Shadowsocks（以 Python 語言編寫）
* Shadowsocks-libev
* openwrt-Shadowsocks
* Shadowsocks-rust
* go-shadowsocks2
* gost
* libQtShadowsocks
* Shadowsocks-qt5（用戶端）
* Shadowsocks-android（用戶端）
* Shadowsocks-windows（用戶端）
* ShadowsocksX-NG （用戶端）
* ShadowsocksR
* Outline
* V2Ray
* Brook
* Trojan
* Clash

等等，還有為數甚多的免費軟體及商業軟體。

## ShadowsocksR

ShadowsocksR（簡稱 SSR）是網名為 breakwa11 的使用者發起的 Shadowsocks 分支，在 Shadowsocks 的基礎上增加了一些資料混淆方式，稱修復了部分安全問題並可以提高 QoS 優先級。後來貢獻者 Librehat 也為 Shadowsocks 補上了一些此類特性，甚至增加了類似 Tor 的可插拔傳輸層功能。

ShadowsocksR 開始時曾有過違反 GPL、發放二進位時不發放原始碼的爭議，使得原開發作者不滿。不過後來 ShadowsocksR 專案由 breakwa11 轉為了與 Shadowsocks 相同的 GPL、Apache 許可證、MIT 許可證等多重自由軟體許可協議。

2017 年 7 月 19 日，ShadowsocksR 作者 breakwa11 在 Telegram 頻道 ShadowsocksR news 裡轉發了深圳市啟用 SS 協定檢測的訊息並被大量使用者轉發，引發恐慌。7 月 24 日，breakwa11 發布了閉源的 SS 被動檢測程式，引發爭議。7 月 27 日，breakwa11 遭到自稱「ESU.TV」（惡俗 TV）的不明身分人士人身攻擊，對方宣稱如果不停止開發並阻止使用者討論此事件將發布更多包含個人隱私的資料，隨後 breakwa11 表示遭到對方人肉搜尋並公開個人資料的是無關人士，為了防止對方繼續傷害無關人士，breakwa11 將刪除 GitHub 上的所有代碼、解散相關交流群組，停止 ShadowsocksR 專案。但專案已被多人 fork，並有人在其基礎上繼續發布新的版本，例如較為知名的 SSRR（ShadowsocksRR）。

## 參考資料

## 註解

## 外部連結

* 官方網站