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 |
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 。
服务器鉴定后发出如下回应:
其中鉴定状态 0x00 表示成功,0x01 表示失败。