socket 5协议详解
程序员文章站
2022-07-10 15:29:25
...
认证
首先客户端向服务端发送认证信息,结构如下
+----+----------+----------+
|VER | NMETHODS | METHODS |
+----+----------+----------+
| 1 | 1 | 1 to 255 |
+----+----------+----------+
1就是指长度是一个byte,因此 1 to 255 也就是 1~255个byte。
- VER 是指协议版本,因为是 socks5,所以值是 0x05
- NMETHODS 是指有多少个可以使用的方法,也就是客户端支持的多少种认证方法
- METHODS 就是方法值,有多少个方法就有多少个byte,可以是如下值:
- 0x00 NO AUTHENTICATION REQUIRED 不需要认证
- 0x01 GSSAPI 参考*
- 0x02 USERNAME/PASSWORD 用户名密码认证
- 0x03 to 0x7f IANA ASSIGNED 一般不用。INNA保留。
- 0x80 to 0xfe RESERVED FOR PRIVATE METHODS 保留作私有用处。
- 0xFF NO ACCEPTABLE METHODS 不接受任何方法/没有合适的方法
举例
这个例子表明支持两种认证协议,一种是不需要认证,一种是用户口令认证
+-------+----------+------------+
| VER | NMETHODS | METHODS |
+-------+----------+------------+
| 0x05 | 0x02 | 0x00, 0x02 |
+-------+----------+------------+
收到Client的请求之后,Server选择一个自己也支持的认证方案,然后返回:
+----+--------+
|VER | METHOD |
+----+--------+
| 1 | 1 |
+----+--------+
如果服务端认证失败或不支持客户端提供的方法,响应的中的METHOD字段的值为0xFF,服务端关闭连接。
信息告知
客户端通过认证之后,将需要代理的信息发送给服务端
+----+-----+-------+------+----------+----------+
|VER | CMD | RSV | ATYP | DST.ADDR | DST.PORT |
+----+-----+-------+------+----------+----------+
| 1 | 1 | X'00' | 1 | Variable | 2 |
+----+-----+-------+------+----------+----------+
- VER 还是版本,取值是 0x05
- CMD 是指要做啥,取值如下:
- CONNECT 0x01 连接
- BIND 0x02 端口监听(也就是在Server上监听一个端口)
- UDP ASSOCIATE 0x03 使用UDP
- RSV 是保留位,值是 0x00
- ATYP 是目标地址类型,有如下取值:
- 0x01 IPv4
- 0x03 域名
- 0x04 IPv6
- DST.ADDR 就是目标地址的值了,如果是IPv4,那么就是4 bytes,如果是IPv6那么就是16 bytes,如果是域名,那么第一个字节代表 接下来有多少个字节是表示目标地址
- DST.PORT 两个字节代表端口号
服务端处理客户端发过来的信息,并返回
+----+-----+-------+------+----------+----------+
|VER | REP | RSV | ATYP | BND.ADDR | BND.PORT |
+----+-----+-------+------+----------+----------+
| 1 | 1 | X'00' | 1 | Variable | 2 |
+----+-----+-------+------+----------+----------+
- VER 还是版本,值是 0x05
- 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 0xff unassigned
- RSV 保留位,取值为 0x00
- ATYP 是目标地址类型,有如下取值:
- 0x01 IPv4
- 0x03 域名
- 0x04 IPv6
- DST.ADDR 就是目标地址的值了,如果是IPv4,那么就是4 bytes,如果是IPv6那么就是16 bytes,如果是域名,那么第一个字节代表 接下来有多少个字节是表示目标地址
- DST.PORT 两个字节代表端口号
流量转发
…
参考
上一篇: CentOS7.4下安装Docker