最近看了一下SOCKS5协议,一个小巧方便的代理协议,这里是一些笔记。
建立连接
SOCKS代理由客户端主动发起,它发送一个如下报文至代理服务器,用以协商验证方式
+----+----------+----------+
|VER | NMETHODS | METHODS |
+----+----------+----------+
| 1 | 1 | 1 to 255 |
+----+----------+----------+
VER: SOCKS版本,默认为0x05,长度为1个字节NMETHODS:协议支持的METHODS数量,长度为1个字节,其大小为METHODS字段的长度METHODS: 客户端支持的验证方式,可以有多种,目前定义了0x00:NO AUTHENTICATION REQUIRED0x01:GSSAPI0x02:USERNAME/PASSWORD0x03: to X'7F’ IANA ASSIGNED0x80: to X’FE’ RESERVED FOR PRIVATE METHODS0xFF: 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=0x03ATYP:目标服务器地址类型,IPv4=0x01, DOMAINNAME=0x03, IPv6=0x04DST.ADDR:目标服务器地址,长度不定,视ATYP而定DST.PORT:目标服务器端口
连接状态响应
代理服务器收到数据包以后,与目标服务器建立连接,并转发数据。并且向代理客户端返回一个数据包,告知其与目标服务器的通信情况。代理服务器收到目标服务器的数据以后,转发至代理客户端。
+----+-----+-------+------+----------+----------+
|VER | REP | RSV | ATYP | BND.ADDR | BND.PORT |
+----+-----+-------+------+----------+----------+
| 1 | 1 | X'00' | 1 | Variable | 2 |
+----+-----+-------+------+----------+----------+
REP:连接状态响应码,常见如下0x00succeeded0x01general SOCKS server failure0x02connection not allowed by ruleset0x03Network unreachable0x04Host unreachable0x05Connection refused0x06TTL expired0x07Command not supported0x08Address type not supported
BND.ADDR:代理服务器绑定的地址BND.PORT:代理服务器绑定的端口