1、请求 client -> server,客户端socket连接服务器后立即发送此包
VERSION | METHODS_COUNT | METHODS |
---|---|---|
1字节 | 1字节 | 1到255字节,长度由METHODS_COUNT值决定 |
0x05 | 0x03 | 0x00 0x01 0x02 |
各字段含义
- VERSION SOCKS协议版本,目前固定0x05
- METHODS_COUNT 客户端支持的认证方法数量
- METHODS 客户端支持的认证方法,每个方法占用1个字节
METHODS列表
- 0x00 不需要认证(常用)
- 0x01 GSSAPI认证
- 0x02 账号密码认证(常用)
- 0x03 – 0x7F IANA分配
- 0x80 – 0xFE 私有方法保留
- 0xFF 无支持的认证方法
2、认证过程
2.1、server -> client 无需认证,server返回无需认证,则直接进入第3步,命令过程
VERSION | METHOD |
---|---|
1字节 | 1字节 |
0x05 | 0x00 |
2.2、server -> client 密码认证,server返回需要密码认证,则进入密码认证过程,密码认证成功则进入第3步,命令过程。密码认证失败,则直接断开连接
VERSION | METHOD |
---|---|
1字节 | 1字节 |
0x05 | 0x02 |
2.2.1、client -> server 客户端发送账号密码
VERSION | USERNAME_LENGTH | USERNAME | PASSWORD_LENGTH | PASSWORD |
---|---|---|---|---|
1字节 | 1字节 | 1到255字节 | 1字节 | 1到255字节 |
0x01 | 0x01 | 0x0a | 0x01 | 0x0a |
各字段含义
- VERSION 认证子协商版本(与SOCKS协议版本的0x05无关系)
- USERNAME_LENGTH 用户名长度
- USERNAME 用户名字节数组,长度为USERNAME_LENGTH
- PASSWORD_LENGTH 密码长度
- PASSWORD 密码字节数组,长度为PASSWORD_LENGTH
2.2.2、server -> client 返回认证结果
VERSION | STATUS |
---|---|
1字节 | 1字节 |
0x01 | 0x00 |
各字段含义
- VERSION 认证子协商版本
- STATUS 认证结果,0x00认证成功,大于0x00认证失败
3、命令过程
3.1 client -> server 发送连接请求
VERSION | COMMAND | RSV | ADDRESS_TYPE | DST.ADDR | DST.PORT |
---|---|---|---|---|---|
1字节 | 1字节 | 1字节 | 1字节 | 1-255字节 | 2字节 |
各字段含义
- VERSION SOCKS协议版本,固定0x05
- COMMAND 命令
- 0x01 CONNECT 连接上游服务器
- 0x02 BIND 绑定,客户端会接收来自代理服务器的链接,著名的FTP被动模式
- 0x03 UDP ASSOCIATE UDP中继
- RSV 保留字段
- ADDRESS_TYPE 目标服务器地址类型
- 0x01 IP V4地址
- 0x03 域名地址(没有打错,就是没有0x02),域名地址的第1个字节为域名长度,剩下字节为域名名称字节数组
- 0x04 IP V6地址
- DST.ADDR 目标服务器地址
- DST.PORT 目标服务器端口
3.2 server -> client 服务端响应连接结果
VERSION | RESPONSE | RSV | ADDRESS_TYPE | DST.ADDR | DST.PORT |
---|---|---|---|---|---|
1字节 | 1字节 | 1字节 | 1字节 | 1-255字节 | 2字节 |
各字段含义
- VERSION SOCKS协议版本,固定0x05
- RESPONSE 响应命令,除0x00外,其它响应都应该直接断开连接
- 0x00 代理服务器连接目标服务器成功
- 0x01 代理服务器故障
- 0x02 代理服务器规则集不允许连接
- 0x03 网络无法访问
- 0x04 目标服务器无法访问(主机名无效)
- 0x05 连接目标服务器被拒绝
- 0x06 TTL已过期
- 0x07 不支持的命令
- 0x08 不支持的目标服务器地址类型
- 0x09 – 0xFF 未分配
- RSV 保留字段
- BND.ADDR 代理服务器连接目标服务器成功后的代理服务器IP
- BND.PORT 代理服务器连接目标服务器成功后的代理服务器端口
4、数据转发
第3步成功后,进入数据转发阶段
- CONNECT 则将client过来的数据原样转发到目标,接着再将目标回来的数据原样返回给client
- BIND
- UDP ASSOCIATE
udp转发的数据包
- 收到客户端udp数据包后,解析出目标地址,数据,然后把数据发送过去
- 收到服务端回来的udp数据后,根据相同格式,打包,然后发回客户端
RSV | FRAG | ADDRESS_TYPE | DST.ADDR | DST.PORT | DATA |
---|---|---|---|---|---|
2字节 | 1字节 | 1字节 | 可变长 | 2字节 | 可变长 |
各字段含义
- RSV 保留为
- FRAG 分片位
- ATYP 地址类型
- 0x01 IP V4地址
- 0x03 域名地址(没有打错,就是没有0x02),域名地址的第1个字节为域名长度,剩下字节为域名名称字节数组
- 0x04 IP V6地址
- DST.ADDR 目标地址
- DST.PORT 目标端口
- DATA 数据