首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> VC 教學

SOCKS5 代理協議深度解析:握手、認證、轉發流程與代碼實現要點

     編輯:VC 教學

協議概覽

SOCKS5 (RFC 1928) 是應用層代理協議,支援 TCP 連線轉發、UDP 關聯、多種認證機制、IPv6、域名解析。工作流程分三階段:

  1. 協商認證方法
  2. 認證 (可選)
  3. 請求轉發 (CONNECT/BIND/UDP ASSOCIATE)

階段 1:協商認證方法

客戶端 → 伺服器

+----+----------+----------+
|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 表示協商失敗。

階段 2:用戶名/密碼認證 (METHOD=0x02)

客戶端 → 伺服器

+----+------+----------+------+----------+
|VER | ULEN | UNAME    | PLEN | PASSWD   |
+----+------+----------+------+----------+
| 1  |  1   | 1-255    |  1   | 1-255    |
+----+------+----------+------+----------+
VER = 0x01 (認證子協議版本,非 SOCKS 版本)

伺服器 → 客戶端

+----+--------+
|VER | STATUS |
+----+--------+
| 1  |   1    |
+----+--------+
STATUS = 0x00 成功,非 0 失敗 (連線關閉)。

階段 3:請求轉發 (CONNECT 範例)

客戶端 → 伺服器

+----+-----+-------+------+----------+----------+
|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 連線建立,**客戶端與目標主機之間的資料流直接透過代理伺服器透明轉發**,代理不再解析應用層協議。

UDP ASSOCIATE (簡述)

  • 客戶端發送 CMD=0x03,綁定本地 UDP 埠。
  • 伺服器回應綁定的 BND.ADDR/PORT。
  • 客戶端向該位址發送 UDP 封包,封包格式:RSV(2) + FRAG(1) + ATYP + DST.ADDR + DST.PORT + DATA。
  • FRAG=0 表示最後一個分片 (SOCKS5 UDP 不分片,固定 0)。

代碼實現關鍵點 (C/C++)

  1. 非阻塞 I/O + 狀態機:每個連線維護狀態 (HANDSHAKE, AUTH, REQUEST, RELAY),使用 select/epoll/IOCP 多路複用。
  2. 緩衝區管理:接收緩衝區累積資料,解析器嘗試解析完整訊息,不足則等待更多資料。
  3. 域名解析策略:ATYP=0x03 時,代理可選擇自行解析 (隱藏客戶端 DNS) 或轉發域名 (由目標端解析)。
  4. 超時控制:握手、認證、連線建立、空閒轉發各階段設定獨立超時。
  5. 安全性:驗證目標埠/位址白名單、限制頻寬、記錄審計日誌。

常見陷阱

  • 忽略 RSV 欄位必須為 0x00。
  • 埠號未用 htons 轉網路序。
  • 域名長度超過 255 或為 0。
  • UDP ASSOCIATE 時 FRAG 處理錯誤導致分片重組失敗。
  • 認證失敗後未正確關閉連線導致資源洩漏。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved