馮金哲 殷海兵
(中國計量學院信息工程學院 浙江 杭州 310018)
一種Symmetric NAT穿透的新方法
馮金哲 殷海兵
(中國計量學院信息工程學院 浙江 杭州 310018)
NAT(Network Address Translator)不僅解決了IP地址短缺的問題,而且也使內(nèi)網(wǎng)主機避免了來自網(wǎng)絡(luò)外部的攻擊。但對于P2P應用來說,需要建立端到端的連接,所以說如何穿透NAT成為了P2P技術(shù)中的一個關(guān)鍵。通過對當前NAT穿透技術(shù)的研究,發(fā)現(xiàn)依靠TURN(Traversal Using Relay NAT)來實現(xiàn)對Symmetric NAT穿透往往存在服務器負擔重、延時、丟包的問題,于是給出一種基于端口預測的NAT穿透新方法。該方法避免了依靠TURN來實現(xiàn)對Symmetric NAT穿透所帶來的難題,大大滿足了對網(wǎng)絡(luò)安全要求高而使用對稱型NAT企業(yè)的需求。
Symmetric NAT TURN P2P NAT穿透
網(wǎng)絡(luò)地址轉(zhuǎn)換[1]NAT是一個非常有名的工具,能夠使IP地址在網(wǎng)絡(luò)上重用。NAT可以將內(nèi)網(wǎng)私有地址和端口號轉(zhuǎn)換成公網(wǎng)地址和端口號,進而建立一個會話實現(xiàn)與公網(wǎng)主機進行通信。但是NAT只允許單方面發(fā)起連接,即內(nèi)網(wǎng)可以作為客戶端訪問外網(wǎng),而不能作為服務器提供服務。很明顯,這與P2P的資源共享的思想所不容[2]。于是解決NAT穿透問題將是實現(xiàn)P2P對等服務的前提。
目前,存在多種NAT穿透的方法。一種常用的穿透方法STUN(Simple Traversal of UDP over NAT)[3]是NAT的UDP簡單穿透,基于C/S架構(gòu),但不能實現(xiàn)Symmetric NAT的穿透;而對于Symmetric NAT穿越一般采取TURN中繼方式。雖然中繼服務器能夠?qū)崿F(xiàn)對Symmetric NAT的穿透,但同時也容易導致TURN服務器負擔過重,引起延時、丟包現(xiàn)象的發(fā)生。
本文采取的NAT穿透新方法,能夠成功實現(xiàn)對Symmetric NAT的穿透。對稱型NAT被廣泛應用于對安全性要求較高的交流通信中,但目前依靠中繼轉(zhuǎn)發(fā)的方案存在一定的缺陷。本文采取基于端口預測方法實現(xiàn)對Symmetric NAT的穿透,克服了依靠中繼服務器穿越的缺陷,特別適合對網(wǎng)絡(luò)安全要求高而使用對稱型NAT的企業(yè)公司。
STUN標準中,根據(jù)NAT對IP地址和端口的映射方式[4],如圖1所示,把NAT分為四類:完全錐型NAT(Full Cone NAT)、限制錐型NAT(Restricted Cone NAT)、端口限制錐型NAT(Port Restricted Cone NAT)和對稱型NAT(Symmetric NAT)。
圖1 NAT地址映射關(guān)系
(1) 完全錐型NAT:特點是內(nèi)部主機P訪問外網(wǎng)主機時,NAT給其分配一個端口號,外網(wǎng)的任何主機都可以憑借這一端口號給內(nèi)網(wǎng)主機發(fā)送UDP數(shù)據(jù)包。映射關(guān)系為P:p→A:b,任何外部主機都可以通過(A:b)發(fā)送數(shù)據(jù)到上(P:p)。
(2) 限制錐型NAT:特點是當內(nèi)部主機P訪問外網(wǎng)主機X時,NAT給其分配一個端口,主機X可以用任何端口與P通信,但外網(wǎng)主機不能與P通信。映射關(guān)系為P:p→A:b→X,只有來自X的數(shù)據(jù)包才能通過(A:b)發(fā)送到上(P:p)。
(3) 端口限制錐型NAT:特點是當內(nèi)部主機P訪問外網(wǎng)主機X時,NAT給其分配一個端口,主機X只能用本端口與P通信,X用其他端口或其他主機不能與P通信。映射關(guān)系為P:p→A:b→X:x,只有來自X:x的數(shù)據(jù)才能通過(A:b)發(fā)送到(P:p)上。
(4) 對稱型NAT:特點是只有同一內(nèi)部主機地址(P:p),并且發(fā)送到同一地址(X:x)的請求消息,NAT才會映射為相同的外部地址(A:b),返回的數(shù)據(jù)也只接受該內(nèi)部主機X:x這一目的地址。映射關(guān)系為P:p→A:b→X:x;當訪問(Y:y)時,映射則變?yōu)镻:p→B:c→Y:y。
NAT穿透一般分為兩種情況:(1) 終端A與B通信,A位于NAT后面,而B位于公網(wǎng)上。這種情況兩者通信比較簡單,只要讓位于NAT后面的A終端先建立聯(lián)系,NAT就不起作用了,A可以從服務器上取得B的地址,主動發(fā)起連接,B回應的數(shù)據(jù)包就可以容易地穿透NAT。(2) 如果A與B均位于NAT之后,這時候A與B的通信是否成功就與兩個NAT的類型有關(guān)了。主要的實現(xiàn)方法是終端A與B先通過與服務器的聯(lián)系,獲得各自在NAT外部的地址,即IP地址和端口號;然后A與B再分別向?qū)Ψ降耐獠康刂钒l(fā)送數(shù)據(jù)邀請包,獲取自己與對方通信的外部地址,這就是所謂的“打洞”[5-7]。打洞完成后,雙方就可以建立聯(lián)系進行端到端的通信了。但是,當一方NAT的類型為對稱型,而另一個是端口限制型NAT或?qū)ΨQ型NAT時,將無法獲取外部地址,進而邀請包也無法成功到達,也就無法穿透NAT實現(xiàn)兩者的通信。
2.1 STUN 方法
STUN是一種Client/Server的協(xié)議,也是一種Request/Response的協(xié)議。STUN穿透NAT實現(xiàn)A與B的通信方法,如圖2所示。
圖2 STUN穿透NAT
(1) 客戶端A與服務器建立聯(lián)系,NAT A為其分配端口11000,服務器得到A的地址100.10.10.10:11000。
(2) 客戶端B也與服務器建立聯(lián)系,NAT B為其分配端口22000,服務器得到B的地址200.20.20.20:22000。這時A如果直接向B發(fā)送數(shù)據(jù)包會被NAT B丟棄,所以通過在NAT B上打一個方向為A的洞,那么A就可以向B發(fā)送數(shù)據(jù)了。
(3)服務器發(fā)起打洞的指令,客戶端B向A的地址100.10.10.10:11000發(fā)送一個UDP的數(shù)據(jù)包,這個數(shù)據(jù)包被NAT A丟棄,但在NAT B上建立起了映射記錄,這樣NAT B就不會再丟棄來自A的數(shù)據(jù)報文了。
(4) 服務器通知客戶端A可以通信了,A向客戶端B發(fā)送UDP數(shù)據(jù)包,NAT B 允許數(shù)據(jù)包通過,于是A與B就實現(xiàn)端到端的通信了。
2.2 TURN 方法
STUN的局限性在于不支持對稱型NAT穿透,而一些在安全性要求較高的企業(yè)網(wǎng)絡(luò)中,配置的NAT多是對稱型NAT。所以STUN的擴展TURN[8]就出現(xiàn)了,TURN解決NAT的問題與STUN相似,只不過STUN穿透方法得到的地址是出口NAT上的外部地址,而TURN方法得到的地址為TURN服務器上的公網(wǎng)地址。但負載比較大時,利用TURN方式會引起服務器負擔過重,出現(xiàn)丟包和延時的現(xiàn)象。
2.3 NAT穿透新方法
針對STUN存在不能實現(xiàn)對Symmetric NAT穿透的局限性,以及TURN方式存在數(shù)據(jù)包延遲和丟包的缺陷。本文給出了一個新的方法,此方法成功實現(xiàn)了對Symmetric NAT的穿透。此方法的實現(xiàn)思路如圖3所示。具體分為三個階段。
圖3 NAT穿透新方法
2.3.1 第一階段
終端A訪問服務器C和D確定NAT類型。
(1) 終端A首先和服務器C建立聯(lián)系,服務器C分析NAT A映射的端口號。
(2) 服務器C向終端A傳遞(1)得到的端口號。
(3) 緊接著,終端A向服務器D發(fā)送一個數(shù)據(jù)包。這個數(shù)據(jù)包中包含了(1)中分析得到的端口號信息。同樣的方式,服務器D也分析了NAT A映射的端口號并記錄下來。服務器D根據(jù)比較這兩個端口號的異同,可得出NAT A的類型。若兩個端口相同,則NAT A屬于錐型NAT;否則,屬于對稱型NAT。
2.3.2 第二階段
這個階段里,終端B采用第一階段一樣的方式,分別訪問服務器C和D。
(1) 終端B首先訪問服務器C,然后,服務器C分析得到NAT B的映射端口號。
(2) 服務器C把(1)中得到的端口號回應給終端B。
(3) 終端B向服務器D發(fā)送數(shù)據(jù)包。數(shù)據(jù)包中包含了(1)中分析得到的端口號信息。服務器D同樣分析了NAT B映射的端口號并記錄下來。服務器D根據(jù)比較兩個端口的異同,得出NAT B的類型,若兩個端口一致,則NAT B屬于錐型NAT;否則為對稱型NAT。
2.3.3 第三階段
這一階段里,對端口進行預測。假設(shè)在第一、二階段檢測得到的NAT A和NAT B都屬于對稱型。很顯然,通過對兩次端口的觀察,可以確定端口號有三種變化趨勢:遞增、遞減或隨機分配。同時,也可以對NAT如何分配端口號有了一個很準確的預測范圍。對于端口號變化呈遞增或遞減的情況,對很多NAT而言,一般差值在1或者2[9]。而對于端口隨機分配的情況,總的端口數(shù)為N=65 535-1024,根據(jù)統(tǒng)計學的推算,當隨機猜測439次,就會保證至少有一次預測成功率達95%[10]。如果嘗試猜測的次數(shù)足夠多,可以說,基本能成功實現(xiàn)終端A與B的連接。具體實現(xiàn)如下:
(1) 根據(jù)第一、二階段分析得到的信息,也即NAT A與服務器C與D的交流信息,可以預測一個合適的打洞端口。服務器D把包含預測端口號信息發(fā)送給終端B。
(2) 根據(jù)(1)中的信息,終端B嘗試發(fā)送數(shù)據(jù)包。對于這樣的數(shù)據(jù)包肯定會被NAT A丟棄,但NAT B卻記錄了此次連接的信息。
(3) 基于第一、二階段的兩類信息,也即NAT B與服務器C與D的交流信息,也可以預測一個合適的打洞端口。服務器D同樣也會發(fā)送包含預測端口號信息到終端A。
(4) 根據(jù)(3)中包含的信息,終端A向終端B發(fā)送數(shù)據(jù)包。由于第(2)步中終端B嘗試連接過終端A,所以這些數(shù)據(jù)包會被NAT B識別并允許通過。從而終端A與B之間便建立起了連接。
考慮到實際測試環(huán)境很復雜,這里分別在兩臺電腦上利用Linux虛擬機來搭建NAT測試環(huán)境。網(wǎng)絡(luò)測試環(huán)境的設(shè)計如圖4所示,采用C編程,選擇用Linux下的libnet庫開發(fā)終端程序,進行數(shù)據(jù)包的發(fā)送;服務器端利用libpcap庫實現(xiàn)網(wǎng)絡(luò)數(shù)據(jù)包的捕獲與過濾,同時監(jiān)聽兩終端的連接。
首先,進行端口的預測驗證。終端A先與服務器C建立連接,再用同一端口向另一服務器D發(fā)起一次連接,終端A基于第一次連接進行的端口預測與第二次連接實際的映射作比較,如果匹配,則端口預測驗證成功。端口預測成功后,終端A就發(fā)送數(shù)據(jù)包,同時在終端B檢測數(shù)據(jù)包的接收情況。實驗結(jié)果證明了終端A與B成功實現(xiàn)了文本傳輸。
圖4 實驗測試網(wǎng)絡(luò)結(jié)構(gòu)
本文采用的基于端口預測穿透技術(shù)成功地實現(xiàn)了對Symmetric NAT的穿透,解決了目前利用中間服務器轉(zhuǎn)發(fā)實現(xiàn)穿透Symmetric NAT所帶來的難題。雖然,目前大部分企業(yè)用戶一般選擇錐型NAT設(shè)備,但對于對安全性要求較高的企業(yè)用戶,對稱型NAT設(shè)備的使用是不可避免的。通過本文介紹的方法可以實現(xiàn)對Symmetric NAT的成功穿越,所以,此方法具有很高應用與推廣的價值。
[1] 林海斌.基于STUNT協(xié)議的TCP NAT穿越設(shè)計與實現(xiàn)[D].華南理工大學,2010.
[2] 曹申會.NAT穿越技術(shù)研究與實現(xiàn)[D].南京郵電大學,2013.
[3] Rosenberg J, Weinberger J, Huitema C,et al.STUN-Simple Traversal of User Datagram Protocol (UDP) Through Network Address Translators (NATs)[S].RFC 3489.March 2003.
[4] 謝統(tǒng)義,黃保華.對等系統(tǒng)NAT穿越技術(shù)研究[J].廣西教育學院學報,2014(3):145-147.
[5] 杜經(jīng)緯,王春紅.在P2P網(wǎng)絡(luò)環(huán)境下基于UDP協(xié)議穿越NAT的研究[J].吉林師范大學學報:自然科學版,2012(1):93-94.
[6] 蒙元勝.基于UDP/TCP協(xié)議的NAT穿越方案研究[D].中山大學,2014.
[7] 孔衛(wèi)喜,席少龍.P2P中NAT穿越問題的研究[J].計算機技術(shù)與發(fā)展,2014,24(2):243-245.
[8] Rosenberg J,Mahy R,Huitema C.Traversal using relay NAT(TURN).Internet-Draft.2005.
[9] Midcom W G,Takeda Y.Symmetric NAT Traversal using STUN[J].IETF,RFC3225,2003,35(9):254-289.
[10] 王培東,連樹國.基于端口預測的P2PNAT穿越方法的改進[J].通信技術(shù),2009,42(3):140-142.
A NEW METHOD FOR SYMMETRIC NAT TRAVERSAL
Feng Jinzhe Yin Haibing
(CollegeofInformationEngineering,ChinaJiliangUniversity,Hangzhou310018,Zhejiang,China)
NAT(Network Address Translator) not only solves the problem of IP address shortage,but also makes the network host avoid the attacks from outside the networks.But for P2P application,it needs to establish an end-to-end connection,so how to realise NAT traversal becomes a key in P2P technology.Based on the research of current NAT traversal technology,we found that to achieve Symmetrical NAT traversal relying on TURN(Traversal Using Relay NAT) often has the problems of heavy server burden,time delay and packet loss.Therefore,in this paper we present a new NAT traversal method by using port prediction,the method avoids the problems brought by relying TURN to implement traversal of symmetrical NAT,and greatly satisfies the requirements of those enterprises who have high demand on network security and thus use symmetric NAT.
Symmetrical NAT TURN P2P NAT traversal
2015-10-09。浙江省自然科學基金項目(LY15F020022)。馮金哲,碩士生,主研領(lǐng)域:計算機網(wǎng)絡(luò)通信。殷海兵,教授。
TP393
A
10.3969/j.issn.1000-386x.2017.01.022