Linux怎么检测nat类型,STUN(RFC3489)的NAT类型检测方法
在現(xiàn)實(shí)Internet網(wǎng)絡(luò)環(huán)境中,大多數(shù)計(jì)算機(jī)主機(jī)都位于防火墻或NAT之后,只有少部分主機(jī)能夠直接接入Internet。很多時(shí)候,我們希望網(wǎng)絡(luò)中的兩臺(tái)主機(jī)能夠直接進(jìn)行通信(即所謂的P2P通信),而不需要其它公共服務(wù)器的中轉(zhuǎn)。由于主機(jī)可能位于防火墻或NAT之后,在進(jìn)行P2P通信之前,我們需要進(jìn)行檢測(cè)以確認(rèn)它們之間能否進(jìn)行P2P通信以及如何通信。這種技術(shù)通常被稱(chēng)為NAT穿透(NAT Traversal)。最常見(jiàn)的NAT穿透是基于UDP的技術(shù)(如下面的RFC3489/STUN),也有基于TCP的穿透技術(shù)。NAT穿透技術(shù)最重要的是識(shí)別目標(biāo)主機(jī)的NAT類(lèi)型,這也是本文所要介紹的內(nèi)容。
在RFC3489/STUN[1]中,基于UDP的NAT穿透技術(shù)把主機(jī)劃分為如下七種NAT類(lèi)型:UDP Blocked、Open Internet、Symmetric Firewall、Full Cone NAT、Restricted Cone NAT、Port Restricted Cone NAT、Symmetric NAT。具體解釋如下:
(1)Open Internet:主機(jī)具有公網(wǎng)IP,允許主動(dòng)發(fā)起和被動(dòng)響應(yīng)兩種方式的UDP通信。
(2)UDP Blocked:位于防火墻之后,并且防火墻阻止了UDP通信。
(3)Symmetric Firewall:主機(jī)具有公網(wǎng)IP,但位于防火墻之后,且防火墻阻止了外部主機(jī)的主動(dòng)UDP通信。
(4)Full Cone NAT:當(dāng)內(nèi)網(wǎng)主機(jī)創(chuàng)建一個(gè)UDP socket并通過(guò)它第一次向外發(fā)送UDP數(shù)據(jù)包時(shí),NAT會(huì)為之分配一個(gè)固定的公網(wǎng){IP:端口}。此后,通過(guò)這個(gè)socket發(fā)送的任何UDP數(shù)據(jù)包都是通過(guò)這個(gè)公網(wǎng){IP:端口}發(fā)送出去的;同時(shí),任何外部主機(jī)都可以使用這個(gè)公網(wǎng){IP:端口}向該socket發(fā)送UDP數(shù)據(jù)包。即是說(shuō),NAT維護(hù)了一個(gè)映射表,內(nèi)網(wǎng)主機(jī)的內(nèi)網(wǎng){IP:端口}與公網(wǎng){IP:端口}是一一對(duì)應(yīng)的關(guān)系。一旦這個(gè)映射關(guān)系建立起來(lái)(內(nèi)部主機(jī)向某一外部主機(jī)發(fā)送一次數(shù)據(jù)即可),任何外部主機(jī)就可以直接向NAT內(nèi)的這臺(tái)主機(jī)發(fā)起UDP通信了,此時(shí)NAT透明化了。
(5)Restricted Cone NAT:當(dāng)內(nèi)網(wǎng)主機(jī)創(chuàng)建一個(gè)UDP socket并通過(guò)它第一次向外發(fā)送UDP數(shù)據(jù)包時(shí),NAT會(huì)為之分配一個(gè)公網(wǎng){IP:端口}。此后,通過(guò)這個(gè)socket向外發(fā)送的任何UDP數(shù)據(jù)包都是通過(guò)這個(gè)公網(wǎng){IP:端口}發(fā)送出去的;而任何收到過(guò)從這個(gè)socket發(fā)送來(lái)的數(shù)據(jù)的外部主機(jī)(由IP標(biāo)識(shí)),都可以通過(guò)這個(gè)公網(wǎng){IP:端口}向該socket發(fā)送UDP數(shù)據(jù)包。即是說(shuō),NAT維護(hù)了一個(gè)內(nèi)網(wǎng){IP:端口}到公網(wǎng){IP:端口}的映射,還維護(hù)了一個(gè){外部主機(jī)IP, 公網(wǎng){IP:端口}}到內(nèi)網(wǎng){IP:端口}的映射。因此,要想外部主機(jī)能夠主動(dòng)向該內(nèi)部主機(jī)發(fā)起通信,必須先由該內(nèi)部主機(jī)向這個(gè)外部發(fā)起一次通信。
(6)Port Restricted Cone NAT:當(dāng)內(nèi)網(wǎng)主機(jī)創(chuàng)建一個(gè)UDP socket并通過(guò)它第一次向外發(fā)送UDP數(shù)據(jù)包時(shí),NAT會(huì)為之分配一個(gè)公網(wǎng){IP:端口}。此后,通過(guò)這個(gè)socket向外部發(fā)送的任何UDP數(shù)據(jù)包都是通過(guò)這個(gè)公網(wǎng){IP:端口}發(fā)送出去的;一旦外部主機(jī)在{IP:端口}上收到過(guò)從這個(gè)socket發(fā)送來(lái)的數(shù)據(jù)后,都可以通過(guò)這個(gè)外部主機(jī){IP:端口}向該socket發(fā)送UDP數(shù)據(jù)包。即是說(shuō),NAT維護(hù)了一個(gè)從內(nèi)網(wǎng){IP:端口}到公網(wǎng){IP:端口}的映射,還維護(hù)了一個(gè)從{外部主機(jī){IP:端口}, 公網(wǎng){IP:端口}}到內(nèi)網(wǎng){IP:端口}的映射。
(7)Symmetrict NAT:當(dāng)內(nèi)網(wǎng)主機(jī)創(chuàng)建一個(gè)UDP socket并通過(guò)它第一次向外部主機(jī)1發(fā)送UDP數(shù)據(jù)包時(shí),NAT為其分配一個(gè)公網(wǎng){IP1:端口1},以后內(nèi)網(wǎng)主機(jī)發(fā)送給外部主機(jī)1的所有UDP數(shù)據(jù)包都是通過(guò)公網(wǎng){IP1:端口1}發(fā)送的;當(dāng)內(nèi)網(wǎng)主機(jī)通過(guò)這個(gè)socket向外部主機(jī)2發(fā)送UDP數(shù)據(jù)包時(shí),NAT為其分配一個(gè)公網(wǎng){IP2:端口2},以后內(nèi)網(wǎng)主機(jī)發(fā)送給外部主機(jī)2的所有UDP數(shù)據(jù)包都是通過(guò)公網(wǎng){IP2:端口2}發(fā)送的。公網(wǎng){IP1:端口1}和公網(wǎng){IP2:端口2}一定不會(huì)完全相同(即要么IP不同,要么端口不同,或者都不同)。這種情況下,外部主機(jī)只能在接收到內(nèi)網(wǎng)主機(jī)發(fā)來(lái)的數(shù)據(jù)時(shí),才能向內(nèi)網(wǎng)主機(jī)回送數(shù)據(jù)。
RFC3489/STUN協(xié)議過(guò)程
STUN協(xié)議定義了三類(lèi)測(cè)試過(guò)程來(lái)檢測(cè)NAT類(lèi)型,如下所述:
Test1:STUN Client通過(guò)端口{IP-c1:Port-c1}向STUN Server{IP-s1:Port-s1}發(fā)送一個(gè)Binding Request(沒(méi)有設(shè)置任何屬性)。STUN Server收到該請(qǐng)求后,通過(guò)端口{IP-s1:Port-s1}把它所看到的STUN Client的IP和端口{IP-m1,Port-m1}作為Binding Response的內(nèi)容回送給STUN Client。
Test1#2:STUN Client通過(guò)端口{IP-c1:Port-c1}向STUN Server{IP-s2:Port-s2}發(fā)送一個(gè)Binding Request(沒(méi)有設(shè)置任何屬性)。STUN Server收到該請(qǐng)求后,通過(guò)端口{IP-s2:Port-s2}把它所看到的STUN Client的IP和端口{IP-m1#2,Port-m1#2}作為Binding Response的內(nèi)容回送給STUN Client。
Test2:STUN Client通過(guò)端口{IP-c1:Port-c1}向STUN Server{IP-s1:Port-s1}發(fā)送一個(gè)Binding Request(設(shè)置了Change IP和Change Port屬性)。STUN Server收到該請(qǐng)求后,通過(guò)端口{IP-s2:Port-s2}把它所看到的STUN Client的IP和端口{IP-m2,Port-m2}作為Binding Response的內(nèi)容回送給STUN Client。
Test3:STUN Client通過(guò)端口{IP-c1:Port-c1}向STUN Server{IP-s1:Port-s1}發(fā)送一個(gè)Binding Request(設(shè)置了Change Port屬性)。STUN Server收到該請(qǐng)求后,通過(guò)端口{IP-s1:Port-s2}把它所看到的STUN Client的IP和端口{IP-m3,Port-m3}作為Binding Response的內(nèi)容回送給STUN Client。
NAT類(lèi)型檢測(cè)過(guò)程如下(在RFC3489中或者在Wiki上都可以找到流程圖):
1. 進(jìn)行Test1。如果STUN Client不能夠收到STUN Server的應(yīng)答(重復(fù)多次確認(rèn)),那么說(shuō)明該STUN Client是UDP Blocked類(lèi)型(也有可能是STUN Server不可到達(dá),這里不考慮這種情形);否則,STUN Client把返回的{IP-m1,Port-m1}和本地的{IP-c1:Port-c1}進(jìn)行比較(只需要比較IP即可),如果相同,說(shuō)明本機(jī)直接連接于公網(wǎng),否則本機(jī)位于NAT之后,但還需要進(jìn)一步判斷具體類(lèi)型。
1.1. 如果本機(jī)直接連接于公網(wǎng),進(jìn)行Test2。如果STUN Client不能夠收到STUN Server的應(yīng)答(重復(fù)多次確認(rèn)),那么說(shuō)明該STUN Client是Symmetric Firewall類(lèi)型;否則,該STUN Client是Open Internet類(lèi)型。
1.2. 如果本機(jī)位于NAT之后,進(jìn)行Test2。如果STUN Client能夠收到STUN Server的應(yīng)答,那么說(shuō)明該STUN Client是Full Cone NAT;否則,需要進(jìn)一步進(jìn)行測(cè)試。
1.2.1. 進(jìn)行Test1#2。STUN Client比較IP-m1和IP-m1#2是否相同,如果不相同,那么說(shuō)明該STUN Client是Symmetric NAT類(lèi)型;否則,需要進(jìn)一步進(jìn)行測(cè)試。
1.2.1.1 進(jìn)行Test3。如果STUN Client能夠收到STUN Server的應(yīng)答,那么說(shuō)明該STUN Client是Restricted Cone NAT類(lèi)型;否則,該STUN Client是Port Restricted Cone NAT類(lèi)型。
一些說(shuō)明:
1. 只需要進(jìn)行Test2,即可判斷出是否為Open Internet或Full Cone Nat類(lèi)型。
STUN實(shí)現(xiàn)
1.STUN Client and Server
library()
這個(gè)庫(kù)實(shí)現(xiàn)了RFC3489中的STUN協(xié)議。其中,Client程序輸出結(jié)果意義如下:
(1)"Open"表示這里的Open Internet
(2)"Independent Mapping, Independent Filter"表示這里的Full Cone NAT
(3)"Independedt Mapping, Address Dependendent Filter"表示這里的Restricted
Core NAT
(4)"Indepndent Mapping, Port Dependent Filter"表示這里的Port Restricted Core
NAT
(5)"Dependent Mapping"表示這里的Symmetric NAT
(6)"Firewall"表示這里的Symmetric Firewall
(7)"Blocked or could not reach STUN server"表示這里的UDP Blocked
2. reTurn ()
實(shí)現(xiàn)了RFC5389中的STUN協(xié)議和TURN協(xié)議。
網(wǎng)上一些可用STUN Server(注意:STUN協(xié)議指定默認(rèn)端口為3478)
stun01.sipphone.com
stun.iptel.org
stun.softjoys.com
stun.xten.com(這個(gè)STUN Server的實(shí)現(xiàn)好像有問(wèn)題,測(cè)試結(jié)果與前面三個(gè)不相同)
注解
[1] RFC3489中的STUN協(xié)議(Simple Traversal of UDP Through
NATs)是一個(gè)完整的NAT穿透方案,但其修訂版本(RFC5389)把STUN協(xié)議(Session Traversal Utilities
for
NAT)定位于為穿透NAT提供工具,并不提供一個(gè)完整的解決方案。此外,RFC3489只提供了UDP的NAT穿透,而RFC5389還支持TCP的穿
透)。
Reference
1.
2.
閱讀(2418) | 評(píng)論(0) | 轉(zhuǎn)發(fā)(0) |
總結(jié)
以上是生活随笔為你收集整理的Linux怎么检测nat类型,STUN(RFC3489)的NAT类型检测方法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 服务器提示位置不可用 拒绝访问,Win1
- 下一篇: JMeter性能测试流程及性能指标关注点