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 NULL
1 1 2 4 variable 1
  • VN是SOCK版本,應該是4;
  • CD是SOCK的命令碼,1表示CONNECT請求,2表示BIND請求;
  • DSTPORT表示目的主機的埠;
  • DSTIP指目的主機的IP位址
  • NULL是0;

代理伺服器而後傳送回應包(以位元組為單位):

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以緊跟的NULL位元組作結尾,客戶端必須傳送目的主機的域名,並以另一個NULL位元組作結尾。CONNECT和BIND請求的時候,都要按照這種格式(以位元組為單位):

VN CD DSTPORT DSTIP 0.0.0.x USERID NULL HOSTNAME NULL
1 1 2 4 variable 1 variable 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位元組。當前的定義是:
  • 0x00 不需要認證
  • 0x01 GSSAPI英語Generic Security Services Application Program Interface
  • 0x02 用戶名、密碼認證
  • 0x03 - 0x7F由IANA分配(保留)
    • 0x03: 握手挑戰認證協定
    • 0x04: 未分派
    • 0x05: 響應挑戰認證方法
    • 0x06: 傳輸層安全
    • 0x07: NDS認證
    • 0x08: 多認證框架
    • 0x09: JSON參數塊
    • 0x0A–0x7F: 未分派
  • 0x80 - 0xFE為私人方法保留
  • 0xFF 無可接受的方法

伺服器從客戶端提供的方法中選擇一個並通過以下訊息通知客戶端(以位元組為單位):

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伺服器軟件:

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

註釋 編輯

參考文獻 編輯

參見 編輯

外部連結 編輯