从零实现加密隧道(二):socks5 协议详解

      最后更新:2022-03-22 07:01:35 手机定位技术交流文章

      想知道你在这里做什么吗 ietf?
      SONKS5 是一个网络传输协议, 主要用于客户端与外联网服务器之间的中间通信传输。 SOCKS 是“ 仓库” 的缩写 。
      SONKS5 操作级别低于 HTTP 代理操作级别 。
      是一个代理协议,它充当前端计算机和服务器计算机之间的桥梁,通过TCP/IP协议进行沟通。因此,内联网的前端计算机现在可以连接到因特网上的服务器。相反,使通信更加安全。前端的请求通过 SOCKS5 服务器发送给真正的目的地服务器。此函数模拟前端行为 。在这里,TCP/IP协议还用于前端与SONKS5之间的通信。前端将实际服务器的请求传送到 SOCKS5 服务器。请求随后通过SONKS5服务器发送给实际服务器。

      第一步是委托人发送信头。

      VERSION METHODS_COUNT METHODS
      1字节 1字节 方法 COUNT 确定 1 至 255 字节的长度 。
      0x05 0x03 ……
      • 袜子版本,这是袜子5,所以0x05。

      • 方法部分的总长度。

      • 方法:代表客户加密。每种方法都需要一个字节。当前的定义是:

        • 0x00 不加密
        • 0x01 GSSAPI
        • 0x02 用户名和密码认证
        • IANA (保留) 0x03 - 0x7F
        • 0x80 - 0xFE 范围保留用于私人方法。
        • 没有适当的技术。

      例如,客户对代理选择有两个握手选择:“未加密”和“用户名、密码认证”。

      我们不必担心,因为我们把它写在服务器上 并转发给客户。

      步骤2——代理服务器响应头

      VERSION METHODS
      1字节 1字节
      0x05 选择客户端提供的加密算法之一 。
      • 袜子版本,这是袜子5,所以0x05。
      • 为代理服务器选择了握手。 它需要 1 字节 。

      例如,代理服务器提供的50种服务器的版本5选择“非加密”握手。

      如果客户的握手代理服务器未得到满足,则立即终止连接。

      如果代理服务器发送 5 2, 代表版本 5 选择“ 用户名、 密码验证” 握手 。 客户然后将账户密码数据传送到代理服务器, 由服务器验证并提供结果 。

      VERSION USERNAME_LENGTH USERNAME PASSWORD_LENGTH PASSWORD
      1字节 1字节 1-255字节 1字节 1-255字节
      0x01 0x01 …… 0x01 ……
      • VERSION:认证分会的版本(不得与SOCKS 0x05版本相混淆)。
      • USNAME_ LENTH: 用户名长度
      • 用户名区域阵列 USERNAME_LENTH 的长度 。
      • PASSWORD_ entth: 密码的长度
      • 密码字节阵列,其长度为 PASSWORD_LENGTH 。
      VERSION USERNAME_LENGTH
      1字节 1字节
      0x01 0x01
      • VerSION: 根据客户 VerSION 字段认证分咨询版本
      • 状态: 认证结果 (0x00 认证成功 / > 0x00 认证失败)

      本案需要服务器回应

      步骤3 - 客户提交IP地址和进入的港口以及使用的程序。

      VERSION COMMAND RSV ADDRESS_TYPE DST.ADDR DST.PORT
      1字节 1字节 1字节 1字节 可变成长度 2字节
      • SONKS协议版本,0x05校正
      • 命令
        • 0x01: 连接上游服务器的请求(通过TCP)
        • 0x02: BIND 具有约束力、客户端接收代理服务器链接以及众所周知的FTP被动模式
        • UDP ASSOCITE UDP 中继(UDP 前向) 0x03
      • RSV:无实际效果的外地保留
      • 目标服务器地址类型 。
        • 0x01: IPv4 地址 。
        • 0x03: 域名地址( 这里没有 0x02)
        • IPv6 地址 0x04
      • DST.ADDR: 脱用服务器的地址( 在 IPv6 中, 字段的第一个字节表示域名的长度, 剩下的字节是域名) 代表ST. ADDR: 脱用服务器的地址( 在 IPv6 中, 字段的第一个字节表示域名的长度, 剩下的字节是域名 。
      • DST. port是目标服务器端口。

      因为我们在服务器的侧面写作, 我们可以在下一步评估这一步。

      第四步是等待代理服务器的回复 。

      VERSION RESPONSE RSV ADDRESS_TYPE BND.ADDR BND.PORT
      1字节 1字节 1字节 1字节 1-255字节 2字节
      • SONKS协议版本,0x05校正
      • 反应对命令。
        • 0x00: 代理服务器成功连接到目标服务器
        • 0x01: 代理服务器失败
        • 0x02: 代理规则集禁止连接 。
        • 0x03: 网络无法访问 。
        • 0x04: 目标服务器无法到达( 主机名不正确) 。
        • 0x05: 目标服务器的连接被拒绝 。
        • 0x06: TTL 已过期 。
        • 0x07: 未知指令
        • 0x08: 不支持目标服务器地址类型 。
        • 0x09 - 0xFF: 未分配
      • RSV:保留字段
      • 地址类型:地址的地址类型。
        • 0x01:ipv4
        • 0x03:域名
        • 0x04:ipv6
      • 抱歉, BND. ADD: 一旦代理服务器成功连接到目标服务器, 代理服务器
      • 抱歉, BND. Pport: 代理服务器成功连接到目标服务器后代理端口

      第五步——通信

      发送任何你想要的,就像正常的套接字程序一样。

      参考:
      https://www.jianshu.com/p/91979534b49d
      https://www.ddhigh.com/2019/08/24/socks5-protocol.html

      本文由 在线网速测试 整理编辑,转载请注明出处,原文链接:https://www.wangsu123.cn/news/20654.html

          热门文章

          文章分类