Socks 代理协议详解

2022-04-28 linux network

Socks 是一个代理协议,这里会对协议进行详细介绍,同时会介绍其使用场景。

简介

这是一种互联网协议,通过代理服务器在客户端和服务端之间交换网络数据,而 socks5socks 协议的第五个版本,在 socks4 的基础上增加了 UDP 转发和认证功能,不过并不向下兼容。

协议详解

其中 socks5 是 SOCKS Protocol Version 5 的缩写,其规范在 RFC1928 中定义,是一个二进制协议,总共分成认证、建立连接、转发数据三步。

握手阶段

首先客户端会向 Proxy 发起协商,协议如下。

+----+----------+----------+
|VER | NMETHODS | METHODS  |
+----+----------+----------+
| 1  |    1     | 1 to 255 |
+----+----------+----------+

各个字段的含义如下:

  • VER 协议版本号,对应 socks50x05
  • NMETHODS 认证的方法数量。
  • METHODS 认证的方法,在 RFC 中预先定义了部分。

服务端会选中一个 Method 返回给客户端,格式如下。

+----+--------+
|VER | METHOD |
+----+--------+
| 1  |   1    |
+----+--------+

当客户端接收到 0x00 时会跳过认证直接进入请求阶段;如果收到 0xFF 则直接断开连接,其它值则进入到对应的认证阶段。

请求阶段

当顺利通过协商阶段后,客户端开始向服务发起请求。

+----+-----+-------+------+----------+----------+
|VER | CMD |  RSV  | ATYP | DST.ADDR | DST.PORT |
+----+-----+-------+------+----------+----------+
| 1  |  1  | X'00' |  1   | Variable |    2     |
+----+-----+-------+------+----------+----------+
  • VER 版本号,与协商阶段相同,对应 socks5 的值为 0x05
  • CMD 对应几种操作:0x01 表示 CONNECT 请求;0x02 表示 BIND 请求;0x03 表示 UDP 转发。
  • RSV 保留字段,值为 0x00
  • ATYP 目标地址类型,表示 DST.ADDR 的数据对应这个字段的类型:
    • 0x01 表示 IPv4 地址,对应 DST.ADDR 长度为 4 字节;
    • 0x03 表示域名,DST.ADDR 是一个可变长度的域名,第一个字节表示长度;
    • 0x04 表示 IPv6 地址,对应 DST.ADDR 为 16 个字节长度。
  • DST.ADDR 一个可变长度的地址信息。
  • DST.PORT 目标端口,固定 2 个字节。

在处理完用户请求之后会返回一个响应。

+----+-----+-------+------+----------+----------+
|VER | REP |  RSV  | ATYP | BND.ADDR | BND.PORT |
+----+-----+-------+------+----------+----------+
| 1  |  1  | X'00' |  1   | Variable |    2     |
+----+-----+-------+------+----------+----------+
  • VER 协议版本号,同样为 0x05
  • REP 返回码信息:
    • 0x00 成功。
    • 0x01 成功。

实际上 Socks5 服务器和 Relay 服务器是可以分开的,分开后就是通过这里的 BND.ADDRBND.PORT 告知客户端的服务器地址,否则全部设置为 0 即可。