跳到主要內容

NAT-T 技術深度解析:透過 UDP 4500 埠封裝 ESP 封包,解決 IPsec VPN 穿越 NAT 閘道的連線難題

NAT-T 技術深度解析

透過 UDP 4500 埠封裝 ESP 封包,解決 IPsec VPN 穿越 NAT 閘道的連線難題

IPsec VPN 在穿越 NAT 閘道時,因 ESP 協定缺乏埠號資訊,導致 NAT 設備無法正確轉換位址而斷線。NAT-T(Network Address Translation-Traversal) 正是為此而生,透過 UDP 封裝讓 ESP 封包順利通關。

為什麼 ESP 無法穿越 NAT?

NAT 設備依賴 TCP/UDP 的埠號追蹤連線狀態。ESP(IP Protocol 50)作為第三層協定,本身不帶有埠號欄位,NAT 無從建立映射表,封包因此被丟棄。此外,ESP 對封包完整性的驗證機制,使得 NAT 修改 IP 標頭後,接收端的 ICV(完整性校驗值) 驗證必然失敗,雙重因素導致隧道無法建立。

NAT-T 如何解決問題?

NAT-T 分兩階段運作。偵測階段:IKE 協商期間(UDP 500),雙端透過 Vendor ID 與 NAT-D Payload 互相偵測路徑上是否存在 NAT 設備。封裝階段:確認 NAT 存在後,IKE 切換至 UDP 4500,並在 ESP 封包前插入 4 位元組的 Non-ESP Marker(全零),將整個 ESP 封包封裝於 UDP 載荷中。NAT 設備看到標準 UDP 封包,即可正常建立映射,ESP 封包得以完整抵達遠端,隧道完整性獲得保障。

# Linux strongSwan 啟用 NAT-T(ipsec.conf)
conn my-vpn
    left=%defaultroute
    right=203.0.113.1
    forceencaps=yes       # 強制啟用 UDP 4500 封裝
    nat_traversal=yes     # 啟用 NAT-T 偵測
    keyexchange=ikev2

💡 重點整理

  • ESP 無埠號且受 ICV 保護,是 NAT 穿越失敗的根本原因。
  • NAT-T 將 ESP 封裝於 UDP 4500,讓 NAT 設備可正常追蹤連線。
  • IKE 協商由 UDP 500 自動切換至 UDP 4500,無需人工介入。
  • 可設定 NAT Keepalive(預設每 20 秒)防止 NAT 映射過期失效。

NAT-T 已成為現代 IPsec 實作的標配機制,幾乎所有主流 VPN 產品均預設啟用。理解其偵測與封裝流程,有助於快速定位 VPN 穿越問題的根源。

留言