ShadowSocks-libev 源码分析 - socks5


1.客户端发送认证协商 如图 1,2 流程

  • 客户端发送数据格式
1
2
3
4
5
+----+----------+----------+
|VER | NMETHODS | METHODS |
+----+----------+----------+
| 1 | 1 | 1~255 |
+----+----------+----------+
  • VER 字段是当前协议的版本号,也就是 5
  • NMETHODS 字段是 METHODS 字段占用的字节数
  • METHODS 字段的每一个字节表示一种认证方式,表示客户端支持的全部认证方式。对应值如下
1
2
3
4
5
6
0x00: NO AUTHENTICATION REQUIRED
0x01: GSSAPI
0x02: USERNAME/PASSWORD
0x03: to ’0x7F’ IANA ASSIGNED
0x80: to ’0xFE’ RESERVED FOR PRIVATE METHODS
0xFF: NO ACCEPTABLE METHODS
  • 通常客户端采用无须认证,如下
1
client -> server: 0x05 0x01 0x00
  • 服务端响应数据格式
1
2
3
4
5
+-----+--------+
| VER | METHOD |
+-----+--------+
| 1 | 1 |
+----+---------+
  • VER 字段是当前协议的版本号
  • METHOD 确定验证方式
  • 通常客户端采用无须认证,则服务端响应如下
1
server -> client: 0x05 0x00

2.连接阶段 如图 3,4 流程

  • 客户端向服务端发送数据格式:
1
2
3
4
5
+----+-----+-------+------+----------+----------+
|VER | CMD | RSV | ATYP | DST.ADDR | DST.PORT |
+----+-----+-------+------+----------+----------+
| 1 | 1 | 1 | 1 | Variable | 2 |
+----+-----+-------+------+----------+----------+
  • CMD 字段:
1
2
3
0x01:CONNECT 建立 TCP 连接
0x02: BIND 上报反向连接地址
0x03:关联 UDP 请求
  • RSV 字段:保留字段,固定值为 0x00
  • ATYP 字段:address type 的缩写:
1
2
3
0x01:IPv4        
0x03:域名
0x04:IPv6
  • DST.ADDR 字段:destination address 的缩写,取值随 ATYP 变化:
1
2
3
ATYP == 0x01:4 个字节的 IPv4 地址
ATYP == 0x03:1 个字节表示域名长度,紧随其后的是对应的域名
ATYP == 0x04:16 个字节的 IPv6 地址
  • DST.PORT 字段:目的服务器的端口

  • 服务端响应数据格式

1
2
3
4
5
+----+-----+-------+------+----------+----------+
|VER | REP | RSV | ATYP | BND.ADDR | BND.PORT |
+----+-----+-------+------+----------+----------+
| 1 | 1 | 1 | 1 | Variable | 2 |
+----+-----+-------+------+----------+----------+
  • REP 字段:
1
2
3
4
5
6
7
8
9
10
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

3.数据转发 如图 5,6,7,8,9,10 流程

  • 流程5, 6, 7 ShadowSocks local serverclient中读取数据,然后按照配置的加密方式,将数据加密后发送到 ShadowSocks remote server,之后ShadowSocks remote server接受到数据后,先解密然后在转发到真实的服务器上
  • 流程8, 9, 10 ShadowSocks remote server接受到真实的服务器返回的数据后,先加密数据,然后将加密后的数据发送回ShadowSocks local server, ShadowSocks local server接受到ShadowSocks remote server的数据后,先解密数据,然后将解密后的数据发送回client
-------------本文结束感谢您的阅读-------------