Shadowsocks

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

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

## 歷史

Shadowsocks最早由V2EX使用者「clowwindy」2012年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的運行原理與其他代理工具基本相同，使用特定的中轉伺服器完成數據傳輸。使用者無法直接訪問受封禁的網站，但代理伺服器可以訪問，且使用者可以直接連接代理伺服器，那麼使用者就可以通過特定軟體連接代理伺服器，然後由代理伺服器獲取網站內容並回傳給使用者，從而實現代理上網的效果。伺服器和客戶端軟體會要求提供密碼和加密方式，雙方一致後才能成功連接。連接到伺服器後，典型情況下客戶端會在本機構建一個本地Socks5代理（或構建成VPN、透明代理等形式）。瀏覽網路時，客戶端通過這個Socks5代理（或其他形式）收集網路流量，然後再經Shadowsocks混淆加密發送到服務端，以防網路流量被識別和攔截，服務端解密數據包，向目標網站發送請求，並以同樣的方式加密網站返回的數據，最後將加密數據轉交回服務端。

### 特點

- Shadowsocks使用自行設計的協議進行加密通信。加密演算法有AES-GCM、ChaCha20-Poly1305、2022-BLAKE3-AES-GCM等，除建立TCP連接外無需握手，每次請求只轉發一個連接，無需保持「一直連線」的狀態，因此在行動裝置上相對較為省電。
- 所有的流量都經過演算法加密，允許自行選擇加密演算法。
- Shadowsocks通過異步I/O和事件驅動程序運行，響應速度快。
- 客戶端覆蓋多個主流作業系統和平台，包括Windows、macOS、iOS、Linux、Android和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日，Xray作者RPRX提出Shadowsocks AEAD加密方式設計存在嚴重漏洞，無法保證通信內容是可靠的，隨後開發者驗證了本地echo自交思路的可行性。3月1日，RPRX又提出可利用服務端防重放機制使Shadowsocks、VMess等未知流量代理實質性失效，隨後討論區中的一個名為gfw-report的使用者驗證了這一思路的可行性。

### 插件

Shadowsocks在SIP003提案中支持了插件，插件讓Shadowsocks的流量可以通過不同的插件進行混淆加密或其他處理。目前使用較多的插件有、https://github.com/shadowsocks/simple-obfs等。

### 實作

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

- https://github.com/shadowsocks/shadowsocks（以Python語言編寫）
- https://github.com/shadowsocks/shadowsocks-libev（C語言編寫，目前僅修復BUG）
- https://github.com/shadowsocks/openwrt-shadowsocks
- https://github.com/shadowsocks/shadowsocks-rust（Rust語言編寫，libev版本停止新功能開發之後的繼任活躍開發版本）
- https://github.com/shadowsocks/go-shadowsocks2
- https://github.com/ginuerzh/gost
- https://github.com/shadowsocks/libQtShadowsocks
- https://github.com/shadowsocks/shadowsocks-qt5（客戶端）
- https://github.com/shadowsocks/shadowsocks-android（客戶端）
- https://github.com/shadowsocks/shadowsocks-windows（客戶端）
- https://github.com/shadowsocks/ShadowsocksX-NG （客戶端）
- ShadowsocksR（Shadowsocks的第三方分支版本）

除此之外，還有許多通用代理軟體與商業軟體。

## 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，並有人在其基礎上繼續發布新的版本，例如較為知名的）。

## 識別

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

自2019年5月以來，中國一直在使用被動流量分析和主動探測相結合的方法來識別Shadowsocks伺服器。其中，防火長城使用長度和熵來識別Shadowsocks流量。研究人員針對主動探測攻擊提出了各種防禦措施，Shadowsocks已經採用了抗探測設計。

## 基本資料

- ver layout：stacked
- 作者： Clowwindy
- 發行日期：python 2012年4月20日