??? 摘 要: NAT穿越是多媒體傳輸技術(shù)中的一個(gè)重要研究課題,STUN解決方案能解決部分NAT的穿越問(wèn)題,但是還有一定的弊端。在STUN技術(shù)的基礎(chǔ)上,介紹了NAT路由器的識(shí)別方法,詳細(xì)分析并設(shè)計(jì)一種解決NAT路由器穿越問(wèn)題的算法,并對(duì)處于不同NAT路由器環(huán)境下的直接通信給出一種解決方案。既提高了NAT路由器的識(shí)別效率,也改善了通信質(zhì)量。
??? 關(guān)鍵詞:? NAT;STUN;直接通信;穿越
?
??? NAT是為了解決網(wǎng)絡(luò)IP地址資源緊缺而出現(xiàn)的一種技術(shù),由于其具有隱藏內(nèi)網(wǎng)IP的功能,增加了內(nèi)網(wǎng)的網(wǎng)絡(luò)安全性,所以得到了廣泛的應(yīng)用。但是,由于外網(wǎng)主機(jī)不能首先發(fā)起對(duì)處于NAT后主機(jī)的訪問(wèn),特別是處于兩個(gè)內(nèi)網(wǎng)主機(jī)不能直接進(jìn)行通信,這對(duì)一些應(yīng)用程序的部署造成一定的困難。比如說(shuō)網(wǎng)絡(luò)視頻會(huì)議系統(tǒng)和VoIP系統(tǒng)。為了解決這個(gè)問(wèn)題,也就是處于內(nèi)網(wǎng)的主機(jī)之間能夠穿越它們之間的NAT建立直接通信,已經(jīng)提出了許多方法,STUN(Simple Traversal of UDP Through NetWork Address Translators)技術(shù)就是其中比較重要的一種解決方法,并得到了廣泛的應(yīng)用。
??? 本文主要是基于STUN協(xié)議,對(duì)NAT路由器識(shí)別問(wèn)題進(jìn)行研究,對(duì)NAT類(lèi)型的判斷方法做了改進(jìn),詳細(xì)分析并提出一種算法來(lái)解決NAT路由器穿越問(wèn)題,對(duì)處于NAT路由器后的主機(jī)設(shè)計(jì)了直接通信方案。
1 NAT(Network Address Translator) 介紹
1.1 NAT簡(jiǎn)述
??? NAT即網(wǎng)絡(luò)地址轉(zhuǎn)換,是一個(gè)IETF(Internet Engineering Task Force)標(biāo)準(zhǔn),它允許一個(gè)整體的組織或機(jī)構(gòu)用一個(gè)公用的IP地址出現(xiàn)在網(wǎng)絡(luò)上,歸根到底,NAT就是把內(nèi)部私有的IP地址翻譯成公網(wǎng)上合法的IP地址的一種技術(shù)。
??? NAT負(fù)責(zé)把內(nèi)部主機(jī)的數(shù)據(jù)包的源地址(私有IP地址)按照一定的規(guī)則翻譯成合法的、唯一的公網(wǎng)IP地址,源數(shù)據(jù)包的端口轉(zhuǎn)換成NAT的一個(gè)端口,目的IP地址和端口不變,最終數(shù)據(jù)包經(jīng)過(guò)路由器發(fā)送到目的地址。同時(shí),NAT也負(fù)責(zé)把外部主機(jī)返回的數(shù)據(jù)包的目的地址和端口轉(zhuǎn)換成內(nèi)網(wǎng)的私有地址和端口,源地址和端口不變。這種變換的本質(zhì)是在NAT內(nèi)部維護(hù)著一張轉(zhuǎn)換表,負(fù)責(zé)由內(nèi)到外和由外到內(nèi)的IP地址與端口的轉(zhuǎn)換。
??? 對(duì)于視頻會(huì)議和VoIP軟件來(lái)說(shuō),對(duì)位于不同NAT內(nèi)部的主機(jī)通信需要靠服務(wù)器來(lái)轉(zhuǎn)發(fā)完成,這樣就會(huì)增加服務(wù)器的負(fù)擔(dān)。為了解決這種問(wèn)題,要盡量使位于不同NAT內(nèi)部的主機(jī)建立直接通信,其中,最重要的一點(diǎn)就是要判斷出NAT的類(lèi)型,然后才能根據(jù)NAT的類(lèi)型,設(shè)計(jì)出直接通信方案。
1.2 NAT類(lèi)型
??? 根據(jù)STUN協(xié)議,把NAT分為以下幾種類(lèi)型
??? (1) 完全錐形(Full Cone)NAT:所有內(nèi)部IP地址和端口的請(qǐng)求都被映射到相同的外部地址和端口,任何外部主機(jī)都可以通過(guò)映射的外部地址向內(nèi)部主機(jī)發(fā)送數(shù)據(jù)包。
?? ?(2) 受限錐形(Restricted Cone)NAT:所有從相同內(nèi)部IP和端口的請(qǐng)求都被映射為相同的外部地址和端口,與Full Cone不同的是,必須是內(nèi)部主機(jī)已經(jīng)向外部主機(jī)發(fā)送過(guò)數(shù)據(jù)包,外部主機(jī)才能通過(guò)IP地址向內(nèi)部主機(jī)發(fā)送數(shù)據(jù)包。
??? (3) 端口受限錐形(Port Restricted Cone)NAT:和Restricted Cone類(lèi)似,但是包括對(duì)端口的限制,外部主機(jī)(IP地址X,端口P)向內(nèi)部主機(jī)發(fā)送數(shù)據(jù)包當(dāng)且僅當(dāng)滿(mǎn)足內(nèi)部主機(jī)先前已經(jīng)向(X,P)發(fā)送過(guò)數(shù)據(jù)包。
??? (4) 對(duì)稱(chēng)(Symmetric)NAT:限制最嚴(yán)格的NAT,所有來(lái)自同一內(nèi)部IP地址和端口發(fā)送到某一特定目的IP地址和端口的請(qǐng)求,都會(huì)映射為同一個(gè)目的地址和端口。若同一臺(tái)內(nèi)部主機(jī)從同一個(gè)端口發(fā)送數(shù)據(jù)包,只是目的地址和端口不同,那么映射關(guān)系也是不同的。并且,只有曾經(jīng)收到過(guò)內(nèi)部主機(jī)請(qǐng)求的外部主機(jī)才能向內(nèi)部主機(jī)發(fā)送數(shù)據(jù)包。
2 NAT路由器
2.1 STUN技術(shù)簡(jiǎn)介
??? STUN技術(shù)能使客戶(hù)端應(yīng)用程序發(fā)現(xiàn)它和公共互聯(lián)網(wǎng)之間存在的NAT和防火墻及其類(lèi)型,還能獲得路由器分配給它的公網(wǎng)IP地址和端口號(hào)。它主要由三部分組成:STUN客戶(hù)端、STUN服務(wù)器端、NAT路由器。如圖1所示。
?
??? STUN客戶(hù)端通過(guò)向服務(wù)器端發(fā)送不同的消息類(lèi)型,根據(jù)服務(wù)器端不同的響應(yīng)來(lái)判斷客戶(hù)端IP地址類(lèi)型,如果是內(nèi)部網(wǎng)絡(luò)地址,還可以判斷所經(jīng)過(guò)的NAT類(lèi)型,同時(shí)可以得到路由器分配給它的公網(wǎng)IP地址和端口(映射過(guò)的)。
??? STUN服務(wù)器端根據(jù)客戶(hù)端不同的動(dòng)作(客戶(hù)端發(fā)送不同的消息類(lèi)型)作出不同的處理,可以獲得客戶(hù)端的源地址與端口(映射過(guò)得公網(wǎng)IP地址和端口)并返回給客戶(hù)端。根據(jù)客戶(hù)端發(fā)送的消息類(lèi)型,按照要求用不同的IP地址和端口返回給客戶(hù)端。
2.2 NAT路由器類(lèi)型判斷
2.2.1 測(cè)試方案設(shè)計(jì)
??? 根據(jù)RFC3489提供的解決方案,NAT類(lèi)型的判斷由客戶(hù)端來(lái)完成。設(shè)計(jì)了下面兩種測(cè)試方法。
??? 測(cè)試1:客戶(hù)端(IP:A,PORT:A)向服務(wù)器(IP:B,PORT:B)發(fā)送消息,服務(wù)器響應(yīng)客戶(hù)端的請(qǐng)求,做出動(dòng)作,服務(wù)器(IP:B,PORT:B)發(fā)送Response給客戶(hù)端(IP:A,PORT:A)。
??? 測(cè)試2:客戶(hù)端(IP:A,PORT:A)向服務(wù)器(IP:B,PORT:B)發(fā)送消息,服務(wù)器(IP:B,PORT:C)發(fā)送Response給客戶(hù)端(IP:A,PORT:A)。
2.2.2 NAT 路由器類(lèi)型判斷
??? 由圖2可以得到客戶(hù)端所處的網(wǎng)絡(luò)環(huán)境有以下幾種:
??? · 阻塞UDP 的防火墻;
??? ·公開(kāi)的互聯(lián)網(wǎng)上(有公網(wǎng)IP);
??? ·對(duì)稱(chēng)型UDP防火墻;
??? ·完全錐形或受限錐形NAT;
??? ·對(duì)稱(chēng)NAT;
??? ·端口受限錐形NAT;
??? ·受限錐形。
?
2.3 NAT路由器類(lèi)型判斷改進(jìn)
??? RFC3489給出了判斷NAT路由器類(lèi)型的解決方案,它需要在公網(wǎng)上部署兩臺(tái)服務(wù)器才能對(duì)NAT路由器進(jìn)行判斷,這就需要兩個(gè)IP地址才能完成測(cè)試,這在Windows環(huán)境下比較難實(shí)現(xiàn),對(duì)于當(dāng)今IP地址比較缺乏的情況下,往往要花費(fèi)的成本比較大。本文對(duì)RFC3489所給的解決方案進(jìn)行了改進(jìn),在同一臺(tái)服務(wù)器上用不同的端口對(duì)客戶(hù)端的消息進(jìn)行響應(yīng),設(shè)計(jì)出以上的測(cè)試方案,來(lái)判斷出NAT的類(lèi)型。但是有些情況不能具體識(shí)別出固定類(lèi)型,但是這并不影響后續(xù)工作,本文研究目的是為了在客戶(hù)端之間建立直接聯(lián)系。所以這種方法還是很有應(yīng)用價(jià)值的。
3 NAT路由器穿越算法設(shè)計(jì)
3.1 NAT路由器穿越概述
??? 通過(guò)以上的分析,很容易看出,對(duì)于處于不同網(wǎng)絡(luò)環(huán)境的客戶(hù)端來(lái)說(shuō),想進(jìn)行直接通信,首先需要判斷出NAT的類(lèi)型,根據(jù)NAT路由器的類(lèi)型來(lái)決定處于路由器后面的主機(jī)雙方是否可以進(jìn)行直接通信。以某個(gè)公司的網(wǎng)絡(luò)為例,公司通過(guò)NAT路由器連接到公網(wǎng)上,公司內(nèi)部通過(guò)NAT路由器建立了三個(gè)局域網(wǎng)。網(wǎng)絡(luò)環(huán)境(見(jiàn)圖1)處于路由器后面的主機(jī)雙方要直接通信需要有STUN服務(wù)器的配合。根據(jù)判斷的NAT路由器的類(lèi)型確定路由器后面的雙方客戶(hù)端是否可以建立直接通信。
3.2 NAT路由器穿越算法
??? 根據(jù)前面分析,NAT路由器的穿越算法可以描述如下:
??? (1) 終端A、B分別登錄服務(wù)器,判斷自己所處的網(wǎng)絡(luò)環(huán)境,即各自所處網(wǎng)絡(luò)中NAT的類(lèi)型。
??? (2) 從服務(wù)器獲得終端B所處的網(wǎng)絡(luò)NAT的類(lèi)型,確定是否可以建立直接通信。
??? (3) 不能建立直接通信的情況,程序直接退出
??? (4) 對(duì)于可以建立直接通信的網(wǎng)絡(luò),確定具體的解決方案。有下面幾種情況
??? a.終端A、終端B處于同一網(wǎng)段時(shí),終端A直接向終端B發(fā)送Message消息。終端B響應(yīng)Message消息,回復(fù)Message消息給終端A。
??? b.對(duì)于不同網(wǎng)段,分為兩種情況。終端B為對(duì)稱(chēng)NAT的情況,終端A首先向終端B發(fā)送Message消息,然后終端A往服務(wù)器發(fā)送Message2消息。服務(wù)器收到Message2消息后,服務(wù)器再向終端B發(fā)送Message3消息,終端B根據(jù)收到的消息類(lèi)型做出響應(yīng),往終端A發(fā)送Message消息;對(duì)于終端B為非對(duì)稱(chēng)NAT的情況,終端A首先向服務(wù)器發(fā)送Message2消息,然后再發(fā)送Message消息給終端B。
??? (5) 終端A、終端B退出服務(wù)器。建立直接通信成功。
??? 在發(fā)送消息時(shí),要建立消息來(lái)源信息庫(kù),如IP地址,端口號(hào),以及映射關(guān)系。方便處理消息時(shí)使用相關(guān)資源。算法流程如圖3所示,終端A(圖中用A標(biāo)識(shí)) 與終端B(圖中用B標(biāo)識(shí)) 建立直接通信,STUN服務(wù)器為Server。消息類(lèi)型有Message、Message 2、Message 3三種消息類(lèi)型。
?
??? 這里以終端B所處的NAT類(lèi)型為對(duì)稱(chēng)NAT為例,終端A的IP為172.22.2.9,其公網(wǎng)IP為210.80.43.104,Server的IP為202.120.58.178,終端B的IP192.168.101.6,終端B的公網(wǎng)IP是222.191.255.68。圖4為終端A在與終端B建立直接通信的時(shí)序圖。
?
??? 圖4中,只對(duì)終端A與終端B處于不同的網(wǎng)段內(nèi)作了一個(gè)分析。對(duì)于二者處于同一個(gè)網(wǎng)段內(nèi)的情況,比較容易解決,終端A直接向終端B發(fā)送Message 消息即可建立直接通信。
??? 對(duì)于終端B處于非對(duì)稱(chēng)NAT的情況,解決方案的差別之處就在于發(fā)送的消息順序不一樣。非對(duì)稱(chēng)NAT的情況下,終端A首先發(fā)送Message 2消息和服務(wù)器通信,然后在發(fā)送Message消息與終端B進(jìn)行通信。這與對(duì)稱(chēng)NAT的情況剛好相反。
??? 為了能夠順利的建立直接通信,在建立直接通信成功后,讓客戶(hù)端雙方在相互通信3次,確認(rèn)直接通信是否成功,在下面的仿真實(shí)驗(yàn)中可以體現(xiàn)出來(lái)。
??? 有三種情況現(xiàn)在還沒(méi)有找到比較好的解決辦法:雙方處于阻礙UDP防火墻的NAT路由器;雙方都是對(duì)稱(chēng)NAT的防火墻;一方為對(duì)稱(chēng)NAT,另一方為端口受限NAT。
3.3 算法仿真結(jié)果
??? 對(duì)于NAT路由器穿越算法,進(jìn)行了實(shí)驗(yàn)測(cè)試,仿真中,發(fā)送的消息類(lèi)型(TRANS,MESSAGE,Message3),客戶(hù)端實(shí)驗(yàn)結(jié)果如圖5、圖6所示。
?
?
??? 此外,對(duì)于雙方客戶(hù)端處于同一局域網(wǎng)內(nèi)不同級(jí)別的NAT后面理論上是可以直接通信的,但是要取決于最外層的NAT是否支持Loopback translate功能,也就是內(nèi)網(wǎng)主機(jī)A向內(nèi)網(wǎng)主機(jī)B的最外層NAT外網(wǎng)地址和端口發(fā)送數(shù)據(jù),最外層的NAT是夠能夠?qū)?shù)據(jù)轉(zhuǎn)發(fā)給主機(jī)B,如果最外層NAT支持此功能,則A和B可以建立直接通信,否則不能。
4 NAT路由器穿越算法的優(yōu)缺點(diǎn)
??? NAT技術(shù)的優(yōu)點(diǎn)決定了它的應(yīng)用廣泛性,但是根據(jù)STUN協(xié)議來(lái)實(shí)現(xiàn)NAT路由器的穿越問(wèn)題往往需要的開(kāi)銷(xiāo)比較大,本文提出了一種比較方便的算法,在不增加成本的基礎(chǔ)上能夠準(zhǔn)確地判斷出來(lái)NAT路由器的類(lèi)型,對(duì)NAT路由器穿越問(wèn)題進(jìn)行了詳細(xì)的研究、設(shè)計(jì)。這對(duì)于中小型的企業(yè)來(lái)說(shuō),不僅節(jié)省了成本預(yù)算,而且達(dá)到了實(shí)際的效果。但是對(duì)于有些公司部署對(duì)稱(chēng)NAT路由器,該算法還有一些不足之處,還需要進(jìn)一步研究,對(duì)算法進(jìn)行改進(jìn)。
??? 本文對(duì)STUN協(xié)議提出的NAT識(shí)別方法進(jìn)行了有效地改進(jìn),并對(duì)NAT路由器的穿越問(wèn)題進(jìn)行了詳細(xì)地研究,并設(shè)計(jì)出比較合理的算法。提高了效率,節(jié)省了成本。并指出了該算法的優(yōu)點(diǎn)和不足。
參考文獻(xiàn)
[1] Rosenberg J, Weinberger J. STUN-Simple Traversal of user Datagram Protocol (UDP) Trough Network Address Translators (NATs). RFC3489, 2003.
[2]?Egevang K. The IP Network Address Translator (NAT). RFC1631, 2001.
[3] ?Hitema C. Short Term NAT Requirements for UDP Based Peer-to-Peer Applications. IETF Draft, 2001.
[4]?P Srisuresh, M Holdrege . IP Network Address Translator(NAT) Terminology and Considerations. RFC2663, 1999.