最近看了一下SOCKS5协议,一个小巧方便的代理协议,这里是一些笔记。

建立连接

SOCKS代理由客户端主动发起,它发送一个如下报文至代理服务器,用以协商验证方式

               +----+----------+----------+
               |VER | NMETHODS | METHODS  |
               +----+----------+----------+
               | 1  |    1     | 1 to 255 |
               +----+----------+----------+
  • VER : SOCKS版本,默认为0x05,长度为1个字节
  • NMETHODS:协议支持的METHODS数量,长度为1个字节,其大小为METHODS字段的长度
  • METHODS: 客户端支持的验证方式,可以有多种,目前定义了
    • 0x00:NO AUTHENTICATION REQUIRED
    • 0x01:GSSAPI
    • 0x02:USERNAME/PASSWORD
    • 0x03: to X'7F’ IANA ASSIGNED
    • 0x80: to X’FE’ RESERVED FOR PRIVATE METHODS
    • 0xFF: NO ACCEPTABLE METHODS

连接响应

代理服务器收到请求报文以后,返回一个数据包告诉客户端验证方式

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

和目标建立连接

与代理服务器建立连接以后,原本发给目标的数据报统统转发至代理服务器,由其继续转发至目标。

    +----+-----+-------+------+----------+----------+
    |VER | CMD |  RSV  | ATYP | DST.ADDR | DST.PORT |
    +----+-----+-------+------+----------+----------+
    | 1  |  1  | X'00' |  1   | Variable |    2     |
    +----+-----+-------+------+----------+----------+
  • CMD:客户端请求类型,CONNECT=0x01, BIND =0x02, UDP ASSOCIATE=0x03
  • ATYP:目标服务器地址类型,IPv4=0x01, DOMAINNAME=0x03, IPv6=0x04
  • DST.ADDR:目标服务器地址,长度不定,视ATYP而定
  • DST.PORT :目标服务器端口

连接状态响应

代理服务器收到数据包以后,与目标服务器建立连接,并转发数据。并且向代理客户端返回一个数据包,告知其与目标服务器的通信情况。代理服务器收到目标服务器的数据以后,转发至代理客户端。

    +----+-----+-------+------+----------+----------+
    |VER | REP |  RSV  | ATYP | BND.ADDR | BND.PORT |
    +----+-----+-------+------+----------+----------+
    | 1  |  1  | X'00' |  1   | Variable |    2     |
    +----+-----+-------+------+----------+----------+
  • 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
    • 0x07 Command not supported
    • 0x08 Address type not supported
  • BND.ADDR:代理服务器绑定的地址
  • BND.PORT:代理服务器绑定的端口