STUN協議簡析

STUN簡介

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上傳輸音頻和/或視頻數據的不幸的是,由於通信的兩個末端往往位於NAT之後,因此用傳統的方法是無法建立連接的。這也就是STUN發揮作用的地方。

      STUN是一個客戶機-服務器協議。一個VoIP電話或軟件包可能會包括一個STUN客戶端。這個客戶端會向STUN服務器發送請求,之後,服務器就會向STUN客戶端報告NAT路由器的公網IP地址以及NAT爲允許傳入流量傳回內網而開通的端口。

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

 

       Simple Traversal of User Datagram Protocol (UDP) Through Network

Address Translators (NATs) (STUN)

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

 

      爲什麼需要STUN:

因爲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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章