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