SOCKS5协议连接过程
SOCKS5服务器默认监听的端口是1080端口
- 连接到服务器:SOCKS5客户端会通过TCP三次握手与SOCKS5服务器建立连接
- 协商过程:首先SOCKS5客户端会发送一个请求到服务器。告诉服务器自己支持什么方法。并带有一个方法列表(例如:
A
,B
,C
)。然后SOCKS5服务端会返回一个请求,告诉客户端要使用的方法(例如:B
) 然后客户端就会用过服务器选定的方法来验证。验证通过之后就会开始请求代理访问了 - 请求访问:客户端首先会向SOCKS5服务器发送一个请求。 告诉SOCKS5服务器自己想要发送的请求(例如: 想要通过TCP连接
baidu.com
的443
端口)。然后SOCKS5服务器会向baidu.com
的443
端口发送一个请求连接。将SOCKS5请求的内容原封不动的发送给目标。 然后再将目标的返回包原封不动的发送给SOCKS客户端 - 断开连接: 当客户端不再需要通过SOCKS5代理访问目标服务器时,会向SOCKS5服务器发送一个断开连接的请求。此请求通常是一个简单的命令,告知服务器关闭当前的连接会话。SOCKS5服务器收到断开请求后,会终止与目标服务器之间的连接,并且返回一个确认的响应给客户端,表示连接已经成功断开。
协商过程中客户端首次给服务器发送的请求包含1个byte的版本号 1个byte的支持的方法数 可变长的byte的具体的方法列表
VERSION | METHODS | METHODS |
---|---|---|
1 | 1 | 1 to 255 |
支持的身份验证方法列表
- X‘00’ :无认证
- X’01’:GASSAPI身份验证
- X’02’:用户/密码身份验证
- X’03’: 帐号令牌身份验证
SOCKS5服务器返回给SOCKS5客户端的包中包含了1个byte的版本号 1个byte的要采用的方法
VER | METHOD |
---|---|
1 | 1 |
请求过程中客户端向服务端中发送的请求中包含1个byte的版本号 1个版本的命令 1个byte的RSV 1个byte的ATYP 可变byte的目的地址 2个byte的端口
VER | CMD | RSV | ATYP | DST.ADDR | DST.PORT |
---|---|---|---|---|---|
1 | 1 | X’00’ | 1 | Variable | 2 |
VER:协议版本号,固定值 X’05’,表示 SOCKS5 协议
CMD常见的命令类型
- X’01’:连接 (CONNECT)
- X’02’:绑定 (BIND)
- X’03’:代理 (UDP ASSOCIATE)
RSV:保留字段,固定值 X’00’
ATYP:地址类型,表示目标地址的类型:
- X’01’: IPv4 地址
- X’03’: 域名地址
- X’04’: IPv6 地址
DST.ADDR:目标地址,根据 ATYP 类型而变化:
- 如果 ATYP 为 X’01’,DST.ADDR 为 4 字节的 IPv4 地址
- 如果 ATYP 为 X’03’,DST.ADDR 为 域名字符串
- 如果 ATYP 为 X’04’,DST.ADDR 为 16 字节的 IPv6 地址
DST.PORT:目标端口,使用网络字节序表示
SOCKS5服务端给客户端返回的包中会包含1个byte的版本号 1个byte的REP 1个byte的RSV 1个byte的ATYP 可变BYTE的绑定地址 2byte的绑定端口
VER | REP | RSV | ATYP | BND.ADDR | BND.PORT |
---|---|---|---|---|---|
1 | 1 | X’00’ | 1 | Variable | 2 |
REP:响应结果,表示连接是否成功:
- X’00’: 成功
- X’01’: 连接到目标地址失败
- X’02’:拒绝连接
- X’03’:目标网络不可达
- X’04’:目标主机不可达
- X’05’:连接被拒绝
- X’06’:目的主机不可达
其他的值与请求中的一一对应