IPSec 的 NAT 探測與穿越機制(一)為什麼
來自專欄 計算機網路診斷科
前言
開個坑。
近期定位一個 IPSec 的問題,故障本身和 NAT 沒有什麼關係,但開了 debug 以後總是能看見設備接收到 NAT Keepalive message ,就想聊一聊 IPSec 里 NAT 探測和穿越機制。這篇就先聊聊為什麼的問題吧~
目錄
- 為什麼要使用 NAT ,以及 NAT 是什麼。
- 為什麼 IPSec 需要 NAT 探測與穿越機制。
為什麼要使用 NAT,以及 NAT 是什麼
推薦車老師的《網路地址轉換(NAT)技術系列講座一》這篇文章。本文就不再展開。
網路地址轉換(NA)技術系列講座一
為什麼 IPSec 需要 NAT 探測與穿越機制
在配置 IPSec 的時候,有時候需要配置打開 nat-traversal (NAT-T) 功能。雖然隨著 NAT 的廣泛部署,很多設備已經默認開啟 NAT-T 不需要我們手動開啟。但從來沒有聽說過 TCP 協議或 UDP 協議有 NAT-T 功能,要手動開啟或者默認開啟,那為什麼 IPSec 需要 NAT-T 呢?
在 IP 網路里,若兩端需要正常通信那肯定有兩個條件是要滿足的:
- IP 包能送到對方的手上。
- 對方能正確理解 IP 包。
這兩個條件很好理解。考慮這樣一個場景:A 和 B 兩個人傳紙條。如果 A 收不到 B 寫的紙條,那肯定是不知道 B 要說什麼的。A 收到了 B 的紙條,但看不懂 B 寫的字,那還是不知道 B 要說什麼。這對 B 也是一樣的,需要收到並理解 A 的紙條。
來看看 IPSec 的 ESP 包是怎麼封裝的吧!
可以發現 ESP 直接裝在 IP 包里,沒有埠號。那我們考慮下面的一個場景。R1 和 R2 都與 R3 建立了 IPSec 隧道。
R3 現在要發送一個 ESP 包給 R1 ,他肯定會發送一個這樣的 IP 包:
源 IP :1.1.1.2目的 IP:1.1.1.1協議:ESP(50)
R3 又要發一個 ESP 包給 R2,他也肯定會發一個這樣的 IP 包:
源 IP :1.1.1.2目的 IP:1.1.1.1協議:ESP(50)
我們會發現,這兩包是一樣的啊,對,NAT 設備也是這麼想的。NAT 設備有辦法區分這兩個包哪個該給 R1 哪個該給 R2 嗎?沒有埠號了怎麼區分嘛,NAT 設備覺得,你這不是為難我嘛,於是他一生氣就把包丟了。我們前面提到能通信兩個條件中,「IP包能送達」這個條件已經不滿足了,所以 R3 和他的小夥伴就沒法通信了。
但是,有些協議沒有埠號,也是可以穿越 NAT 的。比如PPTP ,他的數據通道 GRE 也是沒有埠號的。那他是怎麼穿越 NAT 呢?
PPTP 的 GRE 是增強的 GRE ,裡面有 Call ID,在這裡 Call ID 就起到了類似埠號的作用。可以標識一個會話。
這裡又有一個但是,ESP 包里也有類似的欄位,SPI,用來表示這個數據包關聯到哪個 SA 上的。
為什麼 NAT 設備不能依靠這個欄位來 NAT 呢?
PPTP 控制通道是明文協商的,也就是說,當 PPTP 在控制通道協商他們的 Call ID 的時候,NAT 設備是知道的(甚至可以控制),NAT 設備知道了 Call ID 與內網機器的對應關係了以後,就可以創建相應的 NAT 表項,當 GRE 包送來的時候,NAT 設備就知道應該給內網的哪台機器。
回頭看看 IPSec ,IKE phase 2 是加密的,我們要 NAT 設備去看 SPI ,NAT 設備表示:「你又為難我。」 NAT 設備看不到 SPI 就沒法創建 NAT 表項,所以 ESP 包就過不去咯。那要怎麼才能讓 IPSec 穿越 NAT 又不為難 NAT 設備呢?
下篇再聊。
推薦閱讀:
※計算機網路:適配器
※ZT.RTL8723BE在win10系統下不支持承載網路,獵豹wifi老是掉線解決辦法
※伺服器租用哪家好?
※公司內網搭建代理DNS使用內網域名代替ip地址
※Python網路編程中的套接字名和DNS解析。
TAG:計算機網路 |