socks5协议原理

socks5简介

SOCKS是一种网络传输协议,主要用于客户端与外网服务器之间通讯的中间传递。SOCKS是”SOCKet Secure”的缩写[注 1]
防火墙)后的客户端要访问外部的服务器时,就跟SOCKS代理服务器连接。这个代理服务器控制客户端访问外网的资格,允许的话,就将客户端的请求发往外部的服务器。
这个协议最初由David Koblas开发,而后由NEC的Ying-Da Lee将其扩展到SOCKS4。最新协议是SOCKS5,与前一版本相比,增加支持UDP、验证,以及IPv6
根据OSI模型,SOCKS是会话层的协议,位于表示层传输层之间。
SOCKS协定不提供加密

socks5格式

客户端建立连接

VER NMETHODS METHODS
5 1 1-255
  • VER是SOCKS版本,这里应该是0x05;
  • NMETHODS是METHODS部分的长度;
  • METHODS是客户端支持的认证方式列表,每个方法占1字节。当前的定义是:
  • 0x00 不需要认证
  • 0x01 GSSAPI(英语:Generic Security Services Application Program Interface
  • 0x02 用户名、密码认证
  • 0x03 - 0x7F由IANA分配(保留)
    • 0x03: 握手挑战认证协议
    • 0x04: 未分派
    • 0x05: 响应挑战认证方法
    • 0x06: 传输层安全
    • 0x07: NDS认证
    • 0x08: 多认证框架
    • 0x09: JSON参数块
    • 0x0A–0x7F: 未分派
  • 0x80 - 0xFE为私人方法保留
  • 0xFF 无可接受的方法

服务器从客户端提供的方法中选择一个并通过以下消息通知客户端(以字节为单位):

VER METHOD
5 1

客户端发送请求

VER CMD RSV ATYP DST.ADDR DST.PORT
5 1 0 1 动态 2
  • VER是SOCKS版本,这里应该是0x05;
  • CMD是SOCK的命令码
    • 0x01表示CONNECT请求
    • 0x02表示BIND请求
    • 0x03表示UDP转发
  • RSV 0x00,保留
  • ATYP DST.ADDR类型
    • 0x01 IPv4地址,DST.ADDR部分4字节长度
    • 0x03 域名,DST.ADDR部分第一个字节为域名长度,DST.ADDR剩余的内容为域名,没有\0结尾。
    • 0x04 IPv6地址,16个字节长度。
  • DST.ADDR 目的地址
  • DST.PORT 网络字节序表示的目的端口

服务器按以下格式回应客户端的请求(以字节为单位):

VER REP RSV ATYP BND.ADDR BND.PORT
5 0 0 1 动态 2
  • VER是SOCKS版本,这里应该是0x05;
  • REP应答字段
    • 0x00表示成功
    • 0x01普通SOCKS服务器连接失败
    • 0x02现有规则不允许连接
    • 0x03网络不可达
    • 0x04主机不可达
    • 0x05连接被拒
    • 0x06 TTL超时
    • 0x07不支持的命令
    • 0x08不支持的地址类型
    • 0x09 - 0xFF未定义
  • RSV 0x00,保留
  • ATYP BND.ADDR类型
    • 0x01 IPv4地址,DST.ADDR部分4字节长度
    • 0x03域名,DST.ADDR部分第一个字节为域名长度,DST.ADDR剩余的内容为域名,没有\0结尾。
    • 0x04 IPv6地址,16个字节长度。
  • BND.ADDR 服务器绑定的地址
  • BND.PORT 网络字节序表示的服务器绑定的端口

    SOCKS5 用户名密码认证方式

    在客户端、服务端协商使用用户名密码认证后,客户端发出用户名密码,格式为(以字节为单位):
鉴定协议版本 用户名长度 用户名 密码长度 密码
5 1 动态 1 动态

鉴定协议版本目前为 0x01 。
服务器鉴定后发出如下回应:

鉴定协议版本 鉴定状态
5 1

其中鉴定状态 0x00 表示成功,0x01 表示失败。