sock5代理协议

SOCKS5 是一个代理协议,通过将前端发来的请求转发给真正的目标服务器, 模拟了一个前端的行为。在这里,前端和SOCKS5之间也是通过TCP/IP协议进行通讯,前端将原本要发送给真正服务器的请求发送给SOCKS5服务器,然后SOCKS5服务器将请求转发给真正的服务器。

下面主要分析 sock5 内部通信协议。

首先客户端会向代理服务器发送3项,分别是

1.协议版本号,1字节
2.客户端支持的认证机制数目,1字节
3.客户端认证机制列表,1-255个字节(一般为1个字节)

服务端收到认证协商后,会从客户端提供的方法列表中选择一个方法,然后把结果返回给客户端。

1.协议版本号,1字节
2.方法,1字节

0x00:无需认证
0x01:GSSAPI
0x02:用户名/密码认证
0x03-0x7f:iana assigned
0x80-0xfe:保留私有认证
0xff:没有可接受的方法

认证协商完成后,客户端开始发送具体的请求,请求格式为

协议版本号,1字节
请求类型,1字节
    0x01:CONNECT(用于 tcp 场景)
    0x02:BIND(用于罕见的如 ftp)
    0x03:UDP ASSOCIATE(udp 场景)
保留字段,固定取值为 0x00,1字节
目标地址类型,1字节
    0x01:ipv4
    0x03:域名
    0x04:ipv6
请求目的地址
请求目的端口

服务端收到请求后,处理后返回响应格式为

协议版本号
返回状态
    0x00:成功
    0x01:一般socks服务器失败
    0x02:连接不允许
    0x03:网络不可达
    0x04:主机不可达
    0x05:连接拒绝
    0x06:ttl 超时
    0x07:命令不支持
    0x08:地址类型不支持
    0x09-0xff:unassigned
保留字段,固定为0x00
地址类型
    0x01:ipv4
    0x03:域名
    0x04:ipv6
服务端绑定地址,ipv4为4个字节
服务端绑定端口,2个字节

此时,客户端和服务端连接已经建立完成,客户端可以发送正式请求数据,服务端也可以返回正式响应数据。

例子

假设在 192.168.2.242 的 1080 上运行代理服务器,需要用户名和密码认证,现在 192.168.2.243 客户端需要通过代理来访问自己的web服务器,也就是 243 通过 242 代理来访问自己的数据。

下面忽略 tcp 层,全部字节记录为 16 进制。

1.协议号为05,认证方法有 2 个可选,分别为00(无需认证) 和 02(账号/密码)。

#243->242
05 02 00 02

2.服务端返回:协议为05,方法选择 02。

#242->243
05 02

3.此时,客户端开始发送账号密码, 账号密码都为 64 61 69 6c 65 69,字符串为 dailei 。

#243->242
01 06 64 61 69 6c 65 69 06 64 61 69 6c 65 69

4.服务端返回成功,第二个字节 00 代表成功。

#242->243
01 00

5.此时协商完成,客户端开始告知服务端自己即将发送的数据格式。

#243->242
05 01 00 01 c0 a8 02 f3 00 50

05 版本号
01 CONNECT
00 保留
01 ipv4
c0 a8 02 f3 目的ipv4地址,192.168.2.243
00 50 端口

6.服务端告知客户端数据格式

#243->242
05 00 00 01 c0 a8 02 f3 00 50

05 版本号
00 成功
00 保留
01 ipv4
c0 a8 02 f3 服务端绑定地址
00 50 服务端绑定端口

此时,全部完成,243 客户端可以通过这个连接来发送 tcp 数据了,然后 242 代理服务器会原封不动的转发请求数据并把响应数据回复给 243 客户端。

如果代理无需认证(也就是第2步返回 05 00),那么 3,4 两步省略。


上一篇: 无
下一篇: http 1.1 connect 方法
作者邮箱: 203328517@qq.com