socks5 代理工作流程和原理

马谦马谦马谦 计算机网络29,9433字数 1538阅读 5 分 7 秒阅读模式

一、 socks5 协议

socks5 协议是一款广泛使用的代理协议,它在使用 TCP/IP 协议通讯的前端机器和服务器机器之间扮演一个中介角色,使得内部网中的前端机器变得能够访问 Internet 网中的服务器,或者使通讯更加安全。 SOCKS5 服务器通过将前端发来的请求转发给真正的目标服务器, 模拟了一个前端的行为。在这里,前端和 SOCKS5 之间也是通过 TCP/IP 协议进行通讯,前端将原本要发送给真正服务器的请求发送给 SOCKS5 服务器,然后 SOCKS5 服务器将请求转发给真正的服务器。

代理的工作流程图为:

socks5代理工作流程和原理-图片1

二、 socks5 协议交互过程

2.1 基于 TCP 的客户端连接过程

第一步,客户端向代理服务器发送代理请求,其中包含了代理的版本和认证方式:

如果是 socks5 代理,第一个字段 VER 的值是 0x05,表明是 socks 代理的第 5 个版本。

第二个字段 NMETHODS 表示支持的认证方式,第三个字段是一个数组,包含了支持的认证方式列表:

  • 0x00: 不需要认证
  • 0x01: GSSAPI 认证
  • 0x02: 用户名和密码方式认证
  • 0x03: IANA 认证
  • 0x80-0xfe: 保留的认证方式
  • 0xff: 不支持任何认证方式

服务端收到客户端的代理请求后,选择双方都支持的加密方式回复给客户端:

此时客户端收到服务端的响应请求后,双方握手完成,开始进行协议交互。

数据包分析

客户端开启 socks 代理,使用浏览器访问网页。抓包软件抓到客户端的认证请求:

socks5代理工作流程和原理-图片2

服务端的认证响应请求:

socks5代理工作流程和原理-图片3

2.2 请求

握手完成后,客户端要把需要执行的操作指令发给客户端,表明自己要执行代理的请求。请求帧格式:

各字段含义:

  • VER: 代理版本信息
  • CMD: 代理指令
    • 0x01: connect 指令,tcp 代理时使用。
    • 0x02: bind,很少使用,类似 FTP 协议中主动连接场景,服务端后服务端会主动连接到客户端。
    • 0x03: udp 代理时使用。
  • RSV: 保留字段
  • ATYP: 地址类型
    • 0x01: IPv4 地址类型
    • 0x03: unix 域 socket 类型代理
    • 0x04: IPv6 地址类型
  • DST.ADDR: 需要连接的目的地址
  • DST.PORT: 需要连接的目的端口

数据包分析

以下是一个去往 console.cloud.tencent.com:443 的 socks5 代理请求:

socks5代理工作流程和原理-图片4

2.3 响应

客户端发完上面的请求连接后,服务端会发起连接到 DST.ADDR:DST.PORT,然后返回响应到客户端,响应格式:

其中 VER/RSV/ATYP 的含义和上面相同,其他字段的意思:

  • REP: 请求响应
    • 0x00: 成功
    • 0x01-0x08: 失败
    • 0x09-0xff: 未使用
  • BND.ADDR: 连接到的远程地址
  • BND.PORT: 连接到的远程端口

数据包分析

以下是上面代理请求的响应数据包:

socks5代理工作流程和原理-图片5

2.4 代理通信

当连接建立后,客户端就可以和正常一样访问服务端通信了,此时通信的数据除了目的地址是发往代理程序以外,所有内容都是和普通连接一模一样。对代理程序而言,后面所有收到的来自客户端的数据都会原样转发到服务读端。

例如代理的 HTTPS 请求连接,实际上发送的数据和普通 HTTPS 交互过程一模一样:

socks5代理工作流程和原理-图片6

中间的 Socks Protocol 栏是 wireshark 根据连接上下文自动解析出来的,实际上数据包中并没有这一栏。

三、流程图

socks5 通信的交互流程:

socks5代理工作流程和原理-图片7

四、参考

RFC1928 - SOCKS Protocol Version 5

RFC1929 - Username/Password Authentication for SOCKS V5

  最后更新:2021-2-23
马谦马谦马谦
  • 本文由 马谦马谦马谦 发表于 2020 年 3 月 8 日 15:16:47
  • 转载请务必保留本文链接:https://www.dyxmq.cn/network/socks5.html
wireshark导出https证书 计算机网络

wireshark 导出 https 证书

一、找到证书所在的数据包 证书是从服务端返回的,从 https 握手的过程来看,当服务端返回了 server hello 之后,就会主动将自己的证书返回给客户端,因此只要从 server hello 往后面找 1-...
创建自签名CA和SSL证书 计算机网络

创建自签名 CA 和 SSL 证书

一、创建 CA CA 全称是 CertificateAuthority,意思是证书颁发机构。只有当 CA 被认为是受信任的颁发机构时,经过该 CA 颁发出来的证书才属于受信任的证书。否则,认为证书是不受信任的。 为...
企业网络应该如何规划以减少各种网络问题? 计算机网络

企业网络应该如何规划以减少各种网络问题?

最近公司网络一直抽风,整个机房网络都不通,严重影响工作效率。后面花了大量人力解决问题后没多久,竟然又再次出现问题了。看着纷乱复杂的网络接线,我们也只是 「望洋兴叹」!因为参与了整个问题的处理过程 (我不是...
评论  2  访客  2
    • zjh
      zjh 0

      感谢分享,帮大忙了

        • anonymous
          anonymous 0

          @ zjh 不客气

      匿名

      发表评论

      匿名网友
      :?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:
      确定

      拖动滑块以完成验证