穿越NAT的p2p通信方法研究
在p2p通信領(lǐng)域中,由NAT(Network Address Translation,網(wǎng)絡(luò)地址轉(zhuǎn)換)引起的問(wèn)題已經(jīng)眾所周知了,
它會(huì)導(dǎo)致在NAT內(nèi)部的p2p客戶端在無(wú)論以何種有效的公網(wǎng)ip都無(wú)法訪問(wèn)的問(wèn)題。雖然目前已經(jīng)發(fā)展出
多種穿越NAT的技術(shù),但相關(guān)的技術(shù)文檔卻很少,用來(lái)證明這些技術(shù)的穩(wěn)定性和優(yōu)點(diǎn)的實(shí)際數(shù)據(jù)更少。
本文的目的在于描述和分析在實(shí)際中運(yùn)用得最廣泛、最可靠同時(shí)也是最簡(jiǎn)單的一種NAT穿越技術(shù),該
技術(shù)通常被稱為“打洞”技術(shù)。目前,“打洞”技術(shù)已經(jīng)在UDP通信領(lǐng)域中得到了廣泛的理解和應(yīng)用,在此,
也將討論如何利用它實(shí)現(xiàn)可靠的p2p的TCP流通信。在收集了大量的“打洞”技術(shù)可以穿越的NAT設(shè)備和
網(wǎng)絡(luò)的數(shù)據(jù)以后,我們發(fā)現(xiàn)82%的已測(cè)NAT設(shè)備支持UDP形式的“打洞”穿越,64%的已測(cè)NAT設(shè)備支持TCP
流形式的“打洞”穿越。由于重量級(jí)p2p應(yīng)用程序(如,VOIP、BT、在線游戲等)的用戶需求量持續(xù)上升,
并且該事實(shí)也已經(jīng)引起了NAT設(shè)備生產(chǎn)廠商的廣泛關(guān)注,因此,我們認(rèn)為未來(lái)會(huì)有越來(lái)越多的NAT設(shè)備
提供對(duì)“打洞”穿越技術(shù)的支持。
1、介紹
用戶量高速增長(zhǎng)以及大量安全問(wèn)題的巨大壓力迫使Internet技術(shù)不斷向前發(fā)展,但是這些新興的技術(shù)
很大程度地增加了應(yīng)用程序開(kāi)發(fā)的成本和復(fù)雜性。Internet最初的地址體系是每個(gè)節(jié)點(diǎn)有一個(gè)唯一不變
的全局地址,可以通過(guò)該地址直接與任何其它的節(jié)點(diǎn)進(jìn)行通信,而現(xiàn)如今,該地址體系已經(jīng)被新的實(shí)際
上廣泛使用的地址體系所替換,新的地址體系是由全局地址域和通過(guò)NAT接入全局地址域的大量私有地址
域組成。在新的地址體系中(如圖1所示),只有在“main”全局地址域中的節(jié)點(diǎn)可以在網(wǎng)絡(luò)中很容易地與
任何其它的擁有全局地址的節(jié)點(diǎn)通信,因?yàn)樵摴?jié)點(diǎn)擁有全局的、唯一的、可路由的地址。在私有網(wǎng)絡(luò)中的
節(jié)點(diǎn)可以與在同一個(gè)私有網(wǎng)絡(luò)中的其它節(jié)點(diǎn)進(jìn)行通信,并且在通常情況下可以向全局地址中的某個(gè)“著名”
的節(jié)點(diǎn)發(fā)起TCP連接或發(fā)送UDP數(shù)據(jù)包。NAT設(shè)備在此扮演的角色就是為從內(nèi)網(wǎng)向公網(wǎng)發(fā)起的連接的節(jié)點(diǎn)
分配臨時(shí)的轉(zhuǎn)發(fā)session,將來(lái)自內(nèi)網(wǎng)的數(shù)據(jù)包的地址和端口轉(zhuǎn)換為公網(wǎng)的地址和端口,將來(lái)自公網(wǎng)的
數(shù)據(jù)包的地址和端口轉(zhuǎn)換為內(nèi)網(wǎng)的端口和地址,同時(shí)NAT將屏蔽所有未經(jīng)授權(quán)的來(lái)自公網(wǎng)的數(shù)據(jù)包。
新的Internet地址體系非常適合于“客戶端/服務(wù)器”這樣的通信模式,一個(gè)典型的C/S通信模式是:
客戶端在內(nèi)網(wǎng)(私有地址域),服務(wù)器在公網(wǎng)(全局地址域),通過(guò)NAT將內(nèi)網(wǎng)和公網(wǎng)連接起來(lái)。
這種地址體系使得在不同內(nèi)網(wǎng)(私有地址域)中的兩個(gè)節(jié)點(diǎn)很難直接通信,而這恰恰是p2p應(yīng)用
(如,電話會(huì)議或在線游戲)中最基本的要求。很顯然,我們需要一種方法即使在NAT設(shè)備存在的
前提下,仍然能夠無(wú)障礙地實(shí)現(xiàn)p2p通信。
在不同內(nèi)網(wǎng)的兩個(gè)節(jié)點(diǎn)之間建立p2p連接的最有效的方法就是“打洞”。該技術(shù)在基于UDP的應(yīng)用程序
中得到了廣泛的應(yīng)用,同樣的,該技術(shù)也可以用于基于TCP的應(yīng)用程序。有趣的是,與“打洞”字面
上的意思剛好相反,該技術(shù)不會(huì)影響到內(nèi)網(wǎng)的安全。事實(shí)上,“打洞”技術(shù)使得p2p軟件的絕大部分
功能都在NAT設(shè)備默認(rèn)的安全策略的控制之下,這些都由NAT設(shè)備建立的session來(lái)管理。本文闡述
了適用于UDP和TCP的“打洞”技術(shù),并詳細(xì)描述了重要“打洞”過(guò)程中,應(yīng)用程序和NAT設(shè)備之間的行為。
不幸的是,由于NAT設(shè)備的響應(yīng)和行為不是標(biāo)準(zhǔn)的,所以沒(méi)有任何技術(shù)可以穿越現(xiàn)有的所有NAT設(shè)備。
本文提供了一些在現(xiàn)有NAT設(shè)備上進(jìn)行“打洞”的實(shí)驗(yàn)結(jié)果。我們收集的數(shù)據(jù)來(lái)自于互聯(lián)網(wǎng)上使用了
“NAT Check”工具并在大量不同生產(chǎn)廠商的NAT設(shè)備上進(jìn)行“打洞”實(shí)驗(yàn)的用戶。由于數(shù)據(jù)是來(lái)自于
一個(gè)叫做“self-selecting”的用戶社區(qū),或許不會(huì)完全代表在Internet上真正部署和使用的NAT設(shè)備,
但是結(jié)果無(wú)論如何還是很令人興奮的。
在做基本的“打洞”操作評(píng)估的時(shí)候,我們應(yīng)該指出在現(xiàn)有的NAT設(shè)備“打洞”的復(fù)雜度上,不同的復(fù)雜度
會(huì)有不同的結(jié)果。但目前我們把討論的重點(diǎn)集中于開(kāi)發(fā)最簡(jiǎn)單的,可以應(yīng)用于任何網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)的、
穩(wěn)定的、有正確NAT響應(yīng)的NAT設(shè)備上的“打洞”技術(shù)。我們有意避免使用一些“聰明的小把戲”通過(guò)
欺騙某些NAT設(shè)備來(lái)達(dá)到短期內(nèi)穿越較多的NAT設(shè)備,但從長(zhǎng)期來(lái)看會(huì)引起網(wǎng)絡(luò)未知錯(cuò)誤的技術(shù)。
盡管引入IPv6會(huì)極大地增加互聯(lián)網(wǎng)的地址空間,從而減少對(duì)于NAT設(shè)備的需求量,但短期內(nèi)IPv6確實(shí)
增加了對(duì)NAT設(shè)備的需求量,因?yàn)镹AT設(shè)備本身提供了一種方便的方法進(jìn)行IPv4與IPv6地址域轉(zhuǎn)換。
另外私有網(wǎng)絡(luò)上建立匿名和加密訪問(wèn)節(jié)點(diǎn)也有利于組織機(jī)構(gòu)的安全性以及不受外界干擾,這些都
意味著NAT還將存在相當(dāng)長(zhǎng)的一段時(shí)間。同樣,防火墻技術(shù)也不會(huì)由于有了足夠的ip地址而消失,
IPv6的防火墻仍然會(huì)默認(rèn)丟掉所有未經(jīng)授權(quán)的數(shù)據(jù)包,仍然可以讓在IPv6環(huán)境下工作的應(yīng)用程序
“打洞”。
本文接下來(lái)的部分按照如下的方式組織:
第二章介紹基本的NAT穿越概念和術(shù)語(yǔ);第三章介紹UDP“打洞”過(guò)程;第四章介紹TCP“打洞”過(guò)程;
第五章介紹支持“打洞”的NAT設(shè)備必須具有那些特性;第六章介紹我們?cè)谀壳傲餍械腘AT設(shè)備上的
“打洞”實(shí)驗(yàn)結(jié)果;第七章討論相關(guān)的網(wǎng)絡(luò)問(wèn)題;第八章全文總結(jié)以及結(jié)束語(yǔ)。
2、基本概念
本節(jié)介紹了本文使用到的基本的NAT術(shù)語(yǔ),著重描述了適用于UDP和TCP兩種協(xié)議的通用的NAT穿越技術(shù)。
2.1、NAT術(shù)語(yǔ)
本文絕大部分術(shù)語(yǔ)和分類來(lái)自于RFC 2663定義,另外一些來(lái)自于較新的RFC 3489中的定義。
理解session是很重要的。一個(gè)TCP或UDP的session endpoint是由一個(gè)IP地址,端口號(hào)組成,
每個(gè)session是由兩個(gè)session endpoint構(gòu)成。從內(nèi)網(wǎng)節(jié)點(diǎn)的角度來(lái)看,一個(gè)session由4部分組成
分別為:本地IP,本地端口,遠(yuǎn)端IP,遠(yuǎn)端端口。session的方向通常代表了數(shù)據(jù)包的初始流動(dòng)
的方向;對(duì)于TCP來(lái)說(shuō)就是SYN包的流向,對(duì)于UDP來(lái)說(shuō)就是第一個(gè)用戶數(shù)據(jù)包的流向。
NAT有很多種,但最普遍的一種類型叫做“傳統(tǒng)”NAT,或者“向外”NAT。他們?cè)趦?nèi)網(wǎng)和公網(wǎng)之間提供了
一個(gè)“不對(duì)稱”橋的映射。“向外”NAT在默認(rèn)情況下只允許向外的session穿越NAT:
從外向內(nèi)的的數(shù)據(jù)包都會(huì)被丟棄掉,除非NAT設(shè)備事先已經(jīng)定義了這些從外向內(nèi)的數(shù)據(jù)包是已存在的內(nèi)網(wǎng)session的一部分。
“外向”NAT會(huì)造成p2p協(xié)議的混亂,因?yàn)楫?dāng)p2p的雙方?jīng)Q定向在不同NAT后面的對(duì)方開(kāi)始通信的時(shí)候,
無(wú)論哪一方試圖初始化一個(gè)session,另一方的NAT都會(huì)拒絕這個(gè)請(qǐng)求。NAT穿越的核心思想就是讓
p2p的雙方的NAT看上去都是“向外”的NAT。
“向外”NAT有兩種類型:
(1)“基礎(chǔ)”NAT,該NAT只轉(zhuǎn)換IP地址,不轉(zhuǎn)換端口號(hào)。
(2)NAPT(Network Address/Port Translation)
NAPT轉(zhuǎn)換整個(gè)session endpoints。由于NAPT允許內(nèi)網(wǎng)的多個(gè)節(jié)點(diǎn)通過(guò)共享的方式使用同一個(gè)的公共
的IP地址,因此,支持NAPT的NAT設(shè)備才會(huì)越來(lái)越多。盡管本文通篇討論的內(nèi)容都是基于支持NAPT的
NAT設(shè)備的,但這些規(guī)律和技術(shù)同樣適用于“基礎(chǔ)”NAT。
2.2 轉(zhuǎn)發(fā)方式
最可靠但同時(shí)也是效率最低的p2p穿越NAT進(jìn)行通信的方法是采用類似C/S方式的轉(zhuǎn)發(fā)。假定兩個(gè)節(jié)點(diǎn)
A和B每個(gè)節(jié)點(diǎn)都有向外的TCP或UDP連接,聯(lián)入公共的已知服務(wù)器S,S的公網(wǎng)IP地址是18.181.0.31,
端口號(hào)是1234(如圖2所示),每個(gè)客戶端位于不同的私有內(nèi)網(wǎng)中,并且它們的NAT設(shè)備妨礙了客戶
端之間直接的p2p連接。做為對(duì)直連方案的替代方案,兩個(gè)客戶端可以利用公共的服務(wù)器S進(jìn)行
消息的轉(zhuǎn)發(fā)。例如,A為了將消息送給B,A只需將消息發(fā)給S,然后由S轉(zhuǎn)發(fā)給B,這一過(guò)程將使用A與
B事先與S建立好的連接。
轉(zhuǎn)發(fā)方式通常只能在雙方客戶端都連接到服務(wù)器的時(shí)候有效。這種方式的缺點(diǎn)在于,它假定服務(wù)
器的處理能力和網(wǎng)絡(luò)帶寬以及通信延遲都是理想的情況下,不會(huì)受到客戶端個(gè)數(shù)的影響。但是,由于
沒(méi)有其它的方法能夠像轉(zhuǎn)發(fā)方式那樣,可以穿越現(xiàn)存的所有NAT設(shè)備,因此在構(gòu)建高可靠性的p2p系統(tǒng)
的時(shí)候,通過(guò)服務(wù)器轉(zhuǎn)發(fā)的方式依舊是一個(gè)非常有用的保證系統(tǒng)可靠性的方法。TURN協(xié)議定義了如何
實(shí)現(xiàn)安全的轉(zhuǎn)發(fā)方式。
2.3 反向連接方式
一些p2p的應(yīng)用程序采用了直接但是有所限制的技術(shù)來(lái)實(shí)現(xiàn)NAT穿越,該技術(shù)叫做“反向連接”,這是用于
當(dāng)兩個(gè)節(jié)點(diǎn)聯(lián)入服務(wù)器S的時(shí)候,只有一個(gè)一個(gè)節(jié)點(diǎn)在NAT設(shè)備的后面(如圖3所示)。如果A希望建立與
B的連接,那么A可以直接聯(lián)入B,因?yàn)锽是在公網(wǎng)中存在的,沒(méi)有經(jīng)過(guò)NAT轉(zhuǎn)換,而且A的NAT設(shè)備也允許
A直接由內(nèi)網(wǎng)發(fā)起向外網(wǎng)的連接。如果B希望建立與A的連接,很不幸,A的NAT設(shè)備會(huì)阻止該操作,此時(shí),
B可以借助于轉(zhuǎn)發(fā)服務(wù)器S,向A發(fā)送“反向連接”請(qǐng)求,由A“主動(dòng)”連接B,從而達(dá)到A與B的p2p通信的目的。
盡管該技術(shù)的局限性非常明顯,但是使用已知的服務(wù)器做為中介輔助p2p客戶端雙方進(jìn)行p2p連接的思想已經(jīng)成為了更加通用的“打洞”技術(shù)的基本思想。