最近看了一下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=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
succeeded0x01
general SOCKS server failure0x02
connection not allowed by ruleset0x03
Network unreachable0x04
Host unreachable0x05
Connection refused0x06
TTL expired0x07
Command not supported0x08
Address type not supported
BND.ADDR
:代理服务器绑定的地址BND.PORT
:代理服务器绑定的端口