天天看点

Sock5协议详解Sock5协议详解

Sock5协议详解

由于项目需求,最近需要了解一些代理的知识,因此看了一下sock5协议。主要还是RFC1928.也参考
   了网上的一些翻译。

      防火墙的使用,有效的隔离了机构内部网络和外部网络,这种类型的Internet架构变得越来越流行
   了。这种防火墙系统大都充当着网络之间的应用层网关的角色,通常提供经过控制的Telnet、FTP和
   SMTP访问。为了推动全球信息的交流,更多的新的应用层协议的推出,这就有必要提供一个总的架构使这
   些协议能够更明显和更安全的穿过防火墙,也有必要在实际上为它们穿过防火墙提供一个更强的认证制。
   这种需要源于客户机服务器联系在不同组织网络之间的实现,而这种联系需要得到控制并有安全的认
   证。在这儿所描述的协议框架是为了让使用TCP和UDP的客户服务器应用程序更方便地使用网络防火墙所提
   供的服务所设计的。这个协议从概念上来讲是介于应用层和传输层之间的“中介层”,因而不提供如传递
   ICMP信息之类由网络层网关的所提供的服务。
           

基于TCP协议的客户

当一个基于TCP协议的客户端希望与一个只能通过防火墙可以到达的目标(这个由实现决定的)建立连接,
    它必须先建立一个与socks服务器上socks端口的TCP连接。通常这个TCP端口是1080。当连接建立后,
    客户端进入协议的“握手”过程:认证方式的选择,根据选中的方式进行认证,然后发送转发的请求。
    sockds服务器检查这个请求,根据结果,或建立合适的连接,或拒绝。

    除非特别声明,所有出现的数据格式图中的十进制均表示相应域的字节长度,如果某域需要给定一个字节的
    值,用X'hh'来表示这个字节中的值。如果某域中用到单词'Variable',这表示该域的长度是可变的,且
    该长度定义在一个和这个域相关联(1-2个字节)的域中,或一个数据类型中。
           

第一步

客户端连到服务器后,然后就发送请求来协商版本和认证方法:
  **客户端** 请求第一步
  +----+----------+----------+ 
  | 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 | 
  +----+--------+ 
  | 1 |  1   | 
  +----+--------+ 
           

第二步

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

  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字节数据
           

connect命令

假设CMD为CONNECT,SOCKS Client、SOCKS Server之间通信的相关四元组是:
 SOCKSCLIENT.ADDR,SOCKSCLIENT.PORT,SOCKSSERVER.ADDR,SOCKSSERVER.PORT

 一般SOCKSSERVER.PORT是1080/TCP。
 CONNECT请求包中的DST.ADDR/DST.PORT指明转发目的地。SOCKS Server可以靠
 DST.ADDR、DST.PORT、SOCKSCLIENT.ADDR、SOCKSCLIENT.PORT进行评估,以决定建立到转发
 目的地的TCP连接还是拒绝转发。

 假设规则允许转发并且成功建立到转发目的地的TCP连接,相关四元组是:
 BND.ADDR,BND.PORT,DST.ADDR,DST.PORT
 此时SOCKS Server向SOCKS Client发送的CONNECT响应包中将指明BND.ADDR/BND.PORT。
 注意,BND.ADDR可能不同于SOCKSSERVER.ADDR,SOCKS Server所在主机可能是多目
 (multi-homed)主机。

 假设拒绝转发或未能成功建立到转发目的地的TCP连接,CONNECT响应包中REP字段将指明具体原因。

 响应包中REP非零时表示失败,SOCKS Server必须在发送响应包后不久(不超过10s)关闭与
 SOCKS Client之间的TCP连接。
 响应包中REP为零时表示成功。之后SOCKS Client直接在当前TCP连接上发送待转发数据。
           

BIND命令 ####

假设CMD为BIND。这多用于FTP协议,FTP协议在某些情况下要求FTP Server主动建立
 到FTP Client的连接,即FTP数据流。
 FTP Client - SOCKS Client - SOCKS Server - FTP Server
           

参考文章

Socks5协议中文文档(RFC1928)

socks4 socks5 rfc1928一大堆

继续阅读