过程
客户端发起请求
客户端连到服务器后,然后就发送请求来协商版本和认证方法:
**客户端** 请求第一步
+----+----------+----------+
| VER|NMETHODS | METHODS |
+----+----------+----------+
| 1 | 1 | 1 - 255 |
+----+----------+----------+
VER 表示版本号:sock5 为 X'05'
NMETHODS(方法选择)中包含在METHODS(方法)中出现的方法标识的数据(用字节表示)
目前定义的METHOD有以下几种:
X'00' 无需认证
X'01' 通用安全服务应用程序(GSSAPI)
X'02' 用户名/密码 auth (USERNAME/PASSWORD)
X'03'- X'7F' IANA 分配(IANA ASSIGNED)
X'80'- X'FE' 私人方法保留(RESERVED FOR PRIVATE METHODS)
X'FF' 无可接受方法(NO ACCEPTABLE METHODS)
**服务器** 响应第一步
服务器从客户端发来的消息中选择一种方法作为返回
服务器从METHODS给出的方法中选出一种,发送一个METHOD(方法)选择报文:
+----+--------+
|VER | METHOD |
+----+--------+
|0x05| 0x00 |
+----+--------+
无认证客户端发送
+----+--------+
|VER | METHOD |
+----+--------+
| 1 | 0 |
+----+--------+
账户密码认证客户端发送
+----+------+----------+------+----------+
|VER | ULEN | UNAME | PLEN | PASSWD |
+----+------+----------+------+----------+
|0x05| 1 | 1 to 255 | 1 | 1 to 255 |
+----+------+----------+------+----------+
VERSION 认证子协商版本(与SOCKS协议版本的0x05无关系)
USERNAME_LENGTH 用户名长度
USERNAME 用户名字节数组,长度为USERNAME_LENGTH
PASSWORD_LENGTH 密码长度
PASSWORD 密码字节数组,长度为PASSWORD_LENGTH
服务端验证
+----+--------+
|VER | STATUS |
+----+--------+
|0x05| 1 |
+----+--------+
VERSION 认证子协商版本,与客户端VERSION字段一致
STATUS 认证结果
0x00 认证成功
大于0x00 认证失败
命令过程
一旦方法选择子商议结束,客户机就发送请求细节。如果商议方法包括了完整性检查的目的或机密性封装
,则请求必然被封在方法选择的封装中。
SOCKS请求如下表所示:
+----+-----+-------+------+----------+----------+
| VER| CMD | RSV | ATYP | DST.ADDR| DST.PORT|
+----+-----+-------+------+----------+----------+
| 1 | 1 | X'00' | 1 | variable | 2 |
+----+-----+-------+------+----------+----------+
各个字段含义如下:
VER 版本号X'05'
CMD:
1. CONNECT X'01'
2. BIND X'02'
3. UDP ASSOCIATE X'03'
RSV 保留字段
ATYP IP类型
1.IPV4 X'01'
2.DOMAINNAME X'03'
3.IPV6 X'04'
DST.ADDR 目标地址
1.如果是IPv4地址,这里是big-endian序的4字节数据
2.如果是FQDN,比如"www.nsfocus.net",这里将是:
0F 77 77 77 2E 6E 73 66 6F 63 75 73 2E 6E 65 74
注意,没有结尾的NUL字符,非ASCIZ串,第一字节是长度域
3.如果是IPv6地址,这里是16字节数据。
DST.PORT 目标端口(按网络次序排列)
**sock5响应如下:**
OCKS Server评估来自SOCKS Client的转发请求并发送响应报文:
+----+-----+-------+------+----------+----------+
|VER | REP | RSV | ATYP | BND.ADDR | BND.PORT |
+----+-----+-------+------+----------+----------+
| 1 | 1 | X'00' | 1 | Variable | 2 |
+----+-----+-------+------+----------+----------+
VER 版本号X'05'
REP
1. 0x00 成功
2. 0x01 一般性失败
3. 0x02 规则不允许转发
4. 0x03 网络不可达
5. 0x04 主机不可达
6. 0x05 连接拒绝
7. 0x06 TTL超时
8. 0x07 不支持请求包中的CMD
9. 0x08 不支持请求包中的ATYP
10. 0x09-0xFF unassigned
RSV 保留字段,必须为0x00
ATYP 用于指明BND.ADDR域的类型
BND.ADDR CMD相关的地址信息,不要为BND所迷惑
BND.PORT CMD相关的端口信息,big-endian序的2字节数据
参考文章
https://www.cnblogs.com/yinzhengjie/p/7357860.html
https://blog.csdn.net/suifengdeshitou/article/details/48782667
https://www.ddhigh.com/2019/08/24/socks5-protocol.html
https://www.ietf.org/rfc/rfc1928.txt
https://www.ietf.org/rfc/rfc1929.txt