NAT的全然分析及其UDP穿透的全然解决方式
生活随笔
收集整理的這篇文章主要介紹了
NAT的全然分析及其UDP穿透的全然解决方式
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
NAT的全然分析及其UDP穿透的全然解決方式 ? 一:基本術(shù)語(yǔ) 防火墻 防火墻限制了私網(wǎng)與公網(wǎng)的通信,它主要是將(防火墻)覺得未經(jīng)授權(quán)的的包丟棄,防火墻僅僅是檢驗(yàn)包的數(shù)據(jù),并不改動(dòng)數(shù)據(jù)包中的IP地址和TCP/UDPport信息。 網(wǎng)絡(luò)地址轉(zhuǎn)換(NAT) 當(dāng)有數(shù)據(jù)包通過(guò)時(shí),網(wǎng)絡(luò)地址轉(zhuǎn)換器不僅檢查包的信息,還要將包頭中的IP地址和port信息進(jìn)行改動(dòng)。以使得處于NAT之后的機(jī)器共享幾個(gè)僅有的公網(wǎng)IP地址(一般是一個(gè))。網(wǎng)絡(luò)地址轉(zhuǎn)換器主要有兩種類型. P2P應(yīng)用程序 P2P應(yīng)用程序是指,在已有的一個(gè)公共server的基礎(chǔ)上,并分別利用自己的私有地址或者公有地址(或者兩者兼?zhèn)?#xff09;來(lái)建立一個(gè)端到端的會(huì)話通信。 P2P防火墻 P2P防火墻是一個(gè)提供了防火墻的功能的P2P代理,可是不進(jìn)行地址轉(zhuǎn)換. P2P-NAT P2P-NAT 是一個(gè)P2P代理,提供了NAT的功能,也提供了防火墻的功能,一個(gè)最簡(jiǎn)的P2P代理必須具有錐形NAT對(duì)Udp通信支持的功能,并同意應(yīng)用程序利用Udp打洞技術(shù)建立強(qiáng)健的P2P連接。 回環(huán)轉(zhuǎn)換 當(dāng)NAT的私網(wǎng)內(nèi)部機(jī)器想通過(guò)公共地址來(lái)訪問(wèn)同一臺(tái)局域網(wǎng)內(nèi)的機(jī)器的時(shí),NAT設(shè)備等價(jià)于做了兩次NAT的事情,在包到達(dá)目標(biāo)機(jī)器之前,先將私有地址轉(zhuǎn)換為公網(wǎng)地址,然后再將公網(wǎng)地址轉(zhuǎn)換回私有地址。我們把具有上敘轉(zhuǎn)換功能的NAT設(shè)備叫做“回環(huán)轉(zhuǎn)換”設(shè)備。 二:NAT分類 能夠分為基礎(chǔ)NAT與網(wǎng)絡(luò)地址和port轉(zhuǎn)換(NAPT)兩大類 (一):基礎(chǔ)NAT 基礎(chǔ)NAT 將私網(wǎng)主機(jī)的私有IP地址轉(zhuǎn)換成公網(wǎng)IP地址,但并不將TCP/UDPport信息進(jìn)行轉(zhuǎn)換。基礎(chǔ)NAT一般用在當(dāng)NAT擁有非常多公網(wǎng)IP地址的時(shí)候,它將公網(wǎng)IP地址與內(nèi)部主機(jī)進(jìn)行綁定,使得外部能夠用公網(wǎng)IP地址訪問(wèn)內(nèi)部主機(jī)。(實(shí)際上是僅僅將IP轉(zhuǎn)換,192.168.0.23 <-> 210.42.106.35,這與直接設(shè)置IP地址為公網(wǎng)IP還是有一定差別的,特別是對(duì)于企業(yè)來(lái)說(shuō),外部的信息都要經(jīng)過(guò)統(tǒng)一防火墻才干到達(dá)內(nèi)部,可是內(nèi)部主機(jī)又能夠使用公網(wǎng)IP) (二):網(wǎng)絡(luò)地址和port轉(zhuǎn)換 (NAPT) 這是最普遍的情況,網(wǎng)絡(luò)地址/port轉(zhuǎn)換器檢查、改動(dòng)包的IP地址和TCP/UDPport信息,這樣,很多其它的內(nèi)部主機(jī)就能夠同一時(shí)候使用一個(gè)公網(wǎng)IP地址。 請(qǐng)參考[RFC1631]和[RFC2993]及[RFC2663]這三個(gè)文檔了解很多其它的NAT分類和術(shù)語(yǔ)信息。另外,關(guān)于NAPT的分類和術(shù)語(yǔ),[RFC2663]做了很多其它的定義。當(dāng)一個(gè)內(nèi)部網(wǎng)主機(jī)通過(guò)NAT打開一個(gè)“外出”的TCP或UDP會(huì)話時(shí),NAPT分配給這個(gè)會(huì)話一個(gè)公網(wǎng)IP和port,用來(lái)接收外網(wǎng)的響應(yīng)的數(shù)據(jù)包,并經(jīng)過(guò)轉(zhuǎn)換通知內(nèi)部網(wǎng)的主機(jī)。這樣做的效果是,NAPT在 [私有IP:私有port] 和[公網(wǎng)IP:公網(wǎng)port]之間建立了一個(gè)port綁定。 port綁定指定了NAPT將在這個(gè)會(huì)話的生存期內(nèi)進(jìn)行地址轉(zhuǎn)換任務(wù)。這中間存在一個(gè)這種問(wèn)題,假設(shè)P2P應(yīng)用程序從內(nèi)部網(wǎng)絡(luò)的一個(gè)[私有IP地址:port]對(duì)同一時(shí)候發(fā)出多條會(huì)話給不同的外網(wǎng)主機(jī),那么NAT會(huì)如何處理呢?這又能夠分為錐形NAT (CONE NAT)與對(duì)稱NAT (SYMMTRIC NAT)兩大類來(lái)考慮: A.錐形NAT (為什么叫做錐形呢?請(qǐng)看下面圖形,終端和外部server,都通過(guò)NAT分派的這個(gè)綁定地址對(duì)來(lái)傳送信息,就象一個(gè)漏斗一樣,篩選并傳遞信息) 當(dāng)建立了一個(gè)[私有IP:port]-[公網(wǎng)IP:port] port綁定之后,對(duì)于來(lái)自同一個(gè)[私有IP:port]會(huì)話,錐形NATserver同意發(fā)起會(huì)話的應(yīng)用程序 反復(fù)使用這個(gè)port綁定,一直到這個(gè)會(huì)話結(jié)束才解除(port綁定)。 比如,如果Client A(IP地址信息如上圖所看到的)通過(guò)一個(gè)錐形NAT 同一時(shí)候發(fā)起兩個(gè)外出的連接,它使用同一個(gè)內(nèi)部port(10.0.0.1:1234)給公網(wǎng)的兩臺(tái)不同的server,S1和S2。錐形NAT 僅僅分配一個(gè)公網(wǎng)IP和port(155.99.25.11:62000)給這個(gè)兩個(gè)會(huì)話,通過(guò)地址轉(zhuǎn)換能夠確保 Client使用port的“同一性”(即這個(gè)Client僅僅使用這個(gè)port)。而基礎(chǔ)NATs和防火墻卻不能改動(dòng)經(jīng)過(guò)的數(shù)據(jù)包port號(hào),它們能夠看作是錐形NAT的精簡(jiǎn)版本號(hào)。 進(jìn)一步分析能夠?qū)?strong>CONE NAT受限制錐形NAT (RESTRICT CONE) 與port受限錐形NAT (PORT RESTRICT CONE) 三大類,下面是具體論述: 分為全雙工錐形NAT (FULL CONE) , 1.全雙工錐形NAT 當(dāng)內(nèi)部主機(jī)發(fā)出一個(gè)“外出”的連接會(huì)話,就會(huì)創(chuàng)建了一個(gè)公網(wǎng)/私網(wǎng) 地址,一旦這個(gè)地址對(duì)被創(chuàng)建,全雙工錐形NAT會(huì)接收隨后不論什么外部port傳入這個(gè)公共port地址的通信。因此,全雙工錐形NAT有時(shí)候又被稱為"混雜"NAT。 2.受限制錐形NAT 受限制的錐形NAT會(huì)對(duì)傳入的數(shù)據(jù)包進(jìn)行篩選,當(dāng)內(nèi)部主機(jī)發(fā)出“外出”的會(huì)話時(shí),NAT會(huì)記錄這個(gè)外部主機(jī)的IP地址信息,所以,也僅僅有這些有記錄的外部IP地址,可以將信息傳入到NAT內(nèi)部,受限制的錐形NAT 有效的給防火墻提煉了篩選包的原則——即限定僅僅給那些已知的外部地址“傳入”信息到NAT內(nèi)部。 3.port受限錐形NAT port受限制的錐形NAT,與受限制的錐形NAT不同的是:它同一時(shí)候記錄了外部主機(jī)的IP地址和port信息,port受限制的錐形NAT給內(nèi)部節(jié)點(diǎn)提供了同一級(jí)別的保護(hù),在維持port“同一性”過(guò)程中,將會(huì)丟棄對(duì)稱NAT傳回的信息。 B.對(duì)稱NAT 對(duì)稱NAT,與Cone NAT是大不同樣的,并不正確會(huì)話進(jìn)行port綁定,而是分配一個(gè)全新的公網(wǎng)port 給每個(gè)新的會(huì)話。 還是上面那個(gè)樣例:假設(shè)Client A (10.0.0.1:1234)同一時(shí)候發(fā)起兩個(gè) "外出" 會(huì)話,分別發(fā)往S1和S2。對(duì)稱Nat會(huì)分配公共地址155.99.25.11:62000給Session1,然后分配還有一個(gè)不同的公共地址155.99.25.11:62001給Session2。對(duì)稱Nat可以差別兩個(gè)不同的會(huì)話并進(jìn)行地址轉(zhuǎn)換,由于在 Session1 和 Session2中的外部地址是不同的,正是由于這樣,Client端的應(yīng)用程序就迷失在這個(gè)地址轉(zhuǎn)換邊界線了,由于這個(gè)應(yīng)用程序每發(fā)出一個(gè)會(huì)話都會(huì)使用一個(gè)新的port,無(wú)法保障僅僅使用同一個(gè)port了。 在TCP和UDP通信中,(究竟是使用同一個(gè)port,還是分配不同的port給同一個(gè)應(yīng)用程序),錐形NAT和對(duì)稱NAT各有各的理由。當(dāng)然錐形NAT在依據(jù)怎樣公平地將NAT接受的連接直達(dá)一個(gè)已創(chuàng)建的地址對(duì)上有很多其它的分類。這個(gè)分類一般應(yīng)用在Udp通信(而不是Tcp通信上),由于NATs和防火墻阻止了試圖無(wú)條件傳入的TCP連接,除非明白設(shè)置NAT不這樣做。 三:NAT對(duì)session的處理 下面分析NAPT是根據(jù)什么策略來(lái)推斷是否要為一個(gè)請(qǐng)求發(fā)出的UDP數(shù)據(jù)包建立Session的.主要有一下幾個(gè)策略: A. 源地址(內(nèi)網(wǎng)IP地址)不同,忽略其他因素, 在NAPT上肯定相應(yīng)不同的Session B. 源地址(內(nèi)網(wǎng)IP地址)同樣,源port不同,忽略其他的因素,則在NAPT上也肯定相應(yīng)不同的Session C. 源地址(內(nèi)網(wǎng)IP地址)同樣,源port同樣,目的地址(公網(wǎng)IP地址)同樣,目的port不同,則在NAPT上肯定相應(yīng)同一個(gè)Session D. 源地址(內(nèi)網(wǎng)IP地址)同樣,源port同樣,目的地址(公網(wǎng)IP地址)不同,忽略目的port,則在NAPT上是怎樣處理Session的呢? A,B,C三種情況的都是比較簡(jiǎn)單的,能夠非常easy的實(shí)現(xiàn).而D的情況就比較復(fù)雜了.所以D情況才是我們要重點(diǎn)關(guān)心和討論的問(wèn)題。 四:全然解決方式 下面針對(duì)四種SESSION與四種NAT的全然解決方式,為了方便將使用下面縮寫形式: C代表 CONE NAT S代表SYMMETRIC NAT, FC代表 FULL CONE NAT, RC代表 RESTRICT CONE NAT, PC 代表 PORT RESTRICT CONE NAT. 首先根據(jù)CLIENT (客戶)端在NAT后 的個(gè)數(shù)不同能夠分為兩大類: TYPE?ONE :一個(gè)在NAT后 + 一個(gè)在公網(wǎng)中. 這樣的情況下能夠分為兩大類: A. S VS 公網(wǎng):此種情況下,因?yàn)楣W(wǎng)的地址在一個(gè)SESSION內(nèi)是不變的,所以能夠打洞是能夠成功的. B. C VS 公網(wǎng): 與上面相似,這樣的情口下打洞是能夠成功的. TYPE?TWO:兩個(gè)客戶都在NAT后面. 這樣的情況下也能夠細(xì)分為兩大類: A. 當(dāng)中一個(gè)NAT 是 S(SYMMETRIC NAT) 型的,既:S VS C或者是S VS S . 以下論證這樣的情口下依照常規(guī)打洞是行不通的,在常規(guī)打洞中,全部的客戶首先登陸到一個(gè)server上去.server記錄下每一個(gè)客戶的[公網(wǎng)IP:port],然后在打洞過(guò)程中就使用這個(gè)記錄的值,然而對(duì)于S型的NAT來(lái)說(shuō),它并不綁定[私網(wǎng)IP:port]和[公網(wǎng)IP:port]的映射.所以在不同的SESSION中,NAT將會(huì)又一次分配一對(duì)[公網(wǎng)IP:port].這樣一來(lái)對(duì)于S型的NAT來(lái)說(shuō)打洞的[公網(wǎng)IP:port]與登記在server上的[公網(wǎng)IP:port]是不同的.并且也沒(méi)有辦法將打洞的[公網(wǎng)IP:port]通知到還有一個(gè)位于NAT下的client, 所以打洞是不會(huì)成功的.然而假設(shè)還有一個(gè)client是在公網(wǎng)時(shí),打洞是能夠的.前面已經(jīng)論證了這樣的情況. 這樣的情況下的解決方式是僅僅能通過(guò)port預(yù)測(cè)來(lái)進(jìn)行打洞,詳細(xì)解決方法例如以下:比如(以兩個(gè)都是S型的為例) NAT A 分配了它自己的UDPport62000,用來(lái)保持 clientA 與serverS的通信會(huì)話,?NAT B 也分配了31000port,用來(lái)保持clientB與serverS 的通信會(huì)話。通過(guò)與 serverS的對(duì)話,clientA 和 clientB都相互知道了對(duì)方所映射的真實(shí)IP和port。 ??clientA發(fā)送一條UDP消息到138.76.29.7:31001(請(qǐng)注意到port號(hào)的添加),同一時(shí)候clientB發(fā)送一條UDP消息到155.99.25.11:62001。假設(shè)NAT A 和NAT B繼續(xù)分配port給新的會(huì)話,而且從A-S和B-S的會(huì)話時(shí)間消耗得并不多的話,那么一條處于clientA和clientB之間的雙向會(huì)話通道就建立了。 ??clientA發(fā)出的消息送達(dá)B導(dǎo)致了NAT A打開了一個(gè)新的會(huì)話,而且我們希望NAT A將會(huì)指派62001port給這個(gè)新的會(huì)話,由于62001是繼62000后,NAT會(huì)自己主動(dòng)指派給 從serverS到clientA之間的新會(huì)話的port號(hào);相似的,clientB發(fā)出的消息送達(dá)A導(dǎo)致了 NAT B打開了一個(gè)新的會(huì)話,而且我們希望 NAT B將會(huì)指派31001這個(gè)port給新的會(huì)話;假設(shè)兩個(gè)client都正確的推測(cè)到了對(duì)方新會(huì)話被指派的port號(hào),那么這個(gè) clientA-clientB的雙向連接就被打通了。其結(jié)果例如以下圖所看到的: 明顯的,有很多因素會(huì)導(dǎo)致這種方法失敗:假設(shè)這個(gè)預(yù)言的新port(62001和31001) 恰好已經(jīng)被一個(gè)不相關(guān)的會(huì)話所使用,那么NAT就會(huì)跳過(guò)這個(gè)port號(hào),這個(gè)連接就會(huì)宣告失敗;假設(shè)兩個(gè)NAT有時(shí)或者總是不依照順序來(lái)生成新的port號(hào),那么這種方法也是行不通的。 假設(shè)隱藏在NATA后的一個(gè)不同的clientX(或者在NAT B后)打開了一個(gè)新的“外出”UDP 連接,并且不管這個(gè)連接的目的怎樣;僅僅要這個(gè)動(dòng)作發(fā)生在clientA 建立了與serverS的連接之后,clientA 與 clientB 建立連接之前;那么這個(gè)無(wú)關(guān)的clientX 就會(huì)趁人不備地“偷”?到這個(gè)我們渴望分配的port。所以,這種方法變得如此脆弱并且不堪一擊,僅僅要不論什么一個(gè)NAT方包括以上碰到的問(wèn)題,這種方法都不會(huì)奏效。 在處于cone NAT 系列的網(wǎng)絡(luò)環(huán)境中這種方法還是有用的;假設(shè)有一方為 cone NAT 而另外一方為 symmetric NAT,那么應(yīng)用程序就應(yīng)該預(yù)先發(fā)現(xiàn)另外一方的 NAT 是什么類型,再做出正確的行為來(lái)處理通信,這樣就增大了算法的復(fù)雜度,而且減少了在真實(shí)網(wǎng)絡(luò)環(huán)境中的普適性。 最后,假設(shè)P2P的一方處在兩級(jí)或者兩級(jí)以上的NAT以下,而且這些NATS 接近這個(gè)client是SYMMETRIC NAT的話,port號(hào)預(yù)言是無(wú)效的! 因此,并不推薦使用這種方法來(lái)寫新的P2P應(yīng)用程序,這也是歷史的經(jīng)驗(yàn)和教訓(xùn)! B. 兩個(gè)都是CONE NAT型的. 這樣的情況下能夠分為六大類型: A: FC + FC B: FC + RC C: FC + PC D: PC + RC E: PC + PC F: RC + RC 盡管有這么多種情況,可是由于CONE NAT 的特性,所以還是非常好辦的,由于對(duì)于CONE NAT 來(lái)說(shuō),在同一個(gè)SESSION中它會(huì)綁定一對(duì)[私網(wǎng)IP:port]和[公網(wǎng)IP:port]的映射,所以它們打洞用的[公網(wǎng)IP:port]與登記在server上的[公網(wǎng)IP:port]是一致的,所以打洞是能夠行的通的. 綜上所述,就已經(jīng)全然的概括了全部類型的NAT之間的可能的通信情況了.而且都提供了可行的解決方式. 五:對(duì)前一階段的總結(jié) 1.前一階段使用的打洞方法是有缺陷的,它僅僅適應(yīng)于兩個(gè)都是FULL CONE NAT的類型的CLIENT(client).下面論證它不適應(yīng)于兩個(gè)都是CONE NAT的類型中的 B: FC + RC C: FC + PC D: PC + RC E: PC + PC F: RC + RC 這五種情況. 由于對(duì)于受限的NAT它登記了外出包的[IP地址&port],它只接受這些已登記地址發(fā)過(guò)來(lái)的包,所以它們報(bào)告server的port只能接受來(lái)自server的包.不能接受來(lái)自還有一client的包.所曾經(jīng)一階段的打洞方法是不可行的. 六: 存在的問(wèn)題 依照理論.NAT將在一定時(shí)間后關(guān)閉UDP的一個(gè)映射,所以為了保持與server可以一直通信,server必需要發(fā)送UDP心跳包,來(lái)保持映射不被關(guān)閉.這就需要一個(gè)合適的時(shí)間值.
轉(zhuǎn)載于:https://www.cnblogs.com/gcczhongduan/p/4316597.html
總結(jié)
以上是生活随笔為你收集整理的NAT的全然分析及其UDP穿透的全然解决方式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Oracle Proc开发之Makefi
- 下一篇: 命令行指令