SOCKS5 (RFC 1928) 是應用層代理協議,支援 TCP 連線轉發、UDP 關聯、多種認證機制、IPv6、域名解析。工作流程分三階段:
+----+----------+----------+
|VER | NMETHODS | METHODS |
+----+----------+----------+
| 1 | 1 | 1-255 |
+----+----------+----------+
VER = 0x05
NMETHODS = 支援的認證方法數量
METHODS = 方法列表
常見值:
0x00 無認證
0x02 用戶名/密碼 (RFC 1929)
0x01 GSSAPI
0x03-0x7F IANA 保留
0x80-0xFE 私有方法
0xFF 無可接受方法
+----+--------+
|VER | METHOD |
+----+--------+
| 1 | 1 |
+----+--------+
選擇一個雙方支援的方法,0xFF 表示協商失敗。
+----+------+----------+------+----------+
|VER | ULEN | UNAME | PLEN | PASSWD |
+----+------+----------+------+----------+
| 1 | 1 | 1-255 | 1 | 1-255 |
+----+------+----------+------+----------+
VER = 0x01 (認證子協議版本,非 SOCKS 版本)
+----+--------+
|VER | STATUS |
+----+--------+
| 1 | 1 |
+----+--------+
STATUS = 0x00 成功,非 0 失敗 (連線關閉)。
+----+-----+-------+------+----------+----------+
|VER | CMD | RSV | ATYP | DST.ADDR | DST.PORT |
+----+-----+-------+------+----------+----------+
| 1 | 1 | 0x00 | 1 | Variable | 2 |
+----+-----+-------+------+----------+----------+
VER = 0x05
CMD = 0x01 CONNECT (TCP 連線)
0x02 BIND (反向連線,如 FTP 主動模式)
0x03 UDP ASSOCIATE
RSV = 0x00 保留
ATYP = 0x01 IPv4 (4 bytes)
= 0x03 域名 (1 byte 長度 + 名稱)
= 0x04 IPv6 (16 bytes)
DST.PORT = 網路序 (大端序)
+----+-----+-------+------+----------+----------+
|VER | REP | RSV | ATYP | BND.ADDR | BND.PORT |
+----+-----+-------+------+----------+----------+
REP 代碼:
0x00 成功
0x01 一般失敗
0x02 規則不允許
0x03 網路不可達
0x04 主機不可達
0x05 連線被拒
0x06 TTL 過期
0x07 命令不支援
0x08 地址類型不支援
0x09-0xFF 未定義
回應 REP=0x00 後,TCP 連線建立,**客戶端與目標主機之間的資料流直接透過代理伺服器透明轉發**,代理不再解析應用層協議。
CMD=0x03,綁定本地 UDP 埠。BND.ADDR/PORT。RSV(2) + FRAG(1) + ATYP + DST.ADDR + DST.PORT + DATA。select/epoll/IOCP 多路複用。RSV 欄位必須為 0x00。htons 轉網路序。FRAG 處理錯誤導致分片重組失敗。