1、NAT分類
1.1 基礎(chǔ)型NAT
僅將內(nèi)網(wǎng)主機的私有IP地址轉(zhuǎn)換成公網(wǎng)的IP地址,并不將TCP/UDP端口信息進行轉(zhuǎn)換,分為靜態(tài)NAT和動態(tài)NAT。
1.2 NAPT
NAPT不但會改變經(jīng)過這個NAT設(shè)備的IP數(shù)據(jù)報的IP地址,還會改變IP數(shù)據(jù)報的TCP/UDP端口。
1.2.1錐型NAT
- 完全錐型(Full Cone NAT):在不同內(nèi)網(wǎng)的主機A和B各自連接到服務(wù)器C,服務(wù)器收到A和B的連接后知道了他們的公網(wǎng)地址和NAT分配給他們的端口號,然后把這些NAT地址和端口號交叉告訴B和A。A和B給服務(wù)器所打開的“孔”可以給任何主機使用。如一私網(wǎng)主機地址是192.168.1.100:30000發(fā)至公網(wǎng)的所有請求都映射成一個公網(wǎng)地址172.1.20.100:20000,192.168.1.100:30000可以接收任何主機發(fā)給172.1.20.100:20000的數(shù)據(jù)報文。
- 受限制錐型(Restricted cone):主機A和B同樣需要各自連接服務(wù)器C,同時把A和B的地址告訴B和A,但一般情況下它們只能與服務(wù)器通信。要想直接通信需要發(fā)送消息給服務(wù)器C,如主機A發(fā)送一個UDP消息到主機B的公網(wǎng)地址上,與此同時,A又通過服務(wù)器C中轉(zhuǎn)發(fā)送一個邀請信息給主機B,請求主機B也給主機A發(fā)送一個UDP消息到主機A的公網(wǎng)地址上。這時主機A向主機B的公網(wǎng)IP發(fā)送的信息導(dǎo)致NAT A打開一個處于主機A的和主機B之間的會話,與此同時,NAT B也打開了一個處于主機B和主機A的會話。一旦這個新的UDP會話各自向?qū)Ψ酱蜷_了,主機A和主機B之間才可以直接通信。
- 端口受限錐型(Port-restricted):與受限制錐型類似,與之不同的是還要指定端口號。
1.2.2對稱NAT(Symmetric)
對不同的外網(wǎng)IP地址都會分配不同的端口號。
1.2.3 兩者區(qū)別
對稱NAT是一個請求對應(yīng)一個端口,非對稱NAT是多個請求對應(yīng)一個端口(象錐形,所以叫Cone NAT)。
1.3 安全系數(shù)
對稱型 > 端口受限錐型 > 受限錐型 > 全錐型
2、網(wǎng)絡(luò)打洞
2.1 打洞條件
- 中間服務(wù)器保存信息、并能發(fā)出建立UDP隧道的命令
- 網(wǎng)關(guān)均要求為Cone NAT類型。Symmetric NAT不適合。
- 完全圓錐型網(wǎng)關(guān)可以無需建立udp隧道,但這種情況非常少,要求雙方均為這種類型網(wǎng)關(guān)的更少。
- 假如X1網(wǎng)關(guān)為Symmetric NAT, Y1為Address Restricted Cone NAT 或Full Cone NAT型網(wǎng)關(guān),各自建立隧道后,A1可通過X1發(fā)送數(shù)據(jù)報給Y1到B1(因為Y1最多只進行IP級別的甄別),但B2發(fā)送給X1的將會被丟棄(因為發(fā)送來的數(shù)據(jù)報中端口與X1上存在會話的端口不一致,雖然IP地址一致),所以同樣沒有什么意義。
- 假如雙方均為Symmetric NAT的情形,新開了端口,對方可以在不知道的情況下嘗試猜解,也可以達到目的,但這種情形成功率很低,且?guī)眍~外的系統(tǒng)開支,不是個好的解決辦法。pwnat工具據(jù)說可以實現(xiàn)。
- 不同網(wǎng)關(guān)型設(shè)置的差異在于,對內(nèi)會采用替換IP的方式、使用不同端口不同會話的方式,使用相同端口不同會話的方式;對外會采用什么都不限制、限制IP地址、限制IP地址及端口。
- 這里還沒有考慮同一內(nèi)網(wǎng)不同用戶同時訪問同一服務(wù)器的情形,如果此時網(wǎng)關(guān)采用AddressRestricted Cone NAT 或Full Cone NAT型,有可能導(dǎo)致不同用戶客戶端可收到別人的數(shù)據(jù)包,這顯然是不合適的。
2.2 打洞流程
不同的網(wǎng)絡(luò)拓撲NAT打洞的方法和流程有所區(qū)別。
2.2.1 同一個NAT設(shè)備下
- clinet A與Server S建立UDP連接,公共NAT(155.99.25.11)給client A分配一個公網(wǎng)端口62000;
- client B與Server S建立UDP連接,公共NAT(155.99.25.11)給client A分配一個公網(wǎng)端口62005;
- client A通過Server S發(fā)送一個消息要求連接client B,S給A回應(yīng)B的公網(wǎng)和私網(wǎng)地址,并轉(zhuǎn)發(fā)A的公網(wǎng)和私網(wǎng)地址給B;
- A和B根據(jù)獲取的地址試圖直接發(fā)送UDP數(shù)據(jù)報文;是否成功取決于NAT設(shè)備是否支持hairpin translation(端口回流)。——打開端口回流相當(dāng)于與client A的數(shù)據(jù)經(jīng)過NAT設(shè)備轉(zhuǎn)發(fā)后才到達client B,即從外網(wǎng)NAT接口繞了一圈再訪問到同一個子網(wǎng)里的client B。(優(yōu)點是可以防止內(nèi)部攻擊)
2.2.2 不同NAT設(shè)備下
- A使用4321端口與S連接,NAT給回話在NAT分配外網(wǎng)62000端口(155.99.25.11:62000)與S連接;同理B以相同的方式與S連接,分配的外網(wǎng)地址端口是138.76.29.7:31000。
- A往S注冊消息包里包含里A的私有地址10.0.0.1:4321,此時S保存了A的地址;S給A臨時分配了一個用于公網(wǎng)的地址(155.99.25.11:62000),同時用于觀察外網(wǎng)數(shù)據(jù)包。
- 同理B往S注冊的消息包里也包含里B的地址,NAT同樣給B臨時分類了一個外網(wǎng)地址(138.76.29.7:31000)。
- Client A根據(jù)以上已知信息通過打洞的方式與B連接UDP通信:
- Client A發(fā)送請求消息,尋求連接B;
- S給A回應(yīng)B的外網(wǎng)和內(nèi)網(wǎng)地址,通給給B發(fā)送A的外網(wǎng)和內(nèi)網(wǎng)地址;
- A和B開始利用這些地址嘗試直接發(fā)送UDP報文給彼此,不幸的是,此時A和B都無法接收對應(yīng)的消息。因為A和B都是在不同的私有網(wǎng)絡(luò)中,A和B之前都是與S通信回話,并沒有與對方建立回話;即A沒有為B打開一個洞,B也沒有為A打開一個洞。這個過程的第一個報文需要會被拒絕同時打開對應(yīng)的“洞”,隨后才可以直接通信,具體如下:
- A給B公網(wǎng)地址(10.0.0.1:4321 to 138.76.29.7:31000)發(fā)送的第一個報文,實際上是在A的NAT私有網(wǎng)絡(luò)上“打洞”來為新識別的地址(10.0.0.1:4321 138.76.29.7:31000) 建立UDP會話,并經(jīng)主網(wǎng)地址(155.99.25.11:62000 138.76.29.7:31000)來傳送。
- 如果A發(fā)送到B的公網(wǎng)地址的消息在B發(fā)送到A的第一個消息越過B自己的NAT之前到達B的NAT,那么B的NAT可能會將A的入站消息解釋為非請求的傳入通信量并丟棄它。
- 同理,B給A公網(wǎng)地址方法的第一個消息也會在B的NAT上“打洞”來為地址(10.1.1.3:4321, 155.99.25.11:62000)建立回話。
- 隨后可以正常P2P通信。
2.2.3 多層NAT下
說明:NAT C 是一個大型的工業(yè)NAT設(shè)備,由ISP(Internet Service Provider,互聯(lián)網(wǎng)服務(wù)提供商)部署,用于將許多客戶多路復(fù)用到幾個公共IP地址上。
Client A和client B無法通道NAT A和NAT A進行P2P通信,因為它們屬于NAT C的局域網(wǎng)地址,因此client A和client B只能通道NAT C的hairpin translation進行P2P通信,如果NAT C不支持hairpin translation,則它們很難進行P2P通信。
每個客戶機像前面方式一樣啟動到服務(wù)器S的連接,引起NAT A和B各自創(chuàng)建一個單獨的公共/私有轉(zhuǎn)化——session A-S(18.181.0.31:1234 10.0.0.1:4321)和session B-S(18.181.0.31:1234 10.1.1.3:4321),并引起NAT C為每個會話建立一個公共/私有翻譯——session A-S(18.181.0.31:1234 10.0.1.1:45000)和session B-S(18.181.0.31:1234 10.0.1.2:5500)。
- 首先client A給client B的公網(wǎng)地址(155.99.25.11:62005)發(fā)送消息;
- NAT A翻譯原數(shù)據(jù)報文從10.0.0.1:4321帶10.0.0.1:45000;
- 數(shù)據(jù)報現(xiàn)在到達NAT C,它識別出數(shù)據(jù)報的目標(biāo)地址是NAT C自己翻譯的公共地址之一;
- 如果NAT C是好的,那么其能翻譯出數(shù)據(jù)報文的源地址和目標(biāo)地址(155.99.25.11:62000和10.0.1.2:55000),同時通過“回環(huán)”返回數(shù)據(jù)包到私有網(wǎng)絡(luò);
- NAT B 翻譯數(shù)據(jù)報文得到NAT B私網(wǎng)地址,最終到達client B。
- Client B給client A發(fā)送數(shù)據(jù)報文與上述步驟類似。
2.3 打洞組合
不同的NAT組合打洞的方式也有所不同,有點可以打洞,有的則不能打洞,如兩個都是對稱型設(shè)備則無法實現(xiàn)打洞。不同組合打洞結(jié)果如下:
Peer A | Peer B | 是否可以打洞 |
全錐型 | 全錐型 | 是 |
全錐型 | 受限錐型 | 是 |
全錐型 | 端口受限錐型 | 是 |
全錐型 | 對稱型 | 是 |
受限錐型 | 受限錐型 | 是 |
受限錐型 | 端口受限錐型 | 是 |
受限錐型 | 對稱型 | 是 |
端口受限錐型 | 端口受限錐型 | 是 |
端口受限錐型 | 對稱型 | 否 |
對稱型 | 對稱型 | 否 |
3、關(guān)聯(lián)技術(shù)
- ALG:即應(yīng)用程序級網(wǎng)關(guān)技術(shù):傳統(tǒng)的NAT技術(shù)只對IP層和傳輸層頭部進行轉(zhuǎn)換處理,但是一些應(yīng)用層協(xié)議,在協(xié)議數(shù)據(jù)報文中包含了地址信息。為了使得這些應(yīng)用也能透明地完成NAT轉(zhuǎn)換,NAT使用一種稱作ALG的技術(shù),它能對這些應(yīng)用程序在通信時所包含的地址信息也進行相應(yīng)的NAT轉(zhuǎn)換。主要類似與在網(wǎng)關(guān)上專門開辟一個通道,用于建立內(nèi)網(wǎng)與外網(wǎng)的連接,也就是說,這是一種定制的網(wǎng)關(guān)。更多只適用于使用他們的應(yīng)用群體內(nèi)部之間。
- UpnP:它是讓網(wǎng)關(guān)設(shè)備在進行工作時尋找一個全球共享的可路由IP來作為通道,這樣避免端口造成的影響。要求設(shè)備支持且開啟upnp功能,但大部分時候,這些功能處于安全考慮,是被關(guān)閉的。即時開啟,實際應(yīng)用效果還沒經(jīng)過測試。
- STUN(Simple Traversalof UDP Through Network):這種方式即是類似于我們上面舉例中服務(wù)器C的處理方式。也是目前普遍采用的方式。但具體實現(xiàn)要比我們描述的復(fù)雜許多,光是做網(wǎng)關(guān)Nat類型判斷就由許多工作,RFC3489中詳細描述了。
- TURN(Traveral Using Relay NAT):該方式是將所有的數(shù)據(jù)交換都經(jīng)由服務(wù)器來完成,這樣NAT將沒有障礙,但服務(wù)器的負載、丟包、延遲性就是很大的問題。目前很多游戲均采用該方式避開NAT的問題。這種方式不叫p2p。
- ICE(Interactive Connectivity Establishment):是對上述各種技術(shù)的綜合,但明顯帶來了復(fù)雜性。
4、其他
3.1 對稱NAT設(shè)備常用場景
1)使用第三方寬帶公司提供的寬帶,這類寬帶給用戶分配的是局域網(wǎng)IP,連接公網(wǎng)的NAT是運營商的,這類運營商一般采用對稱NAT。
2)移動互聯(lián)網(wǎng),如3G、4G終端設(shè)備;
3)大公司路由器一般采用對稱NAT;
3.2影響“打洞”的因素
- 許多對稱nat以一種相當(dāng)可預(yù)測的方式為連續(xù)的會話分配端口號,而有時分配到的端口剛好被別的應(yīng)用使用了。
- Client有可能分到多個公網(wǎng)地址,例如:在NAT將公網(wǎng)地址155.99.25.11:62000分配給client A與S的會話之后,NAT可能會將另一個公網(wǎng)地址(如155.99.25.11:62001)分配給A試圖發(fā)起與B的P2P會話。在這種情況下,依據(jù)提供的連接打洞過程將失敗,因為后續(xù)來自B的傳入消息到達NAT A的錯誤端口號。
- 其他。
該文章在 2021/2/2 12:19:24 編輯過