SOCKS
SOCKS是一種網路傳輸協定,名字取自SOCKetS[註 1],主要用於客戶端與外網伺服器之間通訊的中間傳遞。
當防火牆後的客戶端要訪問外部的伺服器時,就跟SOCKS代理伺服器連接。這個代理伺服器控制客戶端訪問外網的資格,允許的話,就將客戶端的請求發往外部的伺服器。
這個協定最初由David Koblas開發,而後由NEC的Ying-Da Lee將其擴充到SOCKS4。最新協定是SOCKS5,與前一版本相比,增加支援UDP、驗證,以及IPv6。
根據OSI模型,SOCKS是對談層的協定,位於表示層與傳輸層之間。
SOCKS協定不提供加密。
與HTTP代理的對比
編輯SOCKS工作在比HTTP代理更低的層次:SOCKS使用握手協定來通知代理軟體其客戶端試圖進行的SOCKS連接,然後儘可能透明地進行操作,而常規代理可能會解釋和重寫報頭(例如,使用另一種底層協定,例如FTP;然而,HTTP代理只是將HTTP請求轉發到所需的HTTP伺服器)。雖然HTTP代理有不同的使用模式,HTTP CONNECT方法允許轉發TCP連接;然而,SOCKS代理還可以轉發UDP流量(僅SOCKS5),而HTTP代理不能。HTTP代理通常更了解HTTP協定,執行更高層次的過濾(雖然通常只用於GET和POST方法,而不用於CONNECT方法)。
版本分支
編輯SOCKS 4
編輯下面是客戶端向SOCKS 4代理伺服器,傳送的連接請求包的格式(以位元組為單位):
VN | CD | DSTPORT | DSTIP | USERID |
---|---|---|---|---|
1 | 1 | 2 | 4 | 可變長度 |
- VN是SOCK版本,應該是4;
- CD是SOCK的命令碼,1表示CONNECT請求,2表示BIND請求;
- DSTPORT表示目的主機的埠;
- DSTIP指目的主機的IP位址;
- USERID表示使用者標識ID,結尾值為0(NULL);
代理伺服器而後傳送回應包(以位元組為單位):
VN | CD | DSTPORT | DSTIP |
---|---|---|---|
1 | 1 | 2 | 4 |
- VN是回應碼的版本,應該是0;
- CD是代理伺服器答覆,有幾種可能:
- 90,請求得到允許;
- 91,請求被拒絕或失敗;
- 92,由於SOCKS伺服器無法連接到客戶端的identd(一個驗證身分的行程),請求被拒絕;
- 93,由於客戶端程式與identd報告的使用者身分不同,連接被拒絕。
- DSTPORT與DSTIP與請求包中的內容相同,但被忽略。
如果請求被拒絕,SOCKS伺服器馬上與客戶端斷開連接;如果請求被允許,代理伺服器就充當客戶端與目的主機之間進行雙向傳遞,對客戶端而言,就如同直接在與目的主機相連。
SOCKS4a
編輯SOCKS 4A是SOCKS 4協定的簡單擴充,允許客戶端對無法解析域名的目的主機進行存取。
客戶端對DSTIP的頭三個位元組設定為NULL,最後一個位元組為非零;對應的IP位址就是0.0.0.x,其中x是非零,這當然不可能是目的主機的位址,這樣即使客戶端可以解析域名,對此也不會發生衝突。USERID以緊跟的1位元組的0(NULL)作結尾,客戶端必須傳送目的主機的域名,並以另一個1位元組的0(NULL)作結尾。CONNECT和BIND請求的時候,都要按照這種格式(以位元組為單位):
VN | CD | DSTPORT | DSTIP 0.0.0.x | USERID | NULL | HOSTNAME | NULL |
---|---|---|---|---|---|---|---|
1 | 1 | 2 | 4 | 可變長度 | 1 | 可變長度 | 1 |
使用4a協定的伺服器必須檢查請求包里的DSTIP欄位,如果表示位址0.0.0.x,x是非零結尾,那麼伺服器就得讀取客戶端所發包中的域名欄位,然後伺服器就得解析這個域名,可以的話,對目的主機進行連接。
SOCKS5
編輯SOCKS5比SOCKS4a多了驗證、IPv6、UDP支援。建立與SOCKS5伺服器的TCP連接後客戶端需要先傳送請求來確認協定版本及認證方式,格式為(以位元組為單位):
VER | NMETHODS | METHODS |
---|---|---|
1 | 1 | 1-255 |
- VER是SOCKS版本,這裡應該是0x05;
- NMETHODS是METHODS部分的長度;
- METHODS是客戶端支援的認證方式列表,每個方法占1位元組。當前的定義是:
伺服器從客戶端提供的方法中選擇一個並通過以下訊息通知客戶端(以位元組為單位):
VER | METHOD |
---|---|
1 | 1 |
- VER是SOCKS版本,這裡應該是0x05;
- METHOD是伺服器端選中的方法。如果返回0xFF表示沒有一個認證方法被選中,客戶端需要關閉連接。
之後客戶端和伺服器端根據選定的認證方式執行對應的認證。
認證結束後客戶端就可以傳送請求資訊。如果認證方法有特殊封裝要求,請求必須按照方法所定義的方式進行封裝。
SOCKS5請求格式(以位元組為單位):
VER | CMD | RSV | ATYP | DST.ADDR | DST.PORT |
---|---|---|---|---|---|
1 | 1 | 0x00 | 1 | 動態 | 2 |
- VER是SOCKS版本,這裡應該是0x05;
- CMD是SOCK的命令碼:
- 0x01表示CONNECT請求
- 0x02表示BIND請求
- 0x03表示UDP轉發
- RSV為保留欄位,值為0x00;
- ATYP為DST.ADDR類型:
- 0x01 IPv4位址,DST.ADDR部分4位元組長度
- 0x03 域名,DST.ADDR部分的第一個位元組為域名長度,DST.ADDR剩餘的內容為域名,沒有\0結尾。
- 0x04 IPv6位址,16個位元組長度。
- DST.ADDR為目的位址;
- DST.PORT為網路位元組序表示的目的埠。
伺服器按以下格式回應客戶端的請求(以位元組為單位):
VER | REP | RSV | ATYP | BND.ADDR | BND.PORT |
---|---|---|---|---|---|
1 | 1 | 0x00 | 1 | 動態 | 2 |
- VER是SOCKS版本,這裡應該是0x05;
- REP為應答欄位:
- 0x00表示成功;
- 0x01為普通的SOCKS伺服器連接失敗
- 0x02為現有規則不允許連接
- 0x03為網路不可達
- 0x04為主機不可達
- 0x05為連接被拒
- 0x06為TTL逾時
- 0x07為不支援的命令
- 0x08為不支援的位址類型
- 0x09 - 0xFF未定義
- RSV為保留欄位,值為0x00;
- ATYP為BND.ADDR類型:
- 0x01 IPv4位址,DST.ADDR部分4位元組長度
- 0x03域名,DST.ADDR部分第一個位元組為域名長度,DST.ADDR剩餘的內容為域名,沒有\0結尾。
- 0x04 IPv6位址,16個位元組長度。
- BND.ADDR為伺服器繫結的位址
- BND.PORT為網路位元組序表示的伺服器繫結的埠
SOCKS5 使用者名稱密碼認證方式
編輯在客戶端、伺服器端協商使用使用者名稱密碼認證後,客戶端發出使用者名稱密碼,格式為(以位元組為單位):
鑑定協定版本 | 使用者名稱長度 | 使用者名稱 | 密碼長度 | 密碼 |
---|---|---|---|---|
1 | 1 | 動態 | 1 | 動態 |
鑑定協定版本目前為 0x01 。
伺服器鑑定後發出如下回應:
鑑定協定版本 | 鑑定狀態 |
---|---|
1 | 1 |
其中鑑定狀態 0x00 表示成功,0x01 表示失敗。
SOCKS伺服器
編輯部分SOCKS伺服器軟體:
- Dante Socks Server,http://www.inet.no/dante (頁面存檔備份,存於網際網路檔案館)
- Java Socks Server,http://jsocks.sourceforge.net (頁面存檔備份,存於網際網路檔案館)
- Socks4 Server,https://archive.today/20130502024508/ http://www.alhem.net/project/socks4 Archive.is的存檔,存檔日期2013-05-02
- SS5 Socks Server,http://ss5.sourceforge.net (頁面存檔備份,存於網際網路檔案館)
- TcpToute2,https://github.com/GameXG/TcpRoute2 (頁面存檔備份,存於網際網路檔案館)
- CCProxy,https://www.youngzsoft.net/ccproxy/ (頁面存檔備份,存於網際網路檔案館)
SOCKS客戶端
編輯一般情況下應用程式會內嵌對SOCKS協定的支援。但socksify,proxifier軟體可強制使不支援SOCKS的應用通過代理聯網。
客戶端 | 許可證 | 版本 | 發布日期 | 平台 | 支援協定 |
Dante client(頁面存檔備份,存於網際網路檔案館) | BSD/CMU | 1.1.18 | 09/2005 | Linux | v4, v5 |
FreeCap(頁面存檔備份,存於網際網路檔案館) | GPL | 3.18 | 02/2005 | Windows | - |
Hummingbird socks(頁面存檔備份,存於網際網路檔案館) | - | - | - | Windows | - |
ProxyCap(頁面存檔備份,存於網際網路檔案館) | - | 2.03 | - | Windows | - |
SocksCap | Non-Comercial home use | - | - | - | v5 |
Super Socks5Cap(頁面存檔備份,存於網際網路檔案館) | - | 1.5.3 | - | Windows | - |
tsocks(頁面存檔備份,存於網際網路檔案館) | GPL | 1.8 | 10/2002 | - | - |
nylon | - | - | 06/2003 | OpenBSD | - |
Win2Socks(頁面存檔備份,存於網際網路檔案館) | - | 2.7.0 | 06/2022 | Windows | v5 |
proxifier(頁面存檔備份,存於網際網路檔案館) | - | 3.4.2 | 08/2019 | Windows,Mac | v4,v5 |
SocksCap | - | - | - | Windows | v4,v5 |
tun2socks(頁面存檔備份,存於網際網路檔案館) | BSD-Clause | 1.0.0.2 | 09/2021 | Windows | v5 |
注釋
編輯參考文獻
編輯參見
編輯外部連結
編輯- RFC 3089 - A SOCKS-based IPv6/IPv4 Gateway Mechanism
- RFC 1961 - GSS-API Authentication Method for SOCKS Version 5
- RFC 1929 - Username/Password Authentication for SOCKS V5
- RFC 1928 - SOCKS Protocol Version 5
- Ying-Da Lee,SOCKS 4A: A Simple Extension to SOCKS 4 Protocol(SOCKS 4A:SOCKS 4協定的一個簡單擴充)
- Michel Arboi,Vulnerability - Too long hostname kills the SOCKS4A server(頁面存檔備份,存於網際網路檔案館)(易受攻擊性:域名過長導致SOCKS4A伺服器當機)
- SOCKS: A protocol for TCP proxy across firewalls, SOCKS Protocol Version 4 (NEC)(頁面存檔備份,存於網際網路檔案館) SOCKS:一個用於穿越防火牆的TCP代理協定,SOCKS協定版本4(NEC)