天天看點

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一大堆

繼續閱讀