0%

SOCKS5 代理协议详解

SOCKS5 代理协议详解

SOCKS5 是一种网络代理协议,是 SOCKS 协议的第五个版本, 它不仅支持传统的 TCP 连接,还增加了对 UDP 和多种认证方法的支持。SOCKS5 工作在 OSI 模型的会话层,广泛用于突破网络限制、隐藏客户端真实 IP 等场景。本文深入解析其协议字段、工作模式及认证机制。


协议基础

  • 协议版本SOCKS5(版本号 0x05

  • 核心功能

    • 转发 TCP/UDP 流量
    • 支持 IPv4/IPv6/域名
    • 多种认证方式
      方法值(HEX) 认证方法 说明
      0x00 无认证 默认方法,无需额外步骤
      0x01 GSSAPI 基于 Kerberos 等安全协议
      0x02 Username/Password 用户名密码认证
      0x03-0x7F IANA 分配 预留标准方法
      0x80-0xFE 私有方法 厂商自定义认证
  • 端口:默认 1080


SOCKS5 协议工作流程

SOCKS5 协议的基本工作流程可以分为以下几个步骤:

  1. 客户端连接 SOCKS5 代理服务器
    客户端与代理服务器建立 TCP 连接。

  2. 客户端进行认证(如果需要的话)
    客户端发送支持的认证方式,代理服务器选择合适的认证方法。

  3. 客户端发起请求
    客户端向代理服务器发起 CONNECTBINDUDP 转发请求。

  4. 代理服务器处理请求并返回响应
    代理服务器处理请求并返回结果。如果请求成功,数据转发开始。


协议字段详解

1. 认证方法协商

客户端 → 代理服务器

字段 长度(字节) 值(示例) 说明
VER 1 0x05 SOCKS5 版本
NMETHODS 1 0x02 支持的认证方法数量
METHODS 可变 0x00, 0x02 方法列表

代理服务器 → 客户端

字段 长度(字节) 值(示例) 说明
VER 1 0x05 SOCKS5 版本
METHOD 1 0x02 选择的认证方法

认证流程时序(用户名/密码认证举例)

1
2
3
4
5
客户端               代理服务器
|--- METHOD Negotiation -->|
|<-- Chosen Method --------|
|--- Username/Password --->| (仅当 METHOD=0x02 时)
|<-- Auth Result ----------|

2. 请求/响应格式

客户端请求(以 CONNECT 为例)

字段 长度(字节) 值(示例) 说明
VER 1 0x05 SOCKS5 版本
CMD 1 0x01 命令(CONNECT
RSV 1 0x00 保留字段
ATYP 1 0x01 地址类型(IPv4)
DST.ADDR 4 0xC0A80101 目标地址(192.168.1.1)
DST.PORT 2 0x0050 目标端口(80)
  1. 地址类型(ATYP)
    • 0x01:IPv4(4 字节地址)。
    • 0x03:域名(1 字节长度 + 变长域名,如 0x07 "example.com")。
    • 0x04:IPv6(16 字节地址)。
  2. 端口字节序
    • 所有端口号均为 大端字节序(如 53 → 0x0035)。

代理服务器响应

字段 长度(字节) 值(示例) 说明
VER 1 0x05 SOCKS5 版本
REP 1 0x00 响应状态(成功)
RSV 1 0x00 保留字段
ATYP 1 0x01 地址类型(IPv4)
BND.ADDR 4 0x00000000 绑定地址
BND.PORT 2 0x0000 绑定端口

工作模式

CONNECT 模式

  • 用途:客户端正向连接目标服务器(如 HTTP/HTTPS)。
  • 流程
    1. 客户端发送 CONNECT 请求

      协议字段:

      字段 长度(字节) 值(示例) 说明
      VER 1 0x05 SOCKS5 版本
      CMD 1 0x01 命令类型:CONNECT
      RSV 1 0x00 保留字段
      ATYP 1 0x01 地址类型:IPv4 (0x01)、IPv6 (0x04)、域名 (0x03)
      ADDR 可变 0xC0A80101 目标地址(如 192.168.1.1)
      PORT 2 0x0050 目标端口(80,HTTP 默认端口,大端字节序)
    2. 代理建立与目标服务器的 TCP 连接

    3. 代理返回响应,开始转发数据
      协议字段:

      字段 长度(字节) 值(示例) 说明
      VER 1 0x05 SOCKS5 版本
      REP 1 0x00 响应状态码(如 0x00 表示成功)
      RSV 1 0x00 保留字段
      ATYP 1 0x01 地址类型:IPv4
      BND.ADDR 4 0x0A0A0A0A 代理出口IP(代理服务器与目标服务器建立连接的本地地址)
      BND.PORT 2 0xD204 代理出口端口(53764,大端字节序)
1
2
3
4
5
客户端               代理服务器              目标服务器
|--- CONNECT 请求 --->| |
| |--- 连接目标服务器 --->|
|<------- 响应 -------| |
|==================== 数据转发 ===============>|

BIND 模式

  • 用途:允许目标服务器反向连接客户端(如 FTP 主动模式)。

  • 流程

    1. 客户端发起 BIND 请求

      • 客户端向 SOCKS5 代理发送 BIND 命令,通常伴随一个目标地址(如 FTP 服务器的 IP)。
      • 例如:BIND 请求 -> 代理服务器:1080

      协议字段如下:

      字段 长度(字节) 值(示例) 说明
      VER 1 0x05 SOCKS5 版本
      CMD 1 0x02 命令类型:BIND
      RSV 1 0x00 保留字段
      ATYP 1 0x01 地址类型:IPv4 (0x01)、IPv6 (0x04)、域名 (0x03)
      ADDR 可变 0xC0A80101 目标服务器的地址(如 FTP 服务器的 IP:192.168.1.1)
      PORT 2 0x001F 目标服务器的端口(如 31 → 大端字节序)
    2. 代理服务器监听端口

      • 代理服务器在某个端口(如 8080)上开始监听,准备接受目标服务器的连接。
      • 返回 第一次响应 给客户端,告知监听的地址和端口(如 IP:代理服务器, Port:8080)。
      字段 长度(字节) 值(示例) 说明
      VER 1 0x05 SOCKS5 版本
      REP 1 0x00 响应状态码:成功 (0x00)
      RSV 1 0x00 保留字段
      ATYP 1 0x01 地址类型:IPv4
      BND.ADDR 4 0x0A0A0A0A 代理服务器监听的 IP(如 10.10.10.10)
      BND.PORT 2 0x1F90 代理服务器监听的端口(8080,大端字节序)

      附加说明:

      BND.ADDRBND.PORT 是代理服务器监听的地址和端口,客户端需要将此信息告知目标服务器(如 FTP 服务器的数据端口)。

    3. 客户端通知目标服务器连接代理端口

      • 客户端将代理服务器监听的地址和端口(IP:8080)告知目标服务器(如 FTP 服务器)。

      • 例如:FTP 客户端发送 PORT 代理服务器IP,8080 命令。

        1
        PORT 10,10,10,10,31,144  // 对应 IP=10.10.10.10,PORT=8080 (31*256 + 144=8080)
    4. 目标服务器反向连接

      • 目标服务器(如 FTP 的数据通道)尝试连接到代理服务器的 8080 端口。
      • 代理服务器接受此连接,并返回第二次响应给客户端,确认连接建立。
      字段 长度(字节) 值(示例) 说明
      VER 1 0x05 SOCKS5 版本
      REP 1 0x00 响应状态码:成功
      RSV 1 0x00 保留字段
      ATYP 1 0x01 地址类型:IPv4
      BND.ADDR 4 0xC0A80101 目标服务器的 IP(如 192.168.1.1)
      BND.PORT 2 0x001F 目标服务器的端口(31,大端字节序)
    5. 数据通道建立

      • 代理服务器将目标服务器的连接与客户端的原始 BIND 请求关联,形成双向通道。
      • 客户端通过此通道与目标服务器传输数据。
1
2
3
4
5
6
7
客户端               代理服务器              目标服务器
|--- BIND 请求 ------->| |
|<---- 监听端口 -------| |
|--- 通知目标服务器 --> |
| |<--- 反向连接 ----------|
|<---- 连接确认 -------| |
|==================== 数据转发 ===============>|

UDP ASSOCIATE 模式

  • 用途:转发 UDP 数据包(如 DNS 查询)。

  • 流程

    1. 客户端发起 UDP ASSOCIATE 请求

      • 客户端首先与代理服务器建立 TCP 控制连接(用于协商 UDP 端口),然后通过该连接发送 UDP ASSOCIATE 命令。
      • 客户端 → 代理服务器(TCP 连接)

      协议字段如下(基于 RFC 1928):

      字段 长度(字节) 值(示例) 说明
      VER 1 0x05 SOCKS5 版本
      CMD 1 0x03 命令类型:UDP ASSOCIATE
      RSV 1 0x00 保留字段
      ATYP 1 0x01 地址类型:IPv4 (0x01)、IPv6 (0x04)、域名 (0x03)
      ADDR 可变 0x00000000 客户端建议的 UDP 地址(通常为 0.0.0.0,表示任意地址)
      PORT 2 0x0000 客户端建议的 UDP 端口(通常为 0,表示由代理分配)
      附加说明:

      客户端通常不指定具体地址和端口(ADDR=0.0.0.0, PORT=0),代理服务器会动态分配一个 UDP 端口供客户端使用。

    2. 代理服务器响应 UDP 关联

      • 代理服务器分配一个 UDP 端口并返回响应。
      • 代理服务器 → 客户端(TCP 连接)

      协议字段如下:

      字段 长度(字节) 值(示例) 说明
      VER 1 0x05 SOCKS5 版本
      REP 1 0x00 响应状态码:成功
      RSV 1 0x00 保留字段
      ATYP 1 0x01 地址类型:IPv4
      BND.ADDR 4 0x0A0A0A0A 代理服务器监听的 UDP 地址(如 10.10.10.10)
      BND.PORT 2 0x1F90 代理服务器监听的 UDP 端口(8080,大端字节序)

      附加说明:

      客户端后续必须通过 BND.ADDR:BND.PORT 发送 UDP 数据包到代理服务器。

      TCP 控制连接必须保持打开UDP 关联的生命周期与 TCP 连接绑定。若 TCP 连接关闭,代理将终止 UDP 关联。

    3. 客户端发送 UDP 数据

      • 客户端通过代理分配的 UDP 端口发送数据到目标服务器,数据需封装为 SOCKS5 UDP 请求格式。
      • 客户端 → 代理服务器(UDP 报文)

      协议字段如下):

      字段 长度(字节) 值(示例) 说明
      RSV 2 0x0000 保留字段
      FRAG 1 0x00 分片编号(通常为 0,表示不分片)
      ATYP 1 0x01 地址类型:IPv4
      DST.ADDR 4 0xC0A80101 目标服务器地址(如 192.168.1.1)
      DST.PORT 2 0x0035 目标服务器端口(53,DNS 默认端口)
      DATA 可变 UDP 数据负载

      附加说明:

      每个 UDP 数据包需附加目标地址和端口信息(类似 IP 层的“伪头部”)。

      代理服务器根据 DST.ADDR:DST.PORT 转发数据到目标服务器。

    4. 代理服务器转发 UDP 数据

      • 代理服务器解封装客户端的 UDP 报文,提取目标地址和端口,将 DATA 字段作为普通 UDP 数据发送到目标服务器。
      • 代理服务器 → 目标服务器(UDP 报文)
        1
        2
        3
        源地址:代理服务器的公网 IP 和 UDP 端口(如 `10.10.10.10:8080`)
        目标地址:`192.168.1.1:53`
        数据:原始客户端的 `DATA` 字段(如 DNS 查询请求)
    5. 目标服务器响应 UDP 数据

      • 目标服务器返回 UDP 响应到代理服务器的 UDP 端口。
      • 目标服务器 → 代理服务器(UDP 报文)
        1
        2
        3
        源地址:`192.168.1.1:53`
        目标地址:代理服务器的 UDP 端口(`10.10.10.10:8080`)
        数据:响应内容(如 DNS 查询结果)
    6. 代理服务器转发响应到客户端

      • 代理服务器将响应封装为 SOCKS5 UDP 格式,返回给客户端。
      • 代理服务器 → 客户端(UDP 报文)

      协议字段如下:

      字段 长度(字节) 值(示例) 说明
      RSV 2 0x0000 保留字段
      FRAG 1 0x00 分片编号
      ATYP 1 0x01 地址类型:IPv4
      DST.ADDR 4 0xC0A80101 原始请求的目标地址(192.168.1.1)
      DST.PORT 2 0x0035 原始请求的目标端口(53)
      DATA 可变 目标服务器的响应数据

认证机制

无认证

  • 方法值: 0x00
  • 流程:无需额外步骤,直接转发请求。

用户名/密码认证

  • 方法值: 0x02
  • 客户端请求
    1
    VER(0x01) | ULEN | UNAME | PLEN | PASSWD
  • 代理响应
    1
    VER(0x01) | STATUS(0x00=成功)

GSSAPI 认证

  • 方法值: 0x01

  • 流程

    1. 通过令牌交换建立安全上下文。
    2. 加密/签名后续通信数据。

应用场景

  1. 网络穿透:绕过防火墙或 NAT 限制。
  2. 隐私保护:隐藏客户端真实 IP
  3. 协议支持:代理非 HTTP 流量(如 FTPSMTP)。
  4. 负载均衡:通过代理分发请求。

安全注意事项

  1. 明文风险:用户名/密码认证需配合 TLS 加密。
  2. 端口暴露BIND/UDP 模式可能被滥用。
  3. 访问控制:限制代理服务的访问权限。
  4. 超时设置:及时关闭空闲连接。

总结

SOCKS5 凭借其灵活性,成为代理技术的核心协议:

  • 优势:支持多协议、认证机制、反向连接。
  • 局限UDP 实现复杂,原生无加密。
  • 适用场景:企业内网穿透、隐私保护、混合协议代理。

理解协议细节有助于优化代理实现,并规避潜在安全风险。

参考文献