STUN簡(jiǎn)要
STUN (Simple Traversal of UDP over NATs, NAT 的UDP簡(jiǎn)單穿越 ) 是一種網(wǎng)絡(luò)協(xié)議 。 它同意位于NAT(或多重NAT)后的client找出自己的公網(wǎng)地址。查出自己位于哪種類(lèi)型的NAT之后以及NAT為某一個(gè)本地port所綁定的Internet端port 。這些信息被用來(lái)在兩個(gè)同一時(shí)候處于NAT 路由器之后的主機(jī)之間建立UDP通信。該協(xié)議由RFC 3489定義。
???? 一旦client得知了Internet端的UDPport。通信就能夠開(kāi)始了。假設(shè)NAT是全然圓錐型的,那么兩方中的不論什么一方都能夠發(fā)起通信。假設(shè)NAT是受限圓錐型或port受限圓錐型,兩方必須一起開(kāi)始傳輸。
???? 須要注意的是。要使用STUN RFC中描寫(xiě)敘述的技術(shù)并不一定須要使用STUN協(xié)議——還能夠另外設(shè)計(jì)一個(gè)協(xié)議并把同樣的功能集成到執(zhí)行該協(xié)議的server上。
????? SIP之類(lèi)的協(xié)議是使用UDP分組在Internet上傳輸音頻和/或視頻數(shù)據(jù)的 。
不幸的是,因?yàn)橥ㄐ诺膬蓚€(gè)末端往往位于NAT之后,因此用傳統(tǒng)的方法是無(wú)法建立連接的。這也就是STUN發(fā)揮作用的地方。
????? STUN是一個(gè)客戶(hù)機(jī)-server協(xié)議 。一個(gè)VoIP電話(huà)或軟件包可能會(huì)包含一個(gè)STUNclient。這個(gè)client會(huì)向STUNserver發(fā)送請(qǐng)求,之后。server就會(huì)向STUNclient報(bào)告NAT路由器的公網(wǎng)IP地址以及NAT為同意傳入流量傳回內(nèi)網(wǎng)而開(kāi)通的port。
????? 以上的響應(yīng)同一時(shí)候還使得STUNclient可以確定正在使用的NAT類(lèi)型—— 由于不同的NAT類(lèi)型處理傳入的UDP分組的方式是不同的 。
四種主要類(lèi)型中有三種是可以使用的 :全然圓錐型NAT、受限圓錐型NAT和port受限圓錐型NAT——但大型公司網(wǎng)絡(luò)中常常採(cǎi)用的 對(duì)稱(chēng)型NAT(又稱(chēng)為雙向NAT)則不能使用 。
?
?????? Simple Traversal of User Datagram Protocol (UDP) Through Network
Address Translators (NATs) (STUN)
????? STUN,是為了實(shí)現(xiàn)透明的穿透NAT,而定義的一套協(xié)議 。 它使本地的內(nèi)網(wǎng)的機(jī)器。具有取得,可以得知它的NAT網(wǎng)關(guān)的IP,NAT類(lèi)型的能力 。
?
????? 為什么須要STUN:
由于NAT盡管攻克了IP地址稀少的問(wèn)題,可是也帶來(lái)了非常多的問(wèn)題。比方全部P2P應(yīng)用,像文件SHARE。 多媒體 ,和在線游戲等等.
????? 要想穿透NAT,首先知道NAT的一些特性:
NAT分為4種(加上防火墻的話(huà),多幾種情況):
?
?1.全然透明NAT(Full Cone NAT):
????? 從同樣內(nèi)部主機(jī)(IN IPX) +port(IN PORTX)發(fā)送的數(shù)據(jù)MAPING為同樣的IP(OUT IP X)和port(OUT PORT X)發(fā)送帶外網(wǎng).而且從還有一個(gè)server(Y)。假設(shè)直連到MAPING的IP(OUT IP X)和port(OUT PORT X )上,數(shù)據(jù)將會(huì)被轉(zhuǎn)發(fā)到內(nèi)部主機(jī)上. (IN IPX), (IN PORTX).
也就是說(shuō)進(jìn)內(nèi)部網(wǎng)的數(shù)據(jù)包的SPORT,SPORT不受限制
2.受限NAT(Restricted Cone),
??? 從同樣內(nèi)部主機(jī)(IN IPX) +port(IN PORTX)發(fā)送的數(shù)據(jù)MAPING為同樣的IP(X)和port發(fā)送帶外網(wǎng).和全然NAT不同的是。僅僅有當(dāng)為X時(shí),外部機(jī)器的的請(qǐng)求就被轉(zhuǎn)發(fā)到主機(jī)(IN IPX) +port(IN PORTX)。
也就是說(shuō)進(jìn)內(nèi)部網(wǎng)的數(shù)據(jù)包的,SPORT不受限制,SIP受限制,僅僅能為NAT MAP數(shù)據(jù)的IP
3,port受限NAT(Port Restricted Cone)
???? 和受限NAT不同的是。僅僅有當(dāng)外部主動(dòng)請(qǐng)求的的源IP和port,等于內(nèi)部網(wǎng)發(fā)送的請(qǐng)求的目的IP和port。
4.對(duì)稱(chēng)NAT
???? 假設(shè)發(fā)送的包的目的IP AND PORT,那么MAPPING IP AND PORT,將同樣。
內(nèi)部網(wǎng)同一臺(tái)機(jī)器,同一個(gè)port假設(shè)目的地址不同,那么MAPPING的port也不同。所以?xún)H僅有他主動(dòng)連的server才可能知道他的MAPPING后port。別的server假設(shè)想連他僅僅能靠推測(cè)port。
總結(jié):前面3重NAT。MAPING PORT 和 IP,是依據(jù)發(fā)送包的的內(nèi)部網(wǎng)的IP和port決定的。假設(shè)數(shù)據(jù)的內(nèi)網(wǎng)IP和port同樣,那么MAPPING后的port和地址是固定。這個(gè)功能為我們的穿越提供了非常好條件。
第4種NAT,打洞后的MAPPING 地址和port將變地不可靠。非常難穿越 。
注意SERVERA,和SERVERB是兩個(gè)公網(wǎng)地址。而不是兩臺(tái)機(jī)器.
?
?
STUN協(xié)議 (淺析樣例分析)
主要功能是檢測(cè)是否位于NAT后面。假設(shè)位于NAT后面。經(jīng)過(guò)NAT轉(zhuǎn)換后的地址和port是什么,另外能夠檢測(cè)NAT的類(lèi)型。
???? 基本思想
???? 在私網(wǎng)內(nèi)部安裝一個(gè)STUN client。在公網(wǎng)上安裝一個(gè)STUN Server 。STUN協(xié)議定義了一些消息格式,大體上分成Request/Response,client向server發(fā)送 request,server發(fā)送response給client。
怎樣檢測(cè)STUN client是否在NAT后面呢?原理非常easy,Server在收到client的UDP包以后,Server將接收到該包的地址和port利用udp傳回來(lái)給 client。client把這些地址和port與本機(jī)的ip地址和port進(jìn)行比較。假設(shè)不同,說(shuō)明在NAT后面。否則就位于NAT前面。
為了檢測(cè)不同類(lèi)型的 NAT,STUN協(xié)議定義了一些消息屬性。要求Server有不同的動(dòng)作,比方發(fā)送響應(yīng)的時(shí)候使用不同的IP地址和port,或者改變port等等。 STUN協(xié)議 對(duì)NAT可能有效,可是對(duì)防火墻就無(wú)能為力了。由于防火墻可能不會(huì)打開(kāi)UDPport 。
???? NAT分類(lèi)
STUN協(xié)議將NAT粗略分為4種類(lèi)型,即Full Cone、Restricted Cone、Port Restricted Cone和Symmetric。舉個(gè)實(shí)際樣例來(lái)說(shuō)明這四種NAT的差別:
A機(jī)器在私網(wǎng)(192.168.0.4)
NATserver(210.21.12.140)
B機(jī)器在公網(wǎng)(210.15.27.166)
C機(jī)器在公網(wǎng)(210.15.27.140)
如今,A機(jī)器連接過(guò)B機(jī)器,如果是 A(192.168.0.4:5000)-> NAT(轉(zhuǎn)換后210.21.12.140:8000)-> B(210.15.27.166:2000)。
同一時(shí)候A從來(lái)沒(méi)有和C通信過(guò)。
則對(duì)于不同類(lèi)型的NAT,有下列不同的結(jié)果:
Full Cone NAT:C發(fā)數(shù)據(jù)到210.21.12.140:8000。NAT會(huì)將數(shù)據(jù)包送到A(192.168.0.4:5000)。由于NAT上已經(jīng)有了192.168.0.4:5000到210.21.12.140:8000的映射。
Restricted Cone:C無(wú)法和A通信。由于A從來(lái)沒(méi)有和C通信過(guò),NAT將拒絕C試圖與A連接的動(dòng)作。但B能夠通過(guò)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會(huì)送到A的5000port上。
Port Restricted Cone:C無(wú)法與A通信,由于A從來(lái)沒(méi)有和C通信過(guò)。而B(niǎo)也僅僅能用它的210.15.27.166:2000與A的192.168.0.4:5000通信。由于A也從來(lái)沒(méi)有和B的其它port通信過(guò)。該類(lèi)型NAT是port受限的。
????? Symmetric NAT: 上面3種類(lèi)型,統(tǒng)稱(chēng)為Cone NAT。有一個(gè)共同點(diǎn):僅僅要是從同一個(gè)內(nèi)部地址和port出來(lái)的包,NAT都將它轉(zhuǎn)換成同一個(gè)外部地址和port 。 可是Symmetric有點(diǎn)不同,詳細(xì)表如今: 僅僅要是從同一個(gè)內(nèi)部地址和port出來(lái),且到同一個(gè)外部目標(biāo)地址和port,則NAT也都將它轉(zhuǎn)換成同一個(gè)外部地址和port。但假設(shè)從同一個(gè)內(nèi)部地址和port出來(lái)。是 到還有一個(gè)外部目標(biāo)地址和port,則NAT將使用不同的映射。轉(zhuǎn)換成不同的port(外部地址僅僅有一個(gè),故不變)。 并且和Port Restricted Cone一樣,僅僅有以前收到過(guò)內(nèi)部地址發(fā)來(lái)包的外部地址,才干通過(guò)NAT映射后的地址向該內(nèi)部地址發(fā)包。
現(xiàn)針對(duì)Symmetric NAT舉例說(shuō)明:
A機(jī)器連接過(guò)B機(jī)器,假使是 A(192.168.0.4:5000)-> NAT(轉(zhuǎn)換后210.21.12.140:8000)-> B(210.15.27.166:2000)
假設(shè)此時(shí)A機(jī)器(192.168.0.4:5000)還想連接C機(jī)器 (210.15.27.140:2000),則NAT上產(chǎn)生一個(gè)新的映射,相應(yīng)的轉(zhuǎn)換可能為A(192.168.0.4:5000)-> NAT(轉(zhuǎn)換后210.21.12.140:8001)-> C(210.15.27.140:2000)。此時(shí)。B僅僅能用它的210.15.27.166:2000通過(guò)NAT的210.21.12.140: 8000與A的192.168.0.4:5000通信, C也僅僅能用它的210.15.27.140:2000通過(guò)NAT的210.21.12.140:8001與A的192.168.0.4:5000通信,而 B或者C的其它port則均不能和A的192.168.0.4:5000通信。
?
?
STUN 的簡(jiǎn)單操作過(guò)程:
發(fā)送請(qǐng)求。請(qǐng)求分為兩種
1.Binding Requests, sent over UDP,
?用來(lái)發(fā)現(xiàn)NAT的公網(wǎng)地址,和MAPPING后的port
?2.??Binding Response,
server產(chǎn)生Binding Response。并把得到的MAPPINGIP 和port。返回到client, client比較MAPPING地址是否和本機(jī)地址同樣。假設(shè)是說(shuō)明是本機(jī)也是公網(wǎng),否則推斷NAT的類(lèi)型(推斷方法:client uses additional STUN Binding Requests)
3.Binding Error。
4.Shared Secret Requests, sent over TLS [2] over TCP.
這個(gè)請(qǐng)求要求server返回一暫時(shí)username和password。用來(lái)下一步的Binding Requests/ Response,用來(lái)驗(yàn)證信息的完整性
5.Shared Secret Response,
6 Shared Secret Error Response。
?
STUN 信息結(jié)構(gòu)
STUN 由以后數(shù)據(jù)結(jié)構(gòu)構(gòu)成:STUN頭+STUN有效載荷
STUN頭結(jié)構(gòu)例如以下: 存儲(chǔ)的值都是以網(wǎng)絡(luò)順序存放
字段??? 類(lèi)型??
STUN message type??? Short int??? 消息類(lèi)型
Length??? Short int??? 有效載荷長(zhǎng)度,不包括頭長(zhǎng)度
transaction ID??? octet[16]??? 連接的ID值,檢查Request,和Response
STUN的有效載荷
SHUN的有效載荷是一些STUN的屬性構(gòu)成,屬性的類(lèi)型由信息的類(lèi)型來(lái)決定。
STUN的屬性是定義好了的,屬性列表(attribute)例如以下:
MAPPED-ADDRESS??? 必選??? 用在Binding Response,(添入MAPING IP 和PORT)
RESPONSEADDRESS??? 可選??? 用在Binding Request,指定Response,發(fā)送到哪里
假設(shè)沒(méi)有指定。Response發(fā)送到MAPING IP 和 PORT
CHANGE-REQUEST??? 可選??? 用在Binding Request。用來(lái)決定。CLIENT的NAT類(lèi)型是
制NAT,還是port限制NAT,(命令server從不同的源port/IP,Response請(qǐng)求)
CHANGED-ADDRESS??? 可選??? 用在Binding Responses告訴Client改變的port和IP
SOURCE-ADDRESS??? 必選??? 僅僅用在Binding Responses。標(biāo)記信息的源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.可追溯性和預(yù)防DDOS
?通過(guò)這些方法和過(guò)程
?
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元

