NAT 穿透技術、穿透原理和方法詳解
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 設備下
1、A 使用 4321 端口與 S 連接,NAT 給回話在 NAT 分配外網 62000 端口(155.99.25.11:62000)與 S 連接;同理 B 以相同的方式與 S 連接,分配的外網地址端口是 138.76.29.7:31000。
2、A 往 S 註冊消息包裏包含裏 A 的私有地址 10.0.0.1:4321,此時 S 保存了 A 的地址;S 給 A 臨時分配了一個用於公網的地址(155.99.25.11:62000),同時用於觀察外網數據包。
3、同理 B 往 S 註冊的消息包裏也包含裏 B 的地址,NAT 同樣給 B 臨時分類了一個外網地址(138.76.29.7:31000)。
4、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 組合打洞的方式也有所不同,有點可以打洞,有的則不能打洞,如兩個都是對稱型設備則無法實現打洞。不同組合打洞結果如下:
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、其他
4.1 對稱 NAT 設備常用場景
1)使用第三方寬帶公司提供的寬帶,這類寬帶給用戶分配的是局域網 IP,連接公網的 NAT 是運營商的,這類運營商一般採用對稱 NAT。
2)移動互聯網,如 3G、4G 終端設備;
3)大公司路由器一般採用對稱 NAT;
4.2 影響 “打洞” 的因素
-
許多對稱 nat 以一種相當可預測的方式爲連續的會話分配端口號,而有時分配到的端口剛好被別的應用使用了。
-
Client 有可能分到多個公網地址,例如:在 NAT 將公網地址 155.99.25.11:62000 分配給 client A 與 S 的會話之後,NAT 可能會將另一個公網地址 (如 155.99.25.11:62001) 分配給 A 試圖發起與 B 的 P2P 會話。在這種情況下,依據提供的連接打洞過程將失敗,因爲後續來自 B 的傳入消息到達 NAT A 的錯誤端口號
-
其他
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/mtYhttoEY88DN14W5R0NEQ