一、 socks5 协议
socks5 协议是一款广泛使用的代理协议,它在使用 TCP/IP 协议通讯的前端机器和服务器机器之间扮演一个中介角色,使得内部网中的前端机器变得能够访问 Internet 网中的服务器,或者使通讯更加安全。 SOCKS5 服务器通过将前端发来的请求转发给真正的目标服务器, 模拟了一个前端的行为。在这里,前端和 SOCKS5 之间也是通过 TCP/IP 协议进行通讯,前端将原本要发送给真正服务器的请求发送给 SOCKS5 服务器,然后 SOCKS5 服务器将请求转发给真正的服务器。
代理的工作流程图为:
二、 socks5 协议交互过程
2.1 基于 TCP 的客户端连接过程
第一步,客户端向代理服务器发送代理请求,其中包含了代理的版本和认证方式:
1 2 3 4 5 |
+----+----------+----------+ |VER | NMETHODS | METHODS | +----+----------+----------+ | 1 | 1 | 1 to 255 | +----+----------+----------+ |
如果是 socks5 代理,第一个字段 VER
的值是 0x05
,表明是 socks 代理的第 5 个版本。
第二个字段 NMETHODS
表示支持的认证方式,第三个字段是一个数组,包含了支持的认证方式列表:
0x00
: 不需要认证0x01
: GSSAPI 认证0x02
: 用户名和密码方式认证0x03
: IANA 认证0x80-0xfe
: 保留的认证方式0xff
: 不支持任何认证方式
服务端收到客户端的代理请求后,选择双方都支持的加密方式回复给客户端:
1 2 3 4 5 |
+----+--------+ |VER | METHOD | +----+--------+ | 1 | 1 | +----+--------+ |
此时客户端收到服务端的响应请求后,双方握手完成,开始进行协议交互。
数据包分析
客户端开启 socks 代理,使用浏览器访问网页。抓包软件抓到客户端的认证请求:
服务端的认证响应请求:
2.2 请求
握手完成后,客户端要把需要执行的操作指令发给客户端,表明自己要执行代理的请求。请求帧格式:
1 2 3 4 5 |
+----+-----+-------+------+----------+----------+ |VER | CMD | RSV | ATYP | DST.ADDR | DST.PORT | +----+-----+-------+------+----------+----------+ | 1 | 1 | X'00' | 1 | Variable | 2 | +----+-----+-------+------+----------+----------+ |
各字段含义:
VER
: 代理版本信息CMD
: 代理指令0x01
: connect 指令,tcp 代理时使用。0x02
: bind,很少使用,类似 FTP 协议中主动连接场景,服务端后服务端会主动连接到客户端。0x03
: udp 代理时使用。
RSV
: 保留字段ATYP
: 地址类型0x01
: IPv4 地址类型0x03
: unix 域 socket 类型代理0x04
: IPv6 地址类型
DST.ADDR
: 需要连接的目的地址DST.PORT
: 需要连接的目的端口
数据包分析
以下是一个去往 console.cloud.tencent.com:443
的 socks5 代理请求:
2.3 响应
客户端发完上面的请求连接后,服务端会发起连接到 DST.ADDR:DST.PORT
,然后返回响应到客户端,响应格式:
1 2 3 4 5 |
+----+-----+-------+------+----------+----------+ |VER | REP | RSV | ATYP | BND.ADDR | BND.PORT | +----+-----+-------+------+----------+----------+ | 1 | 1 | X'00' | 1 | Variable | 2 | +----+-----+-------+------+----------+----------+ |
其中 VER/RSV/ATYP
的含义和上面相同,其他字段的意思:
REP
: 请求响应0x00
: 成功0x01-0x08
: 失败0x09-0xff
: 未使用
BND.ADDR
: 连接到的远程地址BND.PORT
: 连接到的远程端口
数据包分析
以下是上面代理请求的响应数据包:
2.4 代理通信
当连接建立后,客户端就可以和正常一样访问服务端通信了,此时通信的数据除了目的地址是发往代理程序以外,所有内容都是和普通连接一模一样。对代理程序而言,后面所有收到的来自客户端的数据都会原样转发到服务读端。
例如代理的 HTTPS 请求连接,实际上发送的数据和普通 HTTPS 交互过程一模一样:
中间的
Socks Protocol
栏是 wireshark 根据连接上下文自动解析出来的,实际上数据包中并没有这一栏。
三、流程图
socks5 通信的交互流程:
1F
感谢分享,帮大忙了
B1
@ zjh 不客气