socks5 协议
整个协议其实就是在建立TCP连接之后,真正的内容传输之前,加一点内容
-
浏览器和socks5代理建立TCP连接
和上面不同的时,浏览器和服务器之间多了一个中间人,即socks5,因此浏览器需要跟socks5服务器建立一条连接。
-
socks5协商阶段
在浏览器正式向socks5服务器发起请求之前,双方需要协商,包括协议版本,支持的认证方式等,双方需要协商成功才能进行下一步。协商的细节将会在下一小节详细描述。
-
socks5请求阶段
协商成功后,浏览器向socks5代理发起一个请求。请求的内容包括,它要访问的服务器域名或ip,端口等信息。
-
socks5 relay阶段
scoks5收到浏览器请求后,解析请求内容,然后向目标服务器建立TCP连接。
-
数据传输阶段
经过上面步骤,我们成功建立了浏览器 –> socks5,socks5–>目标服务器之间的连接。这个阶段浏览器开始把数据传输给scoks5代理,socks5代理把数据转发到目标服务器。
1、协商阶段
在这个阶段,客户端向socks5发起请求,内容如下:
+----+----------+----------+
|VER | NMETHODS | METHODS |
+----+----------+----------+
| 1 | 1 | 1 to 255 |
+----+----------+----------+
//1就是指长度是一个byte,因此 1 to 255 也就是 1~255个byte
VER是指协议版本,因为是socks5,所以值是0x05NMETHODS是指有多少个可以使用的方法,也就是客户端支持的认证方法,有以下值:0x00NO AUTHENTICATION REQUIRED 不需要认证0x01GSSAPI 参考:https://en.wikipedia.org/wiki/Generic_Security_Services_Application_Program_Interface0x02USERNAME/PASSWORD 用户名密码认证0x03to0x7fIANA ASSIGNED 一般不用。INNA保留。0x80to0xfeRESERVED FOR PRIVATE METHODS 保留作私有用处。0xFFNO ACCEPTABLE METHODS 不接受任何方法/没有合适的方法
METHODS就是方法值,有多少个方法就有多少个byte

1.1Server返回可以使用的方法
收到Client的请求之后,Server选择一个自己也支持的认证方案,然后返回:
+----+--------+
|VER | METHOD |
+----+--------+
| 1 | 1 |
+----+--------+
VER 和 METHOD 的取值与上一节相同

1.2客户端告知目标地址
+----+-----+-------+------+----------+----------+
|VER | CMD | RSV | ATYP | DST.ADDR | DST.PORT |
+----+-----+-------+------+----------+----------+
| 1 | 1 | X'00' | 1 | Variable | 2 |
+----+-----+-------+------+----------+----------+
VER还是版本,取值是0x05CMD是指要做啥,取值如下:- CONNECT
0x01连接 - BIND
0x02端口监听(也就是在Server上监听一个端口) - UDP ASSOCIATE
0x03使用UDP
- CONNECT
RSV是保留位,值是0x00ATYP是目标地址类型,有如下取值:0x01IPv40x03域名0x04IPv6
DST.ADDR就是目标地址的值了,如果是IPv4,那么就是4 bytes,如果是IPv6那么就是16 bytes,如果是域名,那么第一个字节代表 接下来有多少个字节是表示目标地址DST.PORT两个字节代表端口号
31-39-32-2e-31-36-38-2e-31-2e-24 ASCII 表示 192.168.1.4
1f-41表示: 8001 的16进制

1.3服务端回复
+----+-----+-------+------+----------+----------+
|VER | REP | RSV | ATYP | BND.ADDR | BND.PORT |
+----+-----+-------+------+----------+----------+
| 1 | 1 | X'00' | 1 | Variable | 2 |
+----+-----+-------+------+----------+----------+
VER还是版本,值是0x05REP是状态码,取值如下:0x00succeeded0x01general SOCKS server failure0x02connection not allowed by ruleset0x03Network unreachable0x04Host unreachable0x05Connection refused0x06TTL expired0x07Command not supported0x08Address type not supported0x09to0xffunassigned
RSV保留位,取值为0x00ATYP是目标地址类型,有如下取值:0x01IPv40x03域名0x04IPv6
BND.ADDR服务绑定的地址BND.PORT服务绑定的端口DST.PORT
socks5既充当socks服务器,又充当relay服务器。实际上这两个是可以被拆开的,
当我们的socks5 server和relay server不是一体的,就需要告知客户端relay server的地址,这个地址就是BND.ADDR和BND.PORT。
回复bind ip是192.168.1.207 :45474

2、认证阶段(也叫子协商)
认证阶段作为协商的一个子流程,它不是必须的。socks5服务器可以决定是否需要认证,如果不需要认证,那么认证阶段会被直接略过。
2.1客户端认证请求
如果需要认证,客户端向socks5服务器发起一个认证请求,这里以0x02的认证方式举例:
+----+------+----------+------+----------+
|VER | ULEN | UNAME | PLEN | PASSWD |
+----+------+----------+------+----------+
| 1 | 1 | 1 to 255 | 1 | 1 to 255 |
+----+------+----------+------+----------+
VER: 版本,通常为0x01
ULEN: 用户名长度
UNAME: 对应用户名的字节数据
PLEN: 密码长度
PASSWD: 密码对应的数据
2.2服务端认证响应
socks5服务器收到客户端的认证请求后,解析内容,验证信息是否合法,然后给客户端响应结果。响应格式如下:
+----+--------+
|VER | STATUS |
+----+--------+
| 1 | 1 |
+----+--------+
STATUS字段如果为0x00表示认证成功,其他的值为认证失败。当客户端收到认证失败的响应后,它将会断开连接

浙公网安备 33010602011771号