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
,所以值是0x05
NMETHODS
是指有多少个可以使用的方法,也就是客户端支持的认证方法,有以下值:0x00
NO AUTHENTICATION REQUIRED 不需要认证0x01
GSSAPI 参考:https://en.wikipedia.org/wiki/Generic_Security_Services_Application_Program_Interface0x02
USERNAME/PASSWORD 用户名密码认证0x03
to0x7f
IANA ASSIGNED 一般不用。INNA保留。0x80
to0xfe
RESERVED FOR PRIVATE METHODS 保留作私有用处。0xFF
NO 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
还是版本,取值是0x05
CMD
是指要做啥,取值如下:- CONNECT
0x01
连接 - BIND
0x02
端口监听(也就是在Server上监听一个端口) - UDP ASSOCIATE
0x03
使用UDP
- CONNECT
RSV
是保留位,值是0x00
ATYP
是目标地址类型,有如下取值:0x01
IPv40x03
域名0x04
IPv6
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
还是版本,值是0x05
REP
是状态码,取值如下:0x00
succeeded0x01
general SOCKS server failure0x02
connection not allowed by ruleset0x03
Network unreachable0x04
Host unreachable0x05
Connection refused0x06
TTL expired0x07
Command not supported0x08
Address type not supported0x09
to0xff
unassigned
RSV
保留位,取值为0x00
ATYP
是目标地址类型,有如下取值:0x01
IPv40x03
域名0x04
IPv6
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
表示认证成功,其他的值为认证失败。当客户端收到认证失败的响应后,它将会断开连接