SOCKS5协议连接过程

SOCKS5服务器默认监听的端口是1080端口

  1. 连接到服务器:SOCKS5客户端会通过TCP三次握手与SOCKS5服务器建立连接
  2. 协商过程:首先SOCKS5客户端会发送一个请求到服务器。告诉服务器自己支持什么方法。并带有一个方法列表(例如:A,B,C)。然后SOCKS5服务端会返回一个请求,告诉客户端要使用的方法(例如:B) 然后客户端就会用过服务器选定的方法来验证。验证通过之后就会开始请求代理访问了
  3. 请求访问:客户端首先会向SOCKS5服务器发送一个请求。 告诉SOCKS5服务器自己想要发送的请求(例如: 想要通过TCP连接baidu.com443端口)。然后SOCKS5服务器会向baidu.com443端口发送一个请求连接。将SOCKS5请求的内容原封不动的发送给目标。 然后再将目标的返回包原封不动的发送给SOCKS客户端
  4. 断开连接: 当客户端不再需要通过SOCKS5代理访问目标服务器时,会向SOCKS5服务器发送一个断开连接的请求。此请求通常是一个简单的命令,告知服务器关闭当前的连接会话。SOCKS5服务器收到断开请求后,会终止与目标服务器之间的连接,并且返回一个确认的响应给客户端,表示连接已经成功断开。

图示

image-20241107004050614

协商过程中客户端首次给服务器发送的请求包含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’:目的主机不可达

其他的值与请求中的一一对应