在IPSec VPN部署中,如果發起者位於私網內部(如下圖FW_C),而它希望與FW_A之間直接建立一條IPSec隧道,這種情況下NAT會對部署IPSec VPN網路造成障礙。
PC2發業務報文給PC1,IPSec先對IP包頭或埠資訊進行驗證,報文到達NAT裝置時,IP地址或埠號會被轉換,報文到達FW_A的時候,FW_A進行IPSec資料包的驗證,下面分別看一下IPSec使用 AH 和 ESP 兩種安全協議時報文能否透過。
AH 協議:因為 AH 對資料進行完整性檢查,會對包括 IP 地址在內的整個IP 包進行Hash運算。而NAT改變 IP 地址,從而破壞 AH 的 Hash 值。 因此 AH 報文無法透過 NAT 閘道器。
ESP 協議:ESP 對資料進行完整性檢查,不包括外部的 IP 頭, IP 地址轉換不會破壞 ESP 的 Hash 值。但 ESP 報文中 TCP 的埠已經加密無法修改,那麼NAT裝置讀不到埠號,不能進行正常的地址轉換。
為了解決這個問題,必須在建立 IPSec 隧道的兩個閘道器上同時開啟 NAT 穿越功能(對應命令列 nat traversal)。開啟 NAT 穿越功能後,當需要穿越 NAT 裝置時, ESP 報文會被封裝在一個 UDP 頭中,源和目的埠號均是 4500。有了這個 UDP 頭就可以正常進行轉換。
NAT裝置對於私網使用者來說是不可見的,這裡就有個問題,網路裝置怎麼知道是否有NAT的存在,什麼時候該新增UDP報頭,什麼時候不該新增?
IPSec一般要先經過IKE協商,互動金鑰之後才傳送資料。NAT-T(NAT Traversal)技術在IKE協商階段透過某種機制來發現是否有NAT的存在。有NAT存在的時候新增UDP報頭,沒有NAT的時候就不新增。
下面分別介紹一下采用 IKEv1 和 IKEv2 時是如何進行 NAT 穿越。
IKEv1 協商 NAT 穿越
開啟
NAT
穿越時,
IKEv1
協商第一階段的前兩個訊息會發送標識
NAT
穿越(
NAT Traversal
,簡稱
NAT-T
)能力的
Vendor ID
載荷(主模式和野蠻模式都是)。用於檢查通訊雙方是否支援
NAT-T
。
當雙方都在各自的訊息中包含了該載荷時,才會進行相關的 NAT-T 協商。
主模式訊息 3 和訊息 4(野蠻模式訊息 2 和訊息 3)中傳送 NAT-D(NAT Discovery)載荷。NAT-D 載荷用於探測兩個要建立 IPSec 隧道的閘道器之間是否存在 NAT 閘道器以及 NAT閘道器的位置。
透過協商雙方向對端傳送源和目的的 IP 地址與埠的 Hash 值,就可以檢測到地址和埠在傳輸過程中是否發生變化。若協商雙方計算出來的 Hash 值與它收到的 Hash 值一樣,則表示它們之間沒有 NAT。否則,則說明傳輸過程中對 IP 或埠進行了 NAT 轉換。第一個 NAT-D 載荷為對端 IP 和埠的 Hash 值,第二個 NAT-D 載荷為本端 IP 和埠的 Hash。
發現 NAT 閘道器後,後續 ISAKMP 訊息(主模式從訊息 5、野蠻模式從訊息 3 開始)的埠號轉換為 4500。ISAKMP 報文標識了“Non-ESP Marker”。
在第二階段會啟用 NAT 穿越協商。在 IKE 中增加了兩種 IPSec 報文封裝模式:UDP 封裝 隧 道 模 式 報 文 ( UDP-Encapsulated-Tunnel ) 和 UDP 封 裝 傳 輸 模 式 報 文(UDP-Encapsulated-Transport)。透過為 ESP 報文封裝 UDP 頭,當封裝後的報文透過NAT 裝置時, NAT 裝置對該報文的外層 IP 頭和增加的 UDP 頭進行地址和埠號轉換。UDP 報文埠號修改為 4500。
IKEv2 協商 NAT 穿越
開啟
NAT
穿越後,
IKE
的發起者和響應者都在
IKE_SA_INIT
訊息對中包含型別為N
AT_DETECTION_SOURCE_IP
和
NAT_DETECTION_DESTINATION_IP
的通知載荷。這兩個通知載荷用於檢測在將要建立
IPSec
隧道的兩個閘道器之間是否存在
NAT
,哪個閘道器位於
NAT
之後。如果接收到的
NAT_DETECTION_SOURCE
通知載荷沒有匹配資料包
IP
頭中的源
IP
和埠的
Hash
值,則說明對端位於
NAT
閘道器後面。如果接收到的
AT_DETECTION_DESTINATION_IP
通知載荷沒有匹配資料包
IP
頭中的目的
IP
和埠的
Hash
值,則意味著本端位於
NAT
閘道器之後。
檢測到 NAT 閘道器後,從 IKE_AUTH 訊息對開始 ISAKMP 報文埠號改為 4500。報文標識“Non-ESP Marker”。
IKEv2 中也使用 UDP 封裝 ESP 報文,當封裝後的報文透過 NAT 裝置時, NAT 裝置對該報文的外層 IP 頭和增加的 UDP 頭進行地址和埠號轉換。UDP 報文埠號修改為 4500。