網絡代理:Socks5與Shadowsocks
當前位置:點晴教程→知識管理交流
→『 技術文檔交流 』
1) 應用程序,安裝在用戶終端內的提供某種特定服務的客戶端程序,譬如瀏覽器。 2) 代理客戶端,安裝在用戶終端內的負責監聽和截獲應用程序對網絡資源的訪問,并將收到的請求資源交付給應用程序。 3) 代理服務器,一臺外部主機,負責與目標服務器建立通信連接,在代理客戶端和目標服務器之間轉發用戶數據。 4) 目標服務器,提供特定網絡資源的主機。 我們經常說的SSL VPN的Clientless和Thin-Client模式本質上也是一種網絡代理技術。很多人將網絡代理視為VPN,實際上他們的工作原理并不相同,網絡代理通過代理服務器充當中間人轉發用戶終端和目標服務器之間的數據流量,從而繞過網絡限制訪問那些受限的網絡資源。不僅如此,通過使用緩存機制網絡代理還能用于網絡加速,提高網絡訪問速度,其中一個典型的應用就是基于HTTP代理的網絡加速器。而VPN通常是通過在公共網絡基礎上利用加密/封裝技術構建一個點到點的隧道,用戶通過這條隧道實現對特定資源(大多數是企業內網資源)的訪問,其中一個最為典型的應用是IPSec VPN。 二、Socks5與Shadowsocks
1. Socks5協議 Socks5是Socks協議的第五個版本,在Socks4的基礎上新增UDP轉發和認證功能,是互聯網上最典型的一個網絡代理協議,它的基本工作原理如下圖所示: 圖片來源網絡 1) 首先Socks5客戶端與Socks5服務器TCP三次握手建立一條TCP連接。 2) 然后執行Socks5握手,協商協議版本號、支持的認證方法,對Socks5客戶端進行認證(如果配置了驗證)。 3) Socks5協商和認證成功后,當用戶通過應用程序訪問特定網絡資源時,Socks5客戶端監聽并截獲到應用程序的訪問請求,然后向Socks5服務器發起連接請求。請求的內容包括,應用程序要訪問的目標服務器ip地址或域名和端口等信息。 4) 收到客戶端的連接請求后,Socks5服務器和目標服務器進行TCP三次握手建立TCP連接。然后向Socks5客戶端發送一條Socks5響應消息,通知對方到目標服務器的連接已經建立成功。 5) Socks5客戶端將收到的來自應用程序的數據(可能是應用層的數據,也可能是傳輸層之上的數據,譬如SSL協議報文)通過1)所建立的TCP連接原樣發送給Socks5服務器;Socks5服務器再將數據通過4)建立的TCP連接原樣發送給目標服務器;目標服務器收到應用程序的數據后,反向將響應數據發送給用戶端的應用程序。
通過Socks5的工作過程不難發現,Socks5網絡代理明文原樣轉發應用程序和服務器之間交互的數據,它自身沒有數據加密功能,為了保障傳輸過程中數據的機密性和完整性,通常需要依賴代理的上層應用自身對數據進行加密/完整性校驗等處理。談到這里,想必大家最關心的問題是,通過Socks5能夠繞過網管限制訪問那些受限網絡資源嗎?答案是當然不能。因為Socks5明文傳輸數據,數據內容一目了然,當訪問那些受限網絡資源時,很容易被過濾掉,而且像Socks5/IPSec VPN這類協議協議特性明顯,因為他們的通信報文格式,協商過程等都是明文規范好的很容易識別,在沒有獲得公司網管授權的情況下,通常不會允許這種代理/VPN報文通過。 2. Shadowsocks協議 為了繞過公司網管的網絡限制,訪問那些受限的網絡資源,需要解決網絡代理明文傳輸數據、協議特性明顯等問題,避開公司網管的火眼金睛。因此,有大神就在Socks5的基礎上開發出了大名鼎鼎Shadowsocks協議也就是影梭。 首先看一下Shadowsocks網絡代理結構和組件: 1) Socks5客戶端,安裝在用戶終端內,作為代理客戶端負責監聽和截獲應用程序的訪問請求,與Ss-local執行Socks5握手協商、交互用戶數據。 2) Ss-local,同樣安裝在用戶終端內,沖當Socks5服務器,負責與Socks5客戶端執行握手、用戶數據交互,將用戶數據加密后發送給Ss-server。 3) Ss-server,一臺外部代理服務器,負責與目標服務器建立通信連接,接收Ss-local加密的用戶數據,解密后轉發給目標服務器,同時將收到的目標服務器的響應數據加密后發送給Ss-local。 4) 目標服務器,提供特定網絡資源的主機。 從Shadowsocks代理結構可以看出,Shadowsocks將Socks5服務器功能拆分成兩部分: Ss-local作為Socks5服務器端,負責監聽Socks5 客戶端請求,與Socks5客戶端進行 Socks5 協議相關的握手協商、處理連接請求、接收用戶數據。但它并不將用戶數據直接發送給目標服務器,而是發送給Ss-server。Ss-server作為代理服務器,負責與目標服務器建立通信連接,將用戶數據轉發給目標服務器。 這樣做的好處是,Socks5客戶端和Ss-local都是安裝在用戶終端內,Socks5協議握手協商是在本地完成的,降低了網絡延時,加快Socks5協商過程,并且隱藏了Socks5握手過程中的協議特征。 注:Ss-local和Ss-server之間并不運行Socks5握手協商。 Ss-local與Ss-server之間運行自定義的Shadowsocks協議,它定義了數據傳輸規則、數據加解密算法(AEAD加密/流加密)、預共享密鑰方式的身份驗證、數據混淆插件等,對傳輸的用戶數據進行加密處理,這樣就保證了數據的機密性。同時可以使用數據混淆插件(simple-obfs)對加密后的數據進行混淆去掉流量特征,把Ss-local和Ss-server之間的流量偽裝成普通的TCP或UDP流量。 注:Ss-local與Ss-server之間它們之間并不進行密鑰協商和交換。加密密鑰通過什么算法產生的,本人并沒有深入了解,有興趣的朋友可以查看一些相關文章。 Ss-local發送給Ss-server加密前的數據格式為: target address:目標服務器的IP地址或域名以及端口號,它的格式為:
type:地址類型 1. 0x01: host是一個4-byte的IPV4地址。2. 0x03: host是一個變長字符串。第一個byte是一個變長字符串長度, 接下來是一個最長255byte的域名。 3. 0x04: host是一個IPV6地址。 port:端口號 payload:用戶數據 注:Ss-server發送給Ss-local加密前的數據格式不含target字段。 Ss-local和Ss-server之間傳輸的加密后的數據格式為:
最后我們看一下Shadowsocks的基本工作過程: 1) Socks5客戶端與Ss-local建立TCP連接,進行Socks5握手協商。 2) Socks5客戶端截獲應用程序的網絡訪問請求后,向Ss-local發送連接請求。 3) Ss-local收到客戶端的連接請求后,向Ss-server發起TCP三次握手,建立TCP連接。然后向Socks5客戶端發送一條Socks5響應消息,通知對方連接成功。 4) Socks5客戶端將用戶數據發送給Ss-local,Ss-local對用戶數據進行加密和混淆(可選)處理后,發送給Ss-server。 5) Ss-server解密收到的用戶數據,并根據target字段解析出目標服務器的IP地址/域名以及端口號。然后向目標服務器發起TCP三次握手,建立TCP連接,將用戶數據轉發給目標服務器。目標服務器將響應數據再反向發送給應用程序。
閱讀原文:原文鏈接 該文章在 2025/7/14 18:42:04 編輯過 |
關鍵字查詢
相關文章
正在查詢... |