Socks5 是什么
Socks5 是一种代理协议. 例如, 在公司中不同部门之间, 可能会限制跨部门的机器访问. 但在遇到部分需要跨部门协作时, 需要访问另一部门的资源,而又不想打破原有的限制, 则可以使用代理协议进行通信. 部署了 Socks 代理的机器就相当于中间人的角色.
协议
Socks5 的流程上比较简单, 大概经过以下几个步骤:
- 客户端发送认证的请求
- 代理根据认证的信息进行回复 (如果认证失败, 会话结束)
2.1. 客户端发送认证的信息
2.2. 服务端进行鉴权 - 客户端发送想要连接的目标信息
- 代理服务器根据客户端提供的信息进行连接, 并返回连接建立的结果
- 代理服务器将在客户端和目标服务器之间做转发(已于Socks5 协议无关)
协议细节
认证
认证方法
- 0x00: NO AUTHENTICATION REQUIRED
- 0x01: GSSAPI, 见 RFC 2743
- 0x02: USERNAME/PASSWORD, 见 RFC 1929
- 0x03: to X’7F’ IANA ASSIGNED
- 0x80: to X’FE’ RESERVED FOR PRIVATE METHODS
- 0xFF: NO ACCEPTABLE METHODS
客户端发起认证请求
VER(1) | NMETHODS (1) | METHODS (1~255) |
---|---|---|
固定为 5 | 选择了几种方法 | 方法列表 |
服务器响应认证请求
VER(1) | NMETHOD (1) |
---|---|
固定为 5 | 服务端挑选的认证方式 |
如果服务端向客户端回应方法 0xFF
那么客户端只能选择关闭连接.
请求连接目标
当认证通过后, 客户端可以发起请求代理端连接目标主机
VER(1) | CMD (1) | RSV (固定0x00) | ATYP(1) | DST.ADDR | DST.PORT(2) |
---|---|---|---|---|---|
固定为 5 | 对目标想要做的操作 | - | 地址类型 | 地址, 如果是域名, 那第一个字节是域名数据的长度 | 端口 |
CMD 的内容:
- 0x01: CONNECT 客户端请求服务器进行代理
- 0x02: BIND 向服务器上报自己的反向连接监听地址(应用场景如 FTP 下载,客户端需要接受来自服务器的连接
- 0x03: UDP ASSOCIATE 用于请求建立到 UDP 数据报中继的连接
ATYP 的内容:
- 0x01: IP V4 地址
- 0x03: 域名
- 0x04: IP V6 地址
响应连接请求
VER(1) | REP (1) | RSV (固定0x00) | ATYP(1) | BND.ADDR | BND.PORT(2) |
---|---|---|---|---|---|
固定为 5 | 响应 | - | 地址类型 | 连接到的远程地址, 如果是域名, 那第一个字节是域名数据的长度 | 远程端口 |
REP 的内容:
- 0x00 succeeded
- 0x01 general SOCKS server failure
- 0x02 connection not allowed by ruleset
- 0x03 Network unreachable
- 0x04 Host unreachable
- 0x05 Connection refused
- 0x06 TTL expired
- 0x07 Command not supported
- 0x08 Address type not supported
- 0x09 to X’FF’ unassigned
ATYP 的内容:
- 0x01: IP V4 地址
- 0x03: 域名
- 0x04: IP V6 地址
即是当代理服务端响应 0x00
后, Socks5 的协商已完成, 后续的通信已于 Socks 协议无关.