SOCKS

**SOCKS** 是一種網路傳輸協定，為 Socket Secure 的縮寫，主要用於客戶端與外網伺服器之間通訊的中間傳遞。

當防火牆後的客戶端要存取外部的伺服器時，就跟 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 是 SOCK 版本，應該是 4；
* CD 是 SOCK 的命令碼，1 表示 CONNECT 請求，2 表示 BIND 請求；
* DSTPORT 表示目的主機的埠；
* DSTIP 指目的主機的 IP 位址；
* NULL 是 0；

代理伺服器而後傳送回應包（以位元組為單位）：

* 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 請求的時候，都要按照這種格式（以位元組為單位）：

使用 4a 協定的伺服器必須檢查請求包里的 DSTIP 欄位，如果表示位址 0.0.0.x，x 是非零結尾，那麼伺服器就得讀取客戶端所發包中的域名欄位，然後伺服器就得解析這個域名，可以的話，對目的主機進行連接。

### SOCKS5

SOCKS5 比 SOCKS4a 多了驗證、IPv6、UDP 支援。建立與 SOCKS5 伺服器的 TCP 連接後客戶端需要先傳送請求來確認協定版本及認證方式，格式為（以位元組為單位）：

* VER 是 SOCKS 版本，這裡應該是 0x05；
* NMETHODS 是 METHODS 部分的長度；
* METHODS 是客戶端支援的認證方式列表，每個方法占 1 位元組。當前的定義是：

　
: * 0x00 不需要認證
* 0x01 GSSAPI
* 0x02 使用者名稱、密碼認證
* 0x03 - 0x7F 由 IANA 分配（保留）
  * 0x03: 握手挑戰認證協定
  * 0x04: 未分派
  * 0x05: 回應挑戰認證方法
  * 0x06: 傳輸層安全
  * 0x07: NDS 認證
  * 0x08: 多認證框架
  * 0x09: JSON 參數塊
  * 0x0A–0x7F: 未分派
* 0x80 - 0xFE 為私人方法保留
* 0xFF 無可接受的方法

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

* VER 是 SOCKS 版本，這裡應該是 0x05；
* METHOD 是伺服器端選中的方法。如果返回 0xFF 表示沒有一個認證方法被選中，客戶端需要關閉連接。

之後客戶端和伺服器端根據選定的認證方式執行對應的認證。

認證結束後客戶端就可以傳送請求資訊。如果認證方法有特殊封裝要求，請求必須按照方法所定義的方式進行封裝。

SOCKS5 請求格式（以位元組為單位）：

* 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 是 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 使用者名稱密碼認證方式

在客戶端、伺服器端協商使用使用者名稱密碼認證後，客戶端發出使用者名稱密碼，格式為（以位元組為單位）：

 
鑑定協定版本目前為 0x01 。

伺服器鑑定後發出如下回應：

其中鑑定狀態 0x00 表示成功，0x01 表示失敗。

## SOCKS 伺服器

部分 SOCKS 伺服器軟體：

* Dante Socks Server，http://www.inet.no/dante （頁面存檔備份，存於網際網路檔案館）
* Java Socks Server，http://jsocks.sourceforge.net （頁面存檔備份，存於網際網路檔案館）
* Socks4 Server，https://archive.is/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 的應用通過代理聯網。

## 注釋

## 參考文獻

## 參見

* SocksCap
* Shadowsocks

## 外部連結

* 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）