stun簡介

轉載 http://blog.csdn.net/mazidao2008/article/details/4934257後端

STUN(Simple Traversal of UDP over NATs,NAT 的UDP簡單穿越)是一種網絡協議,它容許位於NAT(或多重NAT)後的客戶端找出本身的公網地址,查出本身位於哪一種類型的NAT以後以及NAT爲某一個本地端口所綁定的Internet端端口。這些信息被用來在兩個同時處於NAT 路由器以後的主機之間創建UDP通訊。該協議由RFC 3489定義。 服務器

     一旦客戶端得知了Internet端的UDP端口,通訊就能夠開始了。若是NAT是徹底圓錐型的,那麼雙方中的任何一方均可以發起通訊。若是NAT是受限圓錐型或端口受限圓錐型,雙方必須一塊兒開始傳輸。 網絡

     須要注意的是,要使用STUN RFC中描述的技術並不必定須要使用STUN協議——還能夠另外設計一個協議並把相同的功能集成到運行該協議的服務器上。 數據結構

      SIP之類的協議是使用UDP分組在Internet上傳輸音頻和/或視頻數據的。STUN是一個客戶機-服務器協議。一個VoIP電話或軟件包可能會包括一個STUN客戶端。這個客戶端會向STUN服務器發送請求,以後,服務器就會向STUN客戶端報告NAT路由器的公網IP地址以及NAT爲容許傳入流量傳回內網而開通的端口。 spa

      以上的響應同時還使得STUN客戶端可以肯定正在使用的NAT類型——由於不一樣的NAT類型處理傳入的UDP分組的方式是不一樣的。四種主要類型中有三種是可使用的:徹底圓錐型NAT、受限圓錐型NAT和端口受限圓錐型NAT——但大型公司網絡中常常採用的對稱型NAT(又稱爲雙向NAT)則不能使用。.net

 

       Simple Traversal of User Datagram Protocol (UDP) Through Network設計

Address Translators (NATs) (STUN)視頻

      STUN,是爲了實現透明的穿透NAT,而定義的一套協議。它使本地的內網的機器,具備取得,可以得知它的NAT網關的IP,NAT類型的能力。server

 

      爲何須要STUN:blog

由於NAT雖然解決了IP地址稀少的問題,可是也帶來了不少的問題。好比全部P2P應用,像文件SHARE,要想穿透NAT,首先知道NAT的一些特性:

NAT分爲4種(加上防火牆的話,多幾種狀況):

 

 1.徹底透明NAT(Full Cone NAT):

      從相同內部主機(IN IPX) +端口(IN PORTX)發送的數據MAPING爲相同的IP(OUT IP X)和端口(OUT PORT X)發送帶外網.而且從另外一個服務器(Y),若是直連到MAPING的IP(OUT IP X)和端口(OUT PORT X )上,數據將會被轉發到內部主機上. (IN IPX), (IN PORTX).

也就是說進內部網的數據包的SPORT,SPORT不受限制

2.受限NAT(Restricted Cone),

    從相同內部主機(IN IPX) +端口(IN PORTX)發送的數據MAPING爲相同的IP(X)和端口發送帶外網.和徹底NAT不一樣的是,只有當爲X時,外部機器的的請求就被轉發到主機(IN IPX) +端口(IN PORTX)。也就是說進內部網的數據包的,SPORT不受限制,SIP受限制,只能爲NAT MAP數據的IP

3,端口受限NAT(Port Restricted Cone)

     和受限NAT不一樣的是,只有當外部主動請求的的源IP和端口,等於內部網發送的請求的目的IP和端口。

4.對稱NAT

     若是發送的包的目的IP AND PORT,那麼MAPPING IP AND PORT,將相同。內部網同一臺機器,同一個端口若是目的地址不一樣,那麼MAPPING的端口也不一樣,因此只有他主動連的服務器纔可能知道他的 MAPPING後端口,別的服務器若是想連他只能靠猜想端口。

總結:前面3重NAT,MAPING PORT 和 IP,是根據發送包的的內部網的IP和端口決定的。若是數據的內網IP和端口相同,那麼MAPPING後的端口和地址是固定。這個功能爲咱們的穿越提供了很好條件。

第4種NAT,打洞後的MAPPING 地址和端口將變地不可靠。很難穿越。注意SERVERA,和SERVERB是兩個公網地址,而不是兩臺機器.

 

 

STUN協議(淺析例子分析)

主要功能是檢測是否位於NAT後面,若是位於NAT後面,通過NAT轉換後的地址和端口是什麼,另外能夠檢測NAT的類型。

     基本思想

     在私網內部安裝一個STUN client,在公網上安裝一個STUN Server,STUN 協議定義了一些消息格式,大致上分紅Request/Response,client向server發送 request,server發送response給client。如何檢測STUN client是否在NAT後面呢?原理很簡單,Server在收到client的UDP包之後,Server將接收到該包的地址和端口利用udp傳回來給 client,client把這些地址和端口與本機的ip地址和端口進行比較,若是不一樣,說明在NAT後面,不然就位於NAT前面。爲了檢測不一樣類型的 NAT,STUN協議定義了一些消息屬性,要求Server有不一樣的動做,好比發送響應的時候使用不一樣的IP地址和端口,或者改變端口等等。STUN協議 對NAT可能有效,可是對防火牆就無能爲力了,由於防火牆可能不會打開UDP端口。

     NAT分類

STUN協議將NAT粗略分爲4種類型,即Full Cone、Restricted Cone、Port Restricted Cone和Symmetric。舉個實際例子來講明這四種NAT的區別:

A機器在私網(192.168.0.4)

NAT服務器(210.21.12.140)

B機器在公網(210.15.27.166)

C機器在公網(210.15.27.140)

如今,A機器鏈接過B機器,假設是 A(192.168.0.4:5000)-> NAT(轉換後210.21.12.140:8000)-> B(210.15.27.166:2000)。

同時A歷來沒有和C通訊過。

則對於不一樣類型的NAT,有下列不一樣的結果:

Full Cone NAT:C發數據到210.21.12.140:8000,NAT會將數據包送到A(192.168.0.4:5000)。由於NAT上已經有了192.168.0.4:5000到210.21.12.140:8000的映射。

Restricted Cone:C沒法和A通訊,由於A歷來沒有和C通訊過,NAT將拒絕C試圖與A鏈接的動做。但B能夠經過210.21.12.140:8000與A的 192.168.0.4:5000通訊,且這裏B可使用任何端口與A通訊。如:210.15.27.166:2001 -> 210.21.12.140:8000,NAT會送到A的5000端口上。

Port Restricted Cone:C沒法與A通訊,由於A歷來沒有和C通訊過。而B也只能用它的210.15.27.166:2000與A的192.168.0.4:5000通訊,由於A也歷來沒有和B的其餘端口通訊過。該類型NAT是端口受限的。

      Symmetric NAT:上面3種類型,統稱爲Cone NAT,有一個共同點:只要是從同一個內部地址和端口出來的包,NAT都將它轉換成同一個外部地址和端口。可是Symmetric有點不一樣,具體表如今: 只要是從同一個內部地址和端口出來,且到同一個外部目標地址和端口,則NAT也都將它轉換成同一個外部地址和端口。但若是從同一個內部地址和端口出來,是 到另外一個外部目標地址和端口,則NAT將使用不一樣的映射,轉換成不一樣的端口(外部地址只有一個,故不變)。並且和Port Restricted Cone同樣,只有曾經收到過內部地址發來包的外部地址,才能經過NAT映射後的地址向該內部地址發包。

現針對Symmetric NAT舉例說明:

A機器鏈接過B機器,假使是 A(192.168.0.4:5000)-> NAT(轉換後210.21.12.140:8000)-> B(210.15.27.166:2000)

若是此時A機器(192.168.0.4:5000)還想鏈接C機器 (210.15.27.140:2000),則NAT上產生一個新的映射,對應的轉換可能爲A(192.168.0.4:5000)-> NAT(轉換後210.21.12.140:8001)-> C(210.15.27.140:2000)。此時,B只能用它的210.15.27.166:2000經過NAT的210.21.12.140: 8000與A的192.168.0.4:5000通訊, C也只能用它的210.15.27.140:2000經過NAT的210.21.12.140:8001與A的192.168.0.4:5000通訊,而 B或者C的其餘端口則均不能和A的192.168.0.4:5000通訊。

 

 


STUN 的簡單操做過程:

發送請求。請求分爲兩種

1.Binding Requests, sent over UDP,

 用來發現NAT的公網地址,和MAPPING後的端口

 2.  Binding Response,

服務器產生Binding Response,並把獲得的MAPPINGIP 和端口,返回到客戶端, 客戶端比較MAPPING地址是否和本機地址相同,若是是說明是本機也是公網,不然判斷NAT的類型(判斷方法:client uses additional STUN Binding Requests)

3.Binding Error,

4.Shared Secret Requests, sent over TLS [2] over TCP.

這個請求要求服務器返回一臨時用戶名和密碼,用來下一步的Binding Requests/ Response,用來驗證信息的完整性

5.Shared Secret Response,

6 Shared Secret Error Response。

 


STUN 信息結構

STUN 由之後數據結構構成:STUN頭+STUN有效載荷

STUN頭結構以下: 存儲的值都是以網絡順序存放

字段    類型  

STUN message type    Short int    消息類型

Length    Short int    有效載荷長度,不包含頭長度

transaction ID    octet[16]    鏈接的ID值,檢查Request,和Response

STUN的有效載荷

SHUN的有效載荷是一些STUN的屬性構成,屬性的類型由信息的類型來決定。

STUN的屬性是定義好了的,屬性列表(attribute)以下:

MAPPED-ADDRESS    必選    用在Binding Response,(添入MAPING IP 和PORT)

RESPONSEADDRESS    可選    用在Binding Request,指定Response,發送到哪裏

若是沒有指定,Response發送到MAPING IP 和 PORT

CHANGE-REQUEST    可選    用在Binding Request。用來決定,CLIENT的NAT類型是

制NAT,仍是端口限制NAT,(命令服務器從不一樣的源端口/IP,Response請求)

CHANGED-ADDRESS    可選    用在Binding Responses告訴Client改變的端口和IP

SOURCE-ADDRESS    必選    只用在Binding Responses,標記信息的源PORT HE IP

USERNAME    可選    Shared Secret Response/ Binding Requests

PASSWORD,    必選    SharedSecret Response

ESSAGEINTEGRITY    可選    用在Binding Responses, Binding Request記錄信息的完整性

ERROR-CODE        Binding Error Response and Shared Secret Error Response.

UNKNOWN-ATTRIBUTES      

REFLECTED-FROM        Binding Responses.用於追溯和防止DDOS

 穿透的方法和過程

相關文章
相關標籤/搜索