简介
SOCKS5 是一个代理协议,它在使用TCP/IP协议通讯的前端机器和服务器机器之间扮演一个中介角色,使得内部网中的前端机器变得能够访问Internet网中的服务器,或者使通讯更加安全。SOCKS5 服务器通过将前端发来的请求转发给真正的目标服务器, 模拟了一个前端的行为。在这里,前端和SOCKS5之间也是通过TCP/IP协议进行通讯,前端将原本要发送给真正服务器的请求发送给SOCKS5服务器,然后SOCKS5服务器将请求转发给真正的服务器。
socks5_百度百科
工作流程
客户端需要先与代理服务器建立 TCP 连接,SOCKS 服务的默认端口是 1080,建立成功后客户端要与代理服务器协商认证方式并完成认证,然后就可以通过代理服务器收发数据。
TCP 连接建立后,客户端会向代理服务器发送请求,包含 SOCKS 协议的版本和客户端支持的认证方式。
协议版本 | 方法数 | 方法编号列表 |
---|---|---|
1Byte | 1Byte | 长度可变 |
- 协议版本:对于 SOCKS5 协议来说这个字段永远是 5,代表 SOCKS 的第五版协议。
- 方法数:表示后续的方法编号列表中有多少种客户端支持的认证方法。
- 方法编号列表:存储客户端支持的认证方法的编号,这些编号有些是 SOCKS 协议预先指定的,有些是 IANA 事后分配的,也有些是给开发者自由使用的,也有的编号代表无需认证。
代理服务器应该选择一个认证方法,并发送下面格式的请求,告知客户端被选择的认证方法。
协议版本 | 方法编号 |
---|---|
1Byte | 1Byte |
完成了认证后,客户端就可以向代理服务器发送代理请求,客户端会向代理服务器发送下面格式的请求
协议版本 | 指令编号 | 保留字段 | 地址类型 | 目标地址 | 目标端口号 |
---|---|---|---|---|---|
1Byte | 1Byte | 1Byte | 1Byte | 长度可变 | 2Byte |
- 协议版本:对于 SOCKS5 协议来说这个字段永远是 5,代表 SOCKS 的第五版协议。
- 指令编号:包括
CONNECT
指令,用于 TCP 代理。BIND
指令,一般用于需要客户端主动接受来自服务器连接的时候。UDP ASSOCIATE
指令,用于 UDP 代理。 - 保留字段:必须为 0。
- 地址类型:包括 IPV4 地址,域名和 IPV6 地址。
- 目标地址:要访问的目标服务器的地址或域名。
- 目标端口号:于目标地址对应的端口号。
代理服务器执行相应的请求后会返回一个或者多个信息,格式如下。
协议版本 | 结果 | 保留字段 | 地址类型 | 绑定地址 | 绑定端口号 |
---|---|---|---|---|---|
1Byte | 1Byte | 1Byte | 1Byte | 长度可变 | 2Byte |
- 协议版本:对于 SOCKS5 协议来说这个字段永远是 5,代表 SOCKS 的第五版协议。
- 结果:包含请求的结果,比如成功、常规故障、网络不可达和超时等。
- 保留字段:必须为 0。
- 地址类型:包括 IPV4 地址,域名和 IPV6 地址。
- 绑定地址:即请求成功后客户端需要连接的代理服务器的地址或域名(有可能就是代理服务器本身,也可能被分配到别的代理服务器),客户端之后的通信均通过地址对应的服务器。
- 绑定端口号:绑定地址对应的端口号。
如果代理服务器返回成功消息,则后续客户端通过绑定地址和绑定端口号与代理服务器通信,由代理服务器转发客户端的请求到目标服务器,并将目标服务器的响应转发给客户端。
如果把上面的信息化成一张简单的交互流程图就是下面这样的。