socks5代理工作流程和原理

一、socks5协议

socks5协议是一款广泛使用的代理协议,它在使用TCP/IP协议通讯的前端机器和服务器机器之间扮演一个中介角色,使得内部网中的前端机器变得能够访问Internet网中的服务器,或者使通讯更加安全。SOCKS5 服务器通过将前端发来的请求转发给真正的目标服务器, 模拟了一个前端的行为。在这里,前端和SOCKS5之间也是通过TCP/IP协议进行通讯,前端将原本要发送给真正服务器的请求发送给SOCKS5服务器,然后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代理,使用浏览器访问网页。抓包软件抓到客户端的认证请求:

socks5代理工作流程和原理

服务端的认证响应请求:

socks5代理工作流程和原理

2.2 请求

握手完成后,客户端要把需要执行的操作指令发给客户端,表明自己要执行代理的请求。请求帧格式:

1
2
3
4
5
+----+-----+-------+------+----------+----------+
|VER | CMD | RSV | ATYP | DST.ADDR | DST.PORT |
+----+-----+-------+------+----------+----------+
| 1 | 1 | X'00' | 1 | Variable | 2 |
+----+-----+-------+------+----------+----------+

各字段含义:

  • VER: 代理版本信息

  • CMD
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11

    : 代理指令

    - `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代理请求:

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: 连接到的远程端口

数据包分析

以下是上面代理请求的响应数据包:

socks5代理工作流程和原理

2.4 代理通信

当连接建立后,客户端就可以和正常一样访问服务端通信了,此时通信的数据除了目的地址是发往代理程序以外,所有内容都是和普通连接一模一样。对代理程序而言,后面所有收到的来自客户端的数据都会原样转发到服务读端。

例如代理的HTTPS请求连接,实际上发送的数据和普通HTTPS交互过程一模一样:

socks5代理工作流程和原理

中间的Socks Protocol栏是wireshark根据连接上下文自动解析出来的,实际上数据包中并没有这一栏。

三、流程图

socks5通信的交互流程:

socks5代理工作流程和原理

四、参考

RFC1928 - SOCKS Protocol Version 5

RFC1929 - Username/Password Authentication for SOCKS V5


socks5代理工作流程和原理
http://blog.uanet.cn/NETWORK/socks5代理工作流程和原理.html
作者
dnsnat
发布于
2023年1月22日
许可协议