Socks5

socks5是一种网络传输协议,主要用于客户端与目标服务器之间的透明传递。

socks5 是一个简单的代理协议,这里是RFC
·
整个协议其实就是在建立TCP连接之后,真正的内容传输之前,加一点内容

主要工作流程

  • 客户端连接上代理服务器之后需要发送请求告知服务器目前的socks协议版本以及支持的认证方式
  • 代理服务器收到请求后根据其设定的认证方式返回给客户端
  • 如果代理服务器不需要认证,客户端将直接向代理服务器发起真实请求
  • 代理服务器收到该请求之后连接客户端请求的目标服务器
  • 代理服务器开始转发客户端与目标服务器之间的流量

认证过程

2.1 客户端发出请求

  • 建立TCP连接之后,Client发送如下数据:
    1
    2
    3
    4
    5
    +----+----------+----------+
    |VER | NMETHODS | METHODS |
    +----+----------+----------+
    | 1 | 1 | 1 to 255 |
    +----+----------+----------+
  • VER 是指SOCKS协议版本,以为是socks5,所以值就是0x05
  • NMETHODS 是指有多少个可以使用的方法,也就是客户端支持的认证方法,有以下值:
    • 0x00 NO AUTHENTICATION REQUIRED 不需要认证
    • 0x01 GSSAPI 参考:GenericSecurityServicesApplicationProgram_Interface
    • 0x02 USERNAME/PASSWORD 用户名密码认证
    • 0x03 to 0x7f IANA ASSIGNED 一般不用。INNA保留。
    • 0x80 to 0xfe RESERVED FOR PRIVATE METHODS 保留作私有用处。
    • 0xFF NO ACCEPTABLE METHODS 不接受任何方法/没有合适的方法
  • METHODS 就是方法值,有多少个方法就有多少个byte

2.2 Server返回可以使用的方法

  • 收到Client的请求之后,Server选择一个自己也支持的认证方案,然后返回:
    1
    2
    3
    4
    5
    +----+--------+
    |VER | METHOD |
    +----+--------+
    | 1 | 1 |
    +----+--------+
  • VERMETHOD 的取值与上一节相同

2.3 客户端告知目标地址

1
2
3
4
5
+----+-----+-------+------+----------+----------+
|VER | CMD | RSV | ATYP | DST.ADDR | DST.PORT |
+----+-----+-------+------+----------+----------+
| 1 | 1 | X'00' | 1 | Variable | 2 |
+----+-----+-------+------+----------+----------+
  • VER 还是版本,取值是 0x05
  • CMD 是指要做啥,取值如下:
    • CONNECT 0x01 连接,用于客户端请求服务器进行代理,此时绑定的地址是指代理服务器连接到目标机器时的ip和端口
    • BIND 0x02 端口监听(也就是在Server上监听一个端口),用于客户端向服务器上报自己的反向连接监听地址(应用场景如 FTP 下载,客户端需要接受来自服务器的连接
    • UDP ASSOCIATE 0x03 使用UDP,用于请求建立到 UDP 数据报中继的连接
  • RSV 是保留位,值是 0x00
  • ATYP 是目标地址类型,有如下取值:
    • 0x01 IPv4
    • 0x03 域名
    • 0x04 IPv6
  • DST.ADDR 就是目标地址的值了,如果是IPv4,那么就是4 bytes,如果是IPv6那么就是16 bytes,如果是域名,那么第一个字节代表 接下来有多少个字节是表示目标地址
  • DST.PORT 两个字节代表端口号

2.4 服务端回复

  • SOCKS服务器通常将根据源评估请求和目标地址,并返回一个或多个回复消息
    1
    2
    3
    4
    5
    +----+-----+-------+------+----------+----------+
    |VER | REP | RSV | ATYP | BND.ADDR | BND.PORT |
    +----+-----+-------+------+----------+----------+
    | 1 | 1 | X'00' | 1 | Variable | 2 |
    +----+-----+-------+------+----------+----------+
    • VER 还是版本,值是 0x05
  • REP 是状态码,取值如下:
    • 0x00 succeeded,代理服务器连接目标服务器成功
    • 0x01 general SOCKS server failure,代理服务器故障
    • 0x02 connection not allowed by ruleset,代理服务器规则集不允许连接
    • 0x03 Network unreachable,网络无法访问
    • 0x04 Host unreachable,目标服务器无法访问(主机名无效)
    • 0x05 Connection refused,连接目标服务器被拒绝
    • 0x06 TTL expired,TTL已过期
    • 0x07 Command not supported,不支持的命令
    • 0x08 Address type not supported,不支持的目标服务器地址类型
    • 0x09 to 0xff unassigned,0xFF 未分配
  • RSV 保留位,取值为 0x00
  • ATYP 是目标地址类型,有如下取值:
    • 0x01 IPv4
    • 0x03 域名
    • 0x04 IPv6
  • DST.ADDR 就是目标地址的值了,如果是IPv4,那么就是4 bytes,如果是IPv6那么就是16 bytes,如果是域名,那么第一个字节代表 接下来有多少个字节是表示目标地址
  • DST.PORT 两个字节代表端口号

2.5 通信过程

  • 经过认证与命令过程后,客户端与代理服务器进入正常通信,客户端发送需要请求到目标服务器的数据给代理服务器,代理服务器转发这些数据,并把目标服务器的响应转发给客户端,起到一个“透明代理”的功能。
  • 到了这个阶段基本就是数据转发了,tcp就直接转发,udp还须要做点工作。
  • 客户端发送给代理服务器和代理服务器返回给客户端的数据都需要包装下
    1
    2
    3
    4
    5
    +----+------+------+----------+----------+----------+
    |RSV | FRAG | ATYP | DST.ADDR | DST.PORT | DATA |
    +----+------+------+----------+----------+----------+
    | 2 | 1 | 1 | Variable | 2 | Variable |
    +----+------+------+----------+----------+----------+
  • 具体的字段含义和上述的一样,就不具体细说了,其中最后的data表示用户字段