# socks5协议

socks5协议的基本认知,官方文档C#代码示例

1、请求 client -> server,客户端socket连接服务器后立即发送此包

VERSIONMETHODS_COUNTMETHODS
1字节1字节1到255字节,长度由METHODS_COUNT值决定
0x050x030x00 0x01 0x02

各字段含义

  1. VERSION SOCKS协议版本,目前固定0x05
  2. METHODS_COUNT 客户端支持的认证方法数量
  3. METHODS 客户端支持的认证方法,每个方法占用1个字节

METHODS列表

  1. 0x00 不需要认证(常用)
  2. 0x01 GSSAPI认证
  3. 0x02 账号密码认证(常用)
  4. 0x03 – 0x7F IANA分配
  5. 0x80 – 0xFE 私有方法保留
  6. 0xFF 无支持的认证方法

2、认证过程

2.1、server -> client 无需认证,server返回无需认证,则直接进入第3步,命令过程
VERSIONMETHOD
1字节1字节
0x050x00
2.2、server -> client 密码认证,server返回需要密码认证,则进入密码认证过程,密码认证成功则进入第3步,命令过程。密码认证失败,则直接断开连接
VERSIONMETHOD
1字节1字节
0x050x02
2.2.1、client -> server 客户端发送账号密码
VERSIONUSERNAME_LENGTHUSERNAMEPASSWORD_LENGTHPASSWORD
1字节1字节1到255字节1字节1到255字节
0x010x010x0a0x010x0a

各字段含义

  1. VERSION 认证子协商版本(与SOCKS协议版本的0x05无关系)
  2. USERNAME_LENGTH 用户名长度
  3. USERNAME 用户名字节数组,长度为USERNAME_LENGTH
  4. PASSWORD_LENGTH 密码长度
  5. PASSWORD 密码字节数组,长度为PASSWORD_LENGTH
2.2.2、server -> client 返回认证结果
VERSIONSTATUS
1字节1字节
0x010x00

各字段含义

  1. VERSION 认证子协商版本
  2. STATUS 认证结果,0x00认证成功,大于0x00认证失败

3、命令过程

3.1 client -> server 发送连接请求
VERSIONCOMMANDRSVADDRESS_TYPEDST.ADDRDST.PORT
1字节1字节1字节1字节1-255字节2字节

各字段含义

  1. VERSION SOCKS协议版本,固定0x05
  2. COMMAND 命令
    1. 0x01 CONNECT 连接上游服务器
    2. 0x02 BIND 绑定,客户端会接收来自代理服务器的链接,著名的FTP被动模式
    3. 0x03 UDP ASSOCIATE UDP中继
  3. RSV 保留字段
  4. ADDRESS_TYPE 目标服务器地址类型
    1. 0x01 IP V4地址
    2. 0x03 域名地址(没有打错,就是没有0x02),域名地址的第1个字节为域名长度,剩下字节为域名名称字节数组
    3. 0x04 IP V6地址
  5. DST.ADDR 目标服务器地址
  6. DST.PORT 目标服务器端口
3.2 server -> client 服务端响应连接结果
VERSIONRESPONSERSVADDRESS_TYPEDST.ADDRDST.PORT
1字节1字节1字节1字节1-255字节2字节

各字段含义

  1. VERSION SOCKS协议版本,固定0x05
  2. RESPONSE 响应命令,除0x00外,其它响应都应该直接断开连接
    1. 0x00 代理服务器连接目标服务器成功
    2. 0x01 代理服务器故障
    3. 0x02 代理服务器规则集不允许连接
    4. 0x03 网络无法访问
    5. 0x04 目标服务器无法访问(主机名无效)
    6. 0x05 连接目标服务器被拒绝
    7. 0x06 TTL已过期
    8. 0x07 不支持的命令
    9. 0x08 不支持的目标服务器地址类型
    10. 0x09 – 0xFF 未分配
  3. RSV 保留字段
  4. BND.ADDR 代理服务器连接目标服务器成功后的代理服务器IP
  5. BND.PORT 代理服务器连接目标服务器成功后的代理服务器端口

4、数据转发

第3步成功后,进入数据转发阶段

  1. CONNECT 则将client过来的数据原样转发到目标,接着再将目标回来的数据原样返回给client
  2. BIND
  3. UDP ASSOCIATE

udp转发的数据包

  1. 收到客户端udp数据包后,解析出目标地址,数据,然后把数据发送过去
  2. 收到服务端回来的udp数据后,根据相同格式,打包,然后发回客户端
RSVFRAGADDRESS_TYPEDST.ADDRDST.PORTDATA
2字节1字节1字节可变长2字节可变长

各字段含义

  1. RSV 保留为
  2. FRAG 分片位
  3. ATYP 地址类型
    1. 0x01 IP V4地址
    2. 0x03 域名地址(没有打错,就是没有0x02),域名地址的第1个字节为域名长度,剩下字节为域名名称字节数组
    3. 0x04 IP V6地址
  4. DST.ADDR 目标地址
  5. DST.PORT 目标端口
  6. DATA 数据