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