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

1.2.2 對稱 NAT(Symmetric)

對不同的外網 IP 地址都會分配不同的端口號。

1.2.3 兩者區別

對稱 NAT 是一個請求對應一個端口,非對稱 NAT 是多個請求對應一個端口 (象錐形,所以叫 Cone NAT)。

1.3 安全係數

對稱型 > 端口受限錐型 > 受限錐型 > 全錐型

2、網絡打洞

2.1 打洞條件

中間服務器保存信息、並能發出建立 UDP 隧道的命令

網關均要求爲 Cone NAT 類型。Symmetric NAT 不適合。

完全圓錐型網關可以無需建立 udp 隧道,但這種情況非常少,要求雙方均爲這種類型網關的更少。

  1. 假如 X1 網關爲 Symmetric NAT, Y1 爲 Address Restricted Cone NAT 或 Full Cone NAT 型網關,各自建立隧道後,A1 可通過 X1 發送數據報給 Y1 到 B1(因爲 Y1 最多隻進行 IP 級別的甄別),但 B2 發送給 X1 的將會被丟棄(因爲發送來的數據報中端口與 X1 上存在會話的端口不一致,雖然 IP 地址一致),所以同樣沒有什麼意義。

  2. 假如雙方均爲 Symmetric NAT 的情形,新開了端口,對方可以在不知道的情況下嘗試猜解,也可以達到目的,但這種情形成功率很低,且帶來額外的系統開支,不是個好的解決辦法。pwnat 工具據說可以實現。

  3. 不同網關型設置的差異在於,對內會採用替換 IP 的方式、使用不同端口不同會話的方式,使用相同端口不同會話的方式;對外會採用什麼都不限制、限制 IP 地址、限制 IP 地址及端口。

  4. 這裏還沒有考慮同一內網不同用戶同時訪問同一服務器的情形,如果此時網關採用 AddressRestricted Cone NAT 或 Full Cone NAT 型,有可能導致不同用戶客戶端可收到別人的數據包,這顯然是不合適的。

2.2 打洞流程

不同的網絡拓撲 NAT 打洞的方法和流程有所區別。

2.2.1 同一個 NAT 設備下

  1. clinet A 與 Server S 建立 UDP 連接,公共 NAT(155.99.25.11)給 client A 分配一個公網端口 62000;

  2. client B 與 Server S 建立 UDP 連接,公共 NAT(155.99.25.11)給 client A 分配一個公網端口 62005;

  3. client A 通過 Server S 發送一個消息要求連接 client B,S 給 A 迴應 B 的公網和私網地址,並轉發 A 的公網和私網地址給 B;

  4. 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 通信:

  1. Client A 發送請求消息,尋求連接 B;

  2. S 給 A 迴應 B 的外網和內網地址,通給給 B 發送 A 的外網和內網地址;

  3. A 和 B 開始利用這些地址嘗試直接發送 UDP 報文給彼此,不幸的是,此時 A 和 B 都無法接收對應的消息。因爲 A 和 B 都是在不同的私有網絡中,A 和 B 之前都是與 S 通信回話,並沒有與對方建立回話;即 A 沒有爲 B 打開一個洞,B 也沒有爲 A 打開一個洞。這個過程的第一個報文需要會被拒絕同時打開對應的 “洞”,隨後纔可以直接通信,具體如下:

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)。

  1. 首先 client A 給 client B 的公網地址(155.99.25.11:62005)發送消息;

  2. NAT A 翻譯原數據報文從 10.0.0.1:4321 帶 10.0.0.1:45000;

  3. 數據報現在到達 NAT C,它識別出數據報的目標地址是 NAT C 自己翻譯的公共地址之一;

  4. 如果 NAT C 是好的,那麼其能翻譯出數據報文的源地址和目標地址(155.99.25.11:62000 和 10.0.1.2:55000),同時通過 “迴環” 返回數據包到私有網絡;

  5. NAT B 翻譯數據報文得到 NAT B 私網地址,最終到達 client B。

  6. Client B 給 client A 發送數據報文與上述步驟類似。

2.3 打洞組合

不同的 NAT 組合打洞的方式也有所不同,有點可以打洞,有的則不能打洞,如兩個都是對稱型設備則無法實現打洞。不同組合打洞結果如下:

3、關聯技術

  1. ALG:即應用程序級網關技術:傳統的 NAT 技術只對 IP 層和傳輸層頭部進行轉換處理,但是一些應用層協議,在協議數據報文中包含了地址信息。爲了使得這些應用也能透明地完成 NAT 轉換,NAT 使用一種稱作 ALG 的技術,它能對這些應用程序在通信時所包含的地址信息也進行相應的 NAT 轉換。主要類似與在網關上專門開闢一個通道,用於建立內網與外網的連接,也就是說,這是一種定製的網關。更多隻適用於使用他們的應用羣體內部之間。

  2. UpnP:它是讓網關設備在進行工作時尋找一個全球共享的可路由 IP 來作爲通道,這樣避免端口造成的影響。要求設備支持且開啓 upnp 功能,但大部分時候,這些功能處於安全考慮,是被關閉的。即時開啓,實際應用效果還沒經過測試。

  3. STUN(Simple Traversalof UDP Through Network):這種方式即是類似於我們上面舉例中服務器 C 的處理方式。也是目前普遍採用的方式。但具體實現要比我們描述的複雜許多,光是做網關 Nat 類型判斷就由許多工作,RFC3489 中詳細描述了。

  4. TURN(Traveral Using Relay NAT):該方式是將所有的數據交換都經由服務器來完成,這樣 NAT 將沒有障礙,但服務器的負載、丟包、延遲性就是很大的問題。目前很多遊戲均採用該方式避開 NAT 的問題。這種方式不叫 p2p。

  5. ICE(Interactive Connectivity Establishment):是對上述各種技術的綜合,但明顯帶來了複雜性。

4、其他

4.1 對稱 NAT 設備常用場景

1)使用第三方寬帶公司提供的寬帶,這類寬帶給用戶分配的是局域網 IP,連接公網的 NAT 是運營商的,這類運營商一般採用對稱 NAT。

2)移動互聯網,如 3G、4G 終端設備;

3)大公司路由器一般採用對稱 NAT;

4.2 影響 “打洞” 的因素

  1. 許多對稱 nat 以一種相當可預測的方式爲連續的會話分配端口號,而有時分配到的端口剛好被別的應用使用了。

  2. Client 有可能分到多個公網地址,例如:在 NAT 將公網地址 155.99.25.11:62000 分配給 client A 與 S 的會話之後,NAT 可能會將另一個公網地址 (如 155.99.25.11:62001) 分配給 A 試圖發起與 B 的 P2P 會話。在這種情況下,依據提供的連接打洞過程將失敗,因爲後續來自 B 的傳入消息到達 NAT A 的錯誤端口號

  3. 其他

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/mtYhttoEY88DN14W5R0NEQ