socks5认证过程

socks5认证过程

  • 过程
    • 客户端发起请求
      • 无认证客户端发送
      • 账户密码认证客户端发送
    • 服务端验证
    • 命令过程
  • 参考文章

过程

客户端发起请求

 客户端连到服务器后,然后就发送请求来协商版本和认证方法:
  **客户端** 请求第一步
  +----+----------+----------+ 
  | VER|NMETHODS  | METHODS  |
  +----+----------+----------+ 
  | 1  |    1     | 1 - 255  |
  +----+----------+----------+ 
  VER 表示版本号:sock5 为 X'05'
  NMETHODS(方法选择)中包含在METHODS(方法)中出现的方法标识的数据(用字节表示)

  目前定义的METHOD有以下几种:
  X'00'  无需认证
  X'01'  通用安全服务应用程序(GSSAPI)
  X'02'  用户名/密码 auth (USERNAME/PASSWORD)
  X'03'- X'7F' IANA 分配(IANA ASSIGNED) 
  X'80'- X'FE' 私人方法保留(RESERVED FOR PRIVATE METHODS) 
  X'FF'  无可接受方法(NO ACCEPTABLE METHODS) 

  **服务器** 响应第一步
  服务器从客户端发来的消息中选择一种方法作为返回
  服务器从METHODS给出的方法中选出一种,发送一个METHOD(方法)选择报文:
  +----+--------+ 
  |VER | METHOD | 
  +----+--------+ 
  |0x05|  0x00 | 
  +----+--------+ 

无认证客户端发送

  +----+--------+ 
  |VER | METHOD | 
  +----+--------+ 
  | 1 |  0   | 
  +----+--------+ 

账户密码认证客户端发送

  +----+------+----------+------+----------+
  |VER | ULEN |  UNAME   | PLEN |  PASSWD  |
  +----+------+----------+------+----------+
  |0x05|  1   | 1 to 255 |  1   | 1 to 255 |
  +----+------+----------+------+----------+

VERSION 认证子协商版本(与SOCKS协议版本的0x05无关系)
USERNAME_LENGTH 用户名长度
USERNAME 用户名字节数组,长度为USERNAME_LENGTH
PASSWORD_LENGTH 密码长度
PASSWORD 密码字节数组,长度为PASSWORD_LENGTH

服务端验证

  +----+--------+
  |VER | STATUS |
  +----+--------+
  |0x05|   1    |
  +----+--------+

VERSION 认证子协商版本,与客户端VERSION字段一致
STATUS 认证结果
0x00 认证成功
大于0x00 认证失败

命令过程

 一旦方法选择子商议结束,客户机就发送请求细节。如果商议方法包括了完整性检查的目的或机密性封装
  ,则请求必然被封在方法选择的封装中。 

  SOCKS请求如下表所示:
  +----+-----+-------+------+----------+----------+ 
  | VER| CMD | RSV   | ATYP |  DST.ADDR|  DST.PORT|
  +----+-----+-------+------+----------+----------+ 
  | 1  | 1   | X'00' | 1    | variable |      2   |
  +----+-----+-------+------+----------+----------+ 

  各个字段含义如下:
  VER  版本号X'05'
  CMD:  
       1. CONNECT X'01'
       2. BIND    X'02'
       3. UDP ASSOCIATE X'03'
  RSV  保留字段
  ATYP IP类型 
       1.IPV4 X'01'
       2.DOMAINNAME X'03'
       3.IPV6 X'04'
  DST.ADDR 目标地址 
       1.如果是IPv4地址,这里是big-endian序的4字节数据
       2.如果是FQDN,比如"www.nsfocus.net",这里将是:
         0F 77 77 77 2E 6E 73 66 6F 63 75 73 2E 6E 65 74
         注意,没有结尾的NUL字符,非ASCIZ串,第一字节是长度域
       3.如果是IPv6地址,这里是16字节数据。
  DST.PORT 目标端口(按网络次序排列) 

 **sock5响应如下:**
 OCKS Server评估来自SOCKS Client的转发请求并发送响应报文:
 +----+-----+-------+------+----------+----------+
 |VER | REP |  RSV  | ATYP | BND.ADDR | BND.PORT |
 +----+-----+-------+------+----------+----------+
 | 1  |  1  | X'00' |  1   | Variable |    2     |
 +----+-----+-------+------+----------+----------+
 VER  版本号X'05'
 REP  
      1. 0x00        成功
      2. 0x01        一般性失败
      3. 0x02        规则不允许转发
      4. 0x03        网络不可达
      5. 0x04        主机不可达
      6. 0x05        连接拒绝
      7. 0x06        TTL超时
      8. 0x07        不支持请求包中的CMD
      9. 0x08        不支持请求包中的ATYP
      10. 0x09-0xFF   unassigned
 RSV         保留字段,必须为0x00
 ATYP        用于指明BND.ADDR域的类型
 BND.ADDR    CMD相关的地址信息,不要为BND所迷惑
 BND.PORT    CMD相关的端口信息,big-endian序的2字节数据

参考文章

https://www.cnblogs.com/yinzhengjie/p/7357860.html
https://blog.csdn.net/suifengdeshitou/article/details/48782667
https://www.ddhigh.com/2019/08/24/socks5-protocol.html
https://www.ietf.org/rfc/rfc1928.txt
https://www.ietf.org/rfc/rfc1929.txt

你可能感兴趣的:(编程开发,http,tcp/ip)