P2P的NAT穿透解析

[TOC]

NAT背景

NAT(Network Address Translation,),稱為網(wǎng)絡(luò)地址轉(zhuǎn)換或者網(wǎng)絡(luò)地址掩蔽。NAT是一種網(wǎng)絡(luò)地址翻譯技術(shù)板甘,主要是將內(nèi)部的私有IP地址(private IP)轉(zhuǎn)換成可以在公網(wǎng)使用的公網(wǎng)IP(public IP)。

由于現(xiàn)有的IPv4地址編碼只有32位空間详炬,最多可容納2的32次冪臺終端設(shè)備連入互聯(lián)網(wǎng)盐类;再加上IPv4地址空間被按照不同前綴長度劃分為A,B,C,D類地址網(wǎng)絡(luò)和保留地址,更加劇了IP地址的不足呛谜。NAT出現(xiàn)的背景正是源于IPv4地址不夠用在跳,所以才會采取這種地址轉(zhuǎn)換的策略∫海可見猫妙,NAT的本質(zhì)就是讓一群機(jī)器共用同一個IP,這種方案暫時解決了IP短缺的問題聚凹。

NAT類型

在RFC3489中定義了4種NAT類型(如下)割坠,即早期的STUN協(xié)議。STUN(Simple Traversal of User Datagram Protocol Through Network Address Translators)妒牙,即簡單的用UDP穿透NAT韭脊,是個輕量級的協(xié)議,是基于UDP的完整的穿透NAT的解決方案单旁,最早定義在RFC3489。它允許應(yīng)用程序發(fā)現(xiàn)它們與公共互聯(lián)網(wǎng)之間存在的NAT和防火墻及其他類型饥伊。后來在新的RFC5389修訂中把STUN協(xié)議定位于為穿透NAT提供工具象浑,而不是一個完整的解決方案蔫饰,英文全稱為Session Traversal Utilities for NAT,即NAT會話穿透工具愉豺。

  • 完全錐型NAT(Full Cone NAT)
    即一對一(one-to-one)NAT篓吁。一旦一個內(nèi)部地址(iAddr:port1)映射到外部地址(eAddr:port2),所有發(fā)自iAddr:port1的包都經(jīng)由eAddr:port2向外發(fā)送蚪拦。任意外部主機(jī)都能通過給eAddr:port2發(fā)包到達(dá)iAddr:port1杖剪。
完全錐型NAT
  • 受限錐型NAT(Address-Restricted Cone NAT)
    限制地址,即只接收曾經(jīng)發(fā)送到對端的IP地址來的數(shù)據(jù)包驰贷。一旦一個內(nèi)部地址(iAddr:port1)映射到外部地址(eAddr:port2)盛嘿,所有發(fā)自iAddr:port1的包都經(jīng)由eAddr:port2向外發(fā)送。任意外部主機(jī)(hostAddr:any)都能通過給eAddr:port2發(fā)包到達(dá)iAddr:port1的前提是:iAddr:port1之前發(fā)送過包到hostAddr:any. "any"也就是說端口不受限制括袒。
受限錐型NAT
  • 端口受限型NAT(Port Restricted Cone NAT)
    類似受限制錐形NAT(Address-Restricted cone NAT)次兆,但是還有端口限制。一旦一個內(nèi)部地址(iAddr:port1)映射到外部地址(eAddr:port2)锹锰,所有發(fā)自iAddr:port1的包都經(jīng)由eAddr:port2向外發(fā)送芥炭。一個外部主機(jī)(hostAddr:port3)能夠發(fā)包到達(dá)iAddr:port1的前提是:iAddr:port1之前發(fā)送過包到hostAddr:port3。
端口受限型NAT
  • 對稱型NAT(Symmetric NAT)
    對每個外部主機(jī)或端口的會話(session)都會映射為不同的端口恃慧。只有來自同一內(nèi)部IP:PORT园蝠、且針對同一外部目標(biāo)IP:PORT的請求才被NAT轉(zhuǎn)換至同一個公網(wǎng)(外部)IP:PORT,否則的話痢士,NAT將為之分配一個新的外部(公網(wǎng))IP:PORT彪薛。并且,只有曾經(jīng)收到過內(nèi)部主機(jī)請求的外部主機(jī)才能向內(nèi)部主機(jī)發(fā)送數(shù)據(jù)包良瞧。重點在于NAT設(shè)備會分配不同的外部port來區(qū)分不同的會話(session)陪汽。
對稱型NAT

NAT穿透之UDP打洞

UDP打洞技術(shù)是通過中間服務(wù)器的協(xié)助在各自的NAT網(wǎng)關(guān)上建立相關(guān)的表項,使P2P連接的雙方發(fā)送的報文能夠直接穿透對方的NAT網(wǎng)關(guān)褥蚯,從而實現(xiàn)P2P客戶端互連挚冤。如果兩臺位于NAT設(shè)備后面的P2P客戶端希望在自己的NAT網(wǎng)關(guān)上打個洞,那么他們需要一個協(xié)助者——中間服務(wù)器赞庶,并且還需要一種用于打洞的Session建立機(jī)制训挡。目前通用的就是使用STUN協(xié)議。

P2P建立Session的通用過程

假定客戶端A要發(fā)起對客戶端B的直接連接歧强,具體的“打洞”過程如下:

  1. A最初不知道如何向客戶端B發(fā)起連接澜薄,于是A向集中服務(wù)器發(fā)送消息,請求中間服務(wù)器S幫助建立與客戶端B的UDP連接摊册。
  2. 中間服務(wù)器S將含有B的外網(wǎng)和內(nèi)網(wǎng)的地址二元組發(fā)給A肤京,同時,中間服務(wù)器S將包含有A的外網(wǎng)和內(nèi)網(wǎng)的地址二元組信息的消息也發(fā)給B。這樣一來忘分, A與B就都知道對方外網(wǎng)和內(nèi)網(wǎng)的地址二元組信息了棋枕。
  3. 當(dāng)A收到由中間服務(wù)器S發(fā)來的包含B的外網(wǎng)和內(nèi)網(wǎng)的地址二元組信息后, A開始向B的地址二元組發(fā)送UDP數(shù)據(jù)包妒峦,并且A會自動鎖定第一個給出響應(yīng)的B的地址二元組重斑。同理,當(dāng)B收到由中間服務(wù)器S發(fā)來的A的外網(wǎng)和內(nèi)網(wǎng)地址二元組信息后肯骇,也會開始向A的外網(wǎng)和內(nèi)網(wǎng)的地址二元組發(fā)送UDP數(shù)據(jù)包窥浪,并且自動鎖定第一個得到A回應(yīng)的地址二元組。由于A與B互相向?qū)Ψ桨l(fā)送UDP數(shù)據(jù)包的操作是異步的笛丙,所以A和B發(fā)送數(shù)據(jù)包的時間先后并沒有時序要求漾脂。

P2P的3種典型NAT穿透場景

  • 兩客戶端位于同一NAT設(shè)備后面(即相同內(nèi)網(wǎng)中)
場景1
1. A向中間服務(wù)器S請求與B進(jìn)行連接,S將B的外網(wǎng)以及內(nèi)網(wǎng)的地址二元組發(fā)給A
2. 中間服務(wù)器S把A的外網(wǎng)以及內(nèi)網(wǎng)的地址二元組信息發(fā)給B
3. A和B各自給對方公網(wǎng)以及內(nèi)網(wǎng)地址二元組信息各發(fā)送UDP數(shù)據(jù)包
4. 選擇最先響應(yīng)的地址二元組信息進(jìn)行常規(guī)P2P通信

我們注意到這時里的公網(wǎng)地址其實只有一個若债,只是目標(biāo)端口不同符相。往公網(wǎng)地址發(fā)送的UDP數(shù)據(jù)如果想成功穿透兽泄,NAT設(shè)備需要支持Hairpin技術(shù)胧沫。Hairpin技術(shù)又被稱為Hairpin NAT、Loopback NAT或Hairpin Translation甫匹。它能夠讓兩臺位于同一臺NAT設(shè)備后面的主機(jī)傲须,通過對方的公網(wǎng)地址和端口相互訪問蓝牲,NAT設(shè)備會根據(jù)一系列規(guī)則,將對內(nèi)部主機(jī)發(fā)往其NAT公網(wǎng)IP地址的報文進(jìn)行轉(zhuǎn)換泰讽,并從私網(wǎng)接口發(fā)送給目標(biāo)主機(jī)例衍,類似一種中繼(relay)。目前有很多NAT設(shè)備不支持該技術(shù)已卸,這種情況下佛玄,NAT網(wǎng)關(guān)在一些特定場合下將會阻斷P2P穿越NAT的行為,打洞的嘗試是無法成功的累澡。

  • 兩客戶端位于不同的NAT設(shè)備后面(分屬不同的內(nèi)網(wǎng))
場景2
1. A向中間服務(wù)器S請求與B進(jìn)行連接梦抢,S將B的外網(wǎng)以及內(nèi)網(wǎng)的地址二元組發(fā)給A
2. 中間服務(wù)器S把A的外網(wǎng)以及內(nèi)網(wǎng)的地址二元組信息發(fā)給B
3. A和B各自給對方公網(wǎng)以及內(nèi)網(wǎng)地址二元組信息各發(fā)送UDP數(shù)據(jù)包
4. 由于內(nèi)網(wǎng)不存在對端機(jī)器,所以內(nèi)網(wǎng)不會有響應(yīng)愧哟,只有外網(wǎng)響應(yīng)后才可以通信
  • 兩客戶端位于兩層(或多層)NAT設(shè)備之后(分屬不同的內(nèi)網(wǎng))
場景3

假定NAT C是由ISP提供的NAT設(shè)備奥吩,NAT C提供將多個用戶節(jié)點映射到有限的幾個公網(wǎng)IP的服務(wù),NAT A和NAT B作為NAT C的內(nèi)網(wǎng)節(jié)點將把用戶的內(nèi)部網(wǎng)絡(luò)接入NAT C的內(nèi)網(wǎng)蕊梧,用戶的內(nèi)部網(wǎng)絡(luò)就可以經(jīng)由NAT C訪問公網(wǎng)了霞赫。從這種拓?fù)浣Y(jié)構(gòu)上來看,只有服務(wù)器S與NAT C是真正擁有公網(wǎng)可路由IP地址的設(shè)備肥矢,而NAT A和NAT B所使用的公網(wǎng)IP地址端衰,實際上是由ISP服務(wù)提供商設(shè)定的(相對于NAT C而言)內(nèi)網(wǎng)地址(我們將這種由ISP提供的內(nèi)網(wǎng)地址稱之為“偽”公網(wǎng)地址)。同理,隸屬于NAT A與NAT B的客戶端旅东,它們處于NAT A惕味,NAT B的內(nèi)網(wǎng),以此類推玉锌,客戶端可以放到到多層NAT設(shè)備后面∨备客戶端A和客戶端B發(fā)起對服務(wù)器S的連接的時候主守,就會依次在NAT A和NAT B上建立向外的Session,而NAT A榄融、NAT B要聯(lián)入公網(wǎng)的時候参淫,會在NAT C上再建立向外的Session。

現(xiàn)在假定客戶端A和B希望通過UDP“打洞”完成兩個客戶端的P2P直連愧杯。最優(yōu)化的路由策略是客戶端A向客戶端B的“偽公網(wǎng)”IP上發(fā)送數(shù)據(jù)包涎才,即ISP服務(wù)提供商指定的內(nèi)網(wǎng)IP,NAT B的“偽”公網(wǎng)地址二元組力九,{10.0.1.2:55000}耍铜。由于從服務(wù)器S的角度只能觀察到真正的公網(wǎng)地址,也就是NAT A跌前,NAT B在NAT C建立session的真正的公網(wǎng)地址{155.99.25.11:62000}以及{155.99.25.11:62005}棕兼,非常不幸的是客戶端A與客戶端B是無法通過服務(wù)器S知道這些“偽”公網(wǎng)的地址,而且即使客戶端A和B通過某種手段可以得到NAT A和NAT B的“偽”公網(wǎng)地址抵乓,我們?nèi)匀徊唤ㄗh采用上述的“最優(yōu)化”的打洞方式伴挚,這是因為這些地址是由ISP服務(wù)提供商提供的或許會存在與客戶端本身所在的內(nèi)網(wǎng)地址重復(fù)的可能性(例如:NAT A的內(nèi)網(wǎng)的IP地址域恰好與NAT A在NAT C的“偽”公網(wǎng)IP地址域重復(fù),這樣就會導(dǎo)致打洞數(shù)據(jù)包無法發(fā)出的問題)灾炭。

因此客戶端別無選擇茎芋,只能使用由公網(wǎng)服務(wù)器S觀察到的A,B的公網(wǎng)地址二元組進(jìn)行“打洞”操作蜈出,用于“打洞”的數(shù)據(jù)包將由NAT C進(jìn)行轉(zhuǎn)發(fā)田弥,此時如果NAT C不支持Hairpin轉(zhuǎn)換,打洞將失敗掏缎。

P2P做NAT穿透的約束條件

  • 一制性映射
    在4種NAT類型中皱蹦,目前只有完全錐型NAT(Full Cone NAT)符合這個要求,可以成功在Peer之間做穿透眷蜈,其它3種類型基本都無法做穿透沪哺;只能依賴Relay服務(wù)器做中繼(relay)才可完成Peer之間的通信。
    但也有一些例外情況酌儒,如一些NAT設(shè)備的對稱型NAT(Symmetric NAT)在給連續(xù)的會話(session)分配外部端口時也會是連續(xù)的辜妓,這樣分配的外部端口就具有高度可預(yù)測性;所有穿透算法就可以利用這個特性在穿透時用估算的端口進(jìn)行穿透測試,如此反復(fù)多次測試是否可以打通籍滴;但這種方法也只是在某些特定NAT設(shè)備中有效酪夷。

  • 忽略數(shù)據(jù)包的payload數(shù)據(jù)
    一些老的NAT設(shè)備在做NAT轉(zhuǎn)換時,由于算法過于簡單陳舊孽惰,不僅會轉(zhuǎn)換包頭的IP地址和端口號晚岭,還會把數(shù)據(jù)包的payload數(shù)據(jù)中出現(xiàn)的IP地址和端口號也同時轉(zhuǎn)換,這樣就會影響STUN協(xié)議正常工作勋功。

  • Hairpin轉(zhuǎn)換
    如上面提到的第3個NAT穿透場景中坦报,當(dāng)兩客戶端位于兩層(或多層)NAT設(shè)備之后,就需要NAT設(shè)備支持Hairpin轉(zhuǎn)換才可以實現(xiàn)穿透狂鞋。

全文完

參考資料

Peer-to-Peer Communication Across NATs

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末片择,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子骚揍,更是在濱河造成了極大的恐慌字管,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,376評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件信不,死亡現(xiàn)場離奇詭異嘲叔,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)浑塞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評論 2 385
  • 文/潘曉璐 我一進(jìn)店門借跪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人酌壕,你說我怎么就攤上這事掏愁。” “怎么了卵牍?”我有些...
    開封第一講書人閱讀 156,966評論 0 347
  • 文/不壞的土叔 我叫張陵果港,是天一觀的道長。 經(jīng)常有香客問我糊昙,道長辛掠,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,432評論 1 283
  • 正文 為了忘掉前任释牺,我火速辦了婚禮萝衩,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘没咙。我一直安慰自己猩谊,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,519評論 6 385
  • 文/花漫 我一把揭開白布祭刚。 她就那樣靜靜地躺著牌捷,像睡著了一般墙牌。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上暗甥,一...
    開封第一講書人閱讀 49,792評論 1 290
  • 那天喜滨,我揣著相機(jī)與錄音,去河邊找鬼撤防。 笑死虽风,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的寄月。 我是一名探鬼主播焰情,決...
    沈念sama閱讀 38,933評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼剥懒!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起合敦,我...
    開封第一講書人閱讀 37,701評論 0 266
  • 序言:老撾萬榮一對情侶失蹤初橘,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后充岛,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體保檐,經(jīng)...
    沈念sama閱讀 44,143評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,488評論 2 327
  • 正文 我和宋清朗相戀三年崔梗,在試婚紗的時候發(fā)現(xiàn)自己被綠了夜只。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,626評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡蒜魄,死狀恐怖扔亥,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情谈为,我是刑警寧澤旅挤,帶...
    沈念sama閱讀 34,292評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站伞鲫,受9級特大地震影響粘茄,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜秕脓,卻給世界環(huán)境...
    茶點故事閱讀 39,896評論 3 313
  • 文/蒙蒙 一柒瓣、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧吠架,春花似錦芙贫、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽默穴。三九已至,卻和暖如春褪秀,著一層夾襖步出監(jiān)牢的瞬間蓄诽,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工媒吗, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留仑氛,地道東北人。 一個月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓闸英,卻偏偏與公主長得像锯岖,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子甫何,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,494評論 2 348

推薦閱讀更多精彩內(nèi)容