STUN簡要
STUN (Simple Traversal of UDP over NATs, NAT 的UDP簡單穿越 ) 是一種網絡協議 。 它同意位于NAT(或多重NAT)后的client找出自己的公網地址。查出自己位于哪種類型的NAT之后以及NAT為某一個本地port所綁定的Internet端port 。這些信息被用來在兩個同一時候處于NAT 路由器之后的主機之間建立UDP通信。該協議由RFC 3489定義。
???? 一旦client得知了Internet端的UDPport。通信就能夠開始了。假設NAT是全然圓錐型的,那么兩方中的不論什么一方都能夠發起通信。假設NAT是受限圓錐型或port受限圓錐型,兩方必須一起開始傳輸。
???? 須要注意的是。要使用STUN RFC中描寫敘述的技術并不一定須要使用STUN協議——還能夠另外設計一個協議并把同樣的功能集成到執行該協議的server上。
????? SIP之類的協議是使用UDP分組在Internet上傳輸音頻和/或視頻數據的 。
不幸的是,因為通信的兩個末端往往位于NAT之后,因此用傳統的方法是無法建立連接的。這也就是STUN發揮作用的地方。
????? STUN是一個客戶機-server協議 。一個VoIP電話或軟件包可能會包含一個STUNclient。這個client會向STUNserver發送請求,之后。server就會向STUNclient報告NAT路由器的公網IP地址以及NAT為同意傳入流量傳回內網而開通的port。
????? 以上的響應同一時候還使得STUNclient可以確定正在使用的NAT類型—— 由于不同的NAT類型處理傳入的UDP分組的方式是不同的 。
四種主要類型中有三種是可以使用的 :全然圓錐型NAT、受限圓錐型NAT和port受限圓錐型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) +port(IN PORTX)發送的數據MAPING為同樣的IP(OUT IP X)和port(OUT PORT X)發送帶外網.而且從還有一個server(Y)。假設直連到MAPING的IP(OUT IP X)和port(OUT PORT X )上,數據將會被轉發到內部主機上. (IN IPX), (IN PORTX).
也就是說進內部網的數據包的SPORT,SPORT不受限制
2.受限NAT(Restricted Cone),
??? 從同樣內部主機(IN IPX) +port(IN PORTX)發送的數據MAPING為同樣的IP(X)和port發送帶外網.和全然NAT不同的是。僅僅有當為X時,外部機器的的請求就被轉發到主機(IN IPX) +port(IN PORTX)。
也就是說進內部網的數據包的,SPORT不受限制,SIP受限制,僅僅能為NAT MAP數據的IP
3,port受限NAT(Port Restricted Cone)
???? 和受限NAT不同的是。僅僅有當外部主動請求的的源IP和port,等于內部網發送的請求的目的IP和port。
4.對稱NAT
???? 假設發送的包的目的IP AND PORT,那么MAPPING IP AND PORT,將同樣。
內部網同一臺機器,同一個port假設目的地址不同,那么MAPPING的port也不同。所以僅僅有他主動連的server才可能知道他的MAPPING后port。別的server假設想連他僅僅能靠推測port。
總結:前面3重NAT。MAPING PORT 和 IP,是依據發送包的的內部網的IP和port決定的。假設數據的內網IP和port同樣,那么MAPPING后的port和地址是固定。這個功能為我們的穿越提供了非常好條件。
第4種NAT,打洞后的MAPPING 地址和port將變地不可靠。非常難穿越 。
注意SERVERA,和SERVERB是兩個公網地址。而不是兩臺機器.
?
?
STUN協議 (淺析樣例分析)
主要功能是檢測是否位于NAT后面。假設位于NAT后面。經過NAT轉換后的地址和port是什么,另外能夠檢測NAT的類型。
???? 基本思想
???? 在私網內部安裝一個STUN client。在公網上安裝一個STUN Server 。STUN協議定義了一些消息格式,大體上分成Request/Response,client向server發送 request,server發送response給client。
怎樣檢測STUN client是否在NAT后面呢?原理非常easy,Server在收到client的UDP包以后,Server將接收到該包的地址和port利用udp傳回來給 client。client把這些地址和port與本機的ip地址和port進行比較。假設不同,說明在NAT后面。否則就位于NAT前面。
為了檢測不同類型的 NAT,STUN協議定義了一些消息屬性。要求Server有不同的動作,比方發送響應的時候使用不同的IP地址和port,或者改變port等等。 STUN協議 對NAT可能有效,可是對防火墻就無能為力了。由于防火墻可能不會打開UDPport 。
???? NAT分類
STUN協議將NAT粗略分為4種類型,即Full Cone、Restricted Cone、Port Restricted Cone和Symmetric。舉個實際樣例來說明這四種NAT的差別:
A機器在私網(192.168.0.4)
NATserver(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能夠使用不論什么port與A通信。如:210.15.27.166:2001 -> 210.21.12.140:8000,NAT會送到A的5000port上。
Port Restricted Cone:C無法與A通信,由于A從來沒有和C通信過。而B也僅僅能用它的210.15.27.166:2000與A的192.168.0.4:5000通信。由于A也從來沒有和B的其它port通信過。該類型NAT是port受限的。
????? Symmetric NAT: 上面3種類型,統稱為Cone NAT。有一個共同點:僅僅要是從同一個內部地址和port出來的包,NAT都將它轉換成同一個外部地址和port 。 可是Symmetric有點不同,詳細表如今: 僅僅要是從同一個內部地址和port出來,且到同一個外部目標地址和port,則NAT也都將它轉換成同一個外部地址和port。但假設從同一個內部地址和port出來。是 到還有一個外部目標地址和port,則NAT將使用不同的映射。轉換成不同的port(外部地址僅僅有一個,故不變)。 并且和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的其它port則均不能和A的192.168.0.4:5000通信。
?
?
STUN 的簡單操作過程:
發送請求。請求分為兩種
1.Binding Requests, sent over UDP,
?用來發現NAT的公網地址,和MAPPING后的port
?2.??Binding Response,
server產生Binding Response。并把得到的MAPPINGIP 和port。返回到client, client比較MAPPING地址是否和本機地址同樣。假設是說明是本機也是公網,否則推斷NAT的類型(推斷方法:client uses additional STUN Binding Requests)
3.Binding Error。
4.Shared Secret Requests, sent over TLS [2] over TCP.
這個請求要求server返回一暫時username和password。用來下一步的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,還是port限制NAT,(命令server從不同的源port/IP,Response請求)
CHANGED-ADDRESS??? 可選??? 用在Binding Responses告訴Client改變的port和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
?通過這些方法和過程
?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
