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
协议的基本工作流程可以分为以下几个步骤:
客户端连接 SOCKS5 代理服务器
客户端与代理服务器建立TCP
连接。客户端进行认证(如果需要的话)
客户端发送支持的认证方式,代理服务器选择合适的认证方法。客户端发起请求
客户端向代理服务器发起CONNECT
、BIND
或UDP
转发请求。代理服务器处理请求并返回响应
代理服务器处理请求并返回结果。如果请求成功,数据转发开始。
协议字段详解
1. 认证方法协商
客户端 → 代理服务器
字段 | 长度(字节) | 值(示例) | 说明 |
---|---|---|---|
VER |
1 | 0x05 |
SOCKS5 版本 |
NMETHODS |
1 | 0x02 |
支持的认证方法数量 |
METHODS |
可变 | 0x00, 0x02 |
方法列表 |
代理服务器 → 客户端
字段 | 长度(字节) | 值(示例) | 说明 |
---|---|---|---|
VER |
1 | 0x05 |
SOCKS5 版本 |
METHOD |
1 | 0x02 |
选择的认证方法 |
认证流程时序(用户名/密码认证举例)
1 | 客户端 代理服务器 |
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) |
- 地址类型(ATYP):
0x01
:IPv4(4 字节地址)。0x03
:域名(1 字节长度 + 变长域名,如0x07 "example.com"
)。0x04
:IPv6(16 字节地址)。
- 端口字节序:
- 所有端口号均为 大端字节序(如
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
)。 - 流程:
客户端发送
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 默认端口,大端字节序) 代理建立与目标服务器的
TCP
连接。代理返回响应,开始转发数据。
协议字段:字段 长度(字节) 值(示例) 说明 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 | 客户端 代理服务器 目标服务器 |
BIND 模式
用途:允许目标服务器反向连接客户端(如
FTP
主动模式)。流程:
客户端发起
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 → 大端字节序) - 客户端向
代理服务器监听端口:
- 代理服务器在某个端口(如
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.ADDR
和BND.PORT
是代理服务器监听的地址和端口,客户端需要将此信息告知目标服务器(如FTP
服务器的数据端口)。- 代理服务器在某个端口(如
客户端通知目标服务器连接代理端口:
客户端将代理服务器监听的地址和端口(
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)
目标服务器反向连接:
- 目标服务器(如
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,大端字节序) - 目标服务器(如
数据通道建立:
- 代理服务器将目标服务器的连接与客户端的原始
BIND
请求关联,形成双向通道。 - 客户端通过此通道与目标服务器传输数据。
- 代理服务器将目标服务器的连接与客户端的原始
1 | 客户端 代理服务器 目标服务器 |
UDP ASSOCIATE 模式
用途:转发
UDP
数据包(如DNS
查询)。流程:
客户端发起
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 端口供客户端使用。
- 客户端首先与代理服务器建立 TCP 控制连接(用于协商
代理服务器响应
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
关联。- 代理服务器分配一个
客户端发送
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
转发数据到目标服务器。- 客户端通过代理分配的
代理服务器转发
UDP
数据- 代理服务器解封装客户端的
UDP
报文,提取目标地址和端口,将DATA
字段作为普通UDP
数据发送到目标服务器。 - 代理服务器 → 目标服务器(UDP 报文)
1
2
3源地址:代理服务器的公网 IP 和 UDP 端口(如 `10.10.10.10:8080`)
目标地址:`192.168.1.1:53`
数据:原始客户端的 `DATA` 字段(如 DNS 查询请求)
- 代理服务器解封装客户端的
目标服务器响应
UDP
数据- 目标服务器返回
UDP
响应到代理服务器的UDP
端口。 - 目标服务器 → 代理服务器(UDP 报文)
1
2
3源地址:`192.168.1.1:53`
目标地址:代理服务器的 UDP 端口(`10.10.10.10:8080`)
数据:响应内容(如 DNS 查询结果)
- 目标服务器返回
代理服务器转发响应到客户端
- 代理服务器将响应封装为
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
流程:
- 通过令牌交换建立安全上下文。
- 加密/签名后续通信数据。
应用场景
- 网络穿透:绕过防火墙或
NAT
限制。 - 隐私保护:隐藏客户端真实
IP
。 - 协议支持:代理非
HTTP
流量(如FTP
、SMTP
)。 - 负载均衡:通过代理分发请求。
安全注意事项
- 明文风险:用户名/密码认证需配合
TLS
加密。 - 端口暴露:
BIND/UDP
模式可能被滥用。 - 访问控制:限制代理服务的访问权限。
- 超时设置:及时关闭空闲连接。
总结
SOCKS5
凭借其灵活性,成为代理技术的核心协议:
- 优势:支持多协议、认证机制、反向连接。
- 局限:
UDP
实现复杂,原生无加密。 - 适用场景:企业内网穿透、隐私保护、混合协议代理。
理解协议细节有助于优化代理实现,并规避潜在安全风险。