Shadowsocks 作為一個便利的上網工具,極大的方便了 Coder(比如查閱谷歌開發者資料)。Shadowsocks 是一種基於 Socks 5 代理方式的網路資料加密傳輸包,並採用Apache許可證、GPL、MIT許可證等多種自由軟體許可協議開放原始碼。
以下是最初學習理解 Shadowsocks 原理時,翻閱各種資料後記錄下的各項筆記整理出來的部落格。有的地方難免描述不準確,理解也不是很到位,如有錯誤還望指正。
GFW
眾所周知,天朝區域網通過 GFW 隔離了我們與外界的交流,當然,這個隔離並非完全隔離,而是選擇性的,天朝不希望你上的網站就直接阻斷。每個網路請求都是有資料特徵的,不同的協議具備不同的特徵,比如 HTTP/HTTPS 這類請求,會很明確地告訴 GFW 它們要請求哪個域名;再比如 TCP 請求,它只會告訴 GFW 它們要請求哪個 IP。
GFW 封鎖包含多種方式,最容易操作也是最基礎的方式便是域名黑白名單,在黑名單內的域名不讓通過,IP 黑白名單也是這個道理。如果你有一臺國外伺服器不在 GFW 的黑名單內,天朝區域網的機器就可以跟這一臺機器通訊。那麼一個翻牆的方案就出來了:境內裝置與境外機器通訊,境內想看什麼網頁,就告訴境外的機器,讓境外機器代理抓取,然後送回來,我們要做的就是保證境內裝置與境外裝置通訊時不被 GFW 懷疑和竊聽。
ssh tunnel 是比較具有代表性的防竊聽通訊隧道,通過 ssh 與境外伺服器建立一條加密通道,此時的通訊 GFW 會將其視作普通的連線。由於大家都這麼玩,GFW 著急了,於是它通過各種流量特徵分析,漸漸的能夠識別哪些連線是 ssh 隧道,並嘗試性的對隧道做干擾,結果還是玩不過 GFW,眾多隧道紛紛不通。
如果你理解了上面那道隱形的牆的原理,那 Shadowsocks 的原理就可以用一句簡單的描述來理解了:它發出的 TCP 包,沒有明顯包特徵,GFW 分析不出來,當作普通流量放過了。
Shadowsocks 與 Socks 5 比較
Shadowsocks 是基於 Socks 5 協議進行通訊的,所以比較這兩者,可以更好的理解 Shadowsocks 原理
普通 Socks 5 工作原理簡圖
PC 客戶端 ---(1)---> Socks 5 伺服器 ---(2)---> 目標伺服器
複製程式碼
編號說明:
- (1):客戶端發出基於 Socks 5 協議的通訊請求
- (2):Socks 5 伺服器將請求(1)還原為初始請求,再傳送給目標伺服器(說法可能不準確,具體詳見 Socks 5 協議詳解)
Socks 5 客戶端在與 Socks 5 伺服器互動的整個過程是有可能暴露在整個網際網路中的,因此很容易被監控到,根據協議特徵也可以很容易識別出來,若採取普通的Socks 5代理方式的話,若用於翻牆去看外邊的世界,這種方式很容易被牆,代理伺服器的IP極容易被加入黑名單,也就導致此代理的壽終正寢,因此一種新的方式Shadowsocks出現了。
Shadowsocks 工作原理簡圖
如下圖,Shadowsocks 相當於將普通 Socks 5 中的 Socks 5 伺服器拆分成 Client 端(SS-Local)和 Server 端(SS-Server),兩個端分別安裝在境外伺服器和境內裝置上。Client 端和 Server 端之間的通訊通過加密包裝成新的常規 TCP 包,以此增加通訊的隱蔽性,混淆性,讓 GFW 不容易識別,從而不容易被牆。
PC 客戶端 ---(1)---> SS-Local ---(GFW)(2)---> SS-Server ---(3)---> 目標伺服器
複製程式碼
編號說明:
- (1):客戶端發出基於 Socks 5 協議的通訊請求
- (2):將請求(1)的 IP 資料包內容進行加密,包裝為新的 IP 資料包,再傳送給 SS-Server。即請求(2)的內容為請求(1)的密文
- (3):解密請求(2)還原為初始請求,再傳送給目標伺服器
各個節點說明:
PC 客戶端發出請求基於 Socks5 協議跟 SS-Local 端進行通訊,由於這個 SS-Local 一般是本機或路由器等區域網的裝置,並不會經過GFW。
SS-Local 和 SS-Server 兩端通過多種可選的加密方法進行通訊,經過 GFW 的時候因為是常規的 TCP 包,沒有明顯特徵碼 GFW 也無法對通訊資料進行解密,因此通訊放行。
SS-Server 將收到的加密資料進行解密,還原初始請求,再傳送到使用者需要訪問的服務網站,獲取響應後原路返回,返回途中依然使用了加密。因此 GFW 也當做常規的 TCP 包,通訊放行。
SS-Local 和 SS-Server 兩端之間可以通過多種方式加密,並要求提供密碼確保鏈路的安全性。
Socks 5 協議詳解
SOCK5是屬於應用層的協議,因此基於SOCKS 5協議的請求由客戶機到代理機的整個過程如下:
- 將使用者資料新增 SOCKS 5 頭部,發到傳輸層;
- 傳輸層將 SOCKS 5 協議資料分段,新增 TCP/UDP 協議資料發到網路層;
- 網路層將 TCP/UDP 協議資料新增IP協議頭,發往鏈路層;
- 鏈路層新增幀頭與尾,將資料封裝成幀發往代理機。
協議內容(強烈推薦閱讀 Socks 5 協議,全為總共 8 頁,不長。):
- 官方協議:RFC 1928,相關協議包括:RFC 1929,RFC 1961,RFC 3089
- SOCKS v5 協議 (RFC1928) 中文文件
- SOCKS5 協議解析
輔助圖片(來源:Socks for Proxy):
Figure 1a: If the firewall is implemented as an application level gateway, it separates the internal and external networks at application level. However, it then needs a proxy for each protocol.
Figure 1b: In contrast to an ALG, Socks assumes the role of a generic proxy, accepting s connections for any application protocols on port 1080, authenticating clients, and authorizing transfers.
當一個基於TCP協議的客戶端希望與一個只能通過防火牆可以到達的目標(這是由實現所決定的)建立連線,它必須先建立一個與SOCKS伺服器上SOCKS埠的TCP連線。通常這個TCP埠是1080。當連線建立後,客戶端進入協議的“握手(negotiation)”過程
Figure 2: When establishing a Socks v5 connection, the client starts by sending a negotiation packet to the Socks proxy (1). The client authenticates (3); the proxy then establishes the connection to the target server (6) and forwards data (8).
翻譯:
- authentication protocol:驗證協議
- establishing:建立
- negotiation:協商
Figure 3: Socks version 5 uses five packet types: Client Negotiation, Server Negotiation, Client Request, Server Reply, and UDP Request. The fields specify the name and size. Table 1 describes the contents.
Figure 4: In a UDP scenario, the client first uses TCP to connect to the Socks proxy. The Client Request (4) contains a UDP Associate command, in which the client tells the proxy from where it will be sending UDP packets.
翻譯:
- scenario:方案
相對於 VPN,Shadowsocks 的優點
- 智慧代理:一般情況下,VPN是全域性代理,所有流量都走VPN通道;這使得訪問國內網站時也要繞道境外,嚴重影響訪問速度。相比之下,Shadowsocks非常方便地支援了智慧代理,國內和境外未被牆的網站都是直連,只有極少數被牆的網站才啟用代理。
- 斷線無需重連:在WiFi 或者4G網路不穩定的情況下,VPN每次斷線都得重連,真是難以忍受。相比之下,Shadowsocks除了建立TCP連線以外,其它時候都無需與伺服器握手(詳細見Socks5 協議說明),尤其適合在不穩定的網路環境下使用。
其他加速代理百科
虛擬專用網路的功能是:在公用網路上建立專用網路,進行加密通訊。在企業網路中有廣泛應用。VPN閘道器通過對資料包的加密和資料包目標地址的轉換實現遠端訪問。VPN有多種分類方式,主要是按協議進行分類。VPN可通過伺服器、硬體、軟體等多種方式實現。
其他相關解說
自行閱讀
參考資料
版本
- 2018-12-04:初稿
- 2018-12-20:Socks v5 協議輔助記憶流程圖追加
宣告
限於作者水平有限(包括語言表達),出錯難免,請積極拍磚! 歡迎任何形式的轉載,轉載請保留本文原文連結:juejin.im/post/5c065b…
結言
花了一段時間,把之前 Shadowsocks 的筆記給捋了一遍,整理成這篇部落格,以後如果有更深入的理解,或更好的表達,將進行不定時更新。