當 IPsec VPN 遇上 NAT 設備,驗證機制會因 IP 標頭被修改而直接失效。NAT-T(NAT Traversal)透過 UDP 封裝繞過這個限制,是現代 VPN 部署不可或缺的補救機制。
為什麼 IPsec 無法直接穿透 NAT?
IPsec 的 ESP(Encapsulating Security Payload)協定直接承載於 IP 層(Protocol 50),不含 TCP/UDP 埠號。NAT 設備修改封包的來源 IP 時,會破壞 ESP 的完整性雜湊值,導致接收端驗證失敗,連線直接中斷。此外,多台內網主機同時發起 IPsec 連線時,NAT 無法透過埠號區分不同的 ESP 流量,造成多工對應失敗(demultiplexing failure)。
NAT-T 的運作機制:UDP 4500 封裝
NAT-T 定義於 RFC 3947 / RFC 3948,分為兩個階段。首先在 IKE 協商期間(UDP 500),雙方交換 NAT-D(NAT Detection)封包,偵測路徑上是否存在 NAT 設備。一旦偵測到 NAT,後續的 IKE 訊息與所有 ESP 封包都會改包裹一層 UDP 標頭(目的埠 4500),使 NAT 設備能正常進行位址轉換而不破壞驗證。UDP 層提供埠號,解決了多主機多工問題;ESP 封包本身的加密與驗證邏輯完全不變。
# Linux strongSwan:啟用 NAT-T(預設已開啟,可明確指定)
# /etc/strongswan.conf
charon {
port_nat_t = 4500 # NAT-T UDP 埠
force_udp_encap = no # 僅偵測到 NAT 時才封裝
}
💡 重點整理
- NAT 偵測:IKE Phase 1 透過 NAT-D Payload 比對雜湊值,自動判斷是否需要啟用封裝。
- UDP 4500 封裝:ESP 封包外加 UDP 標頭,NAT 設備只需處理 UDP 層,不再碰觸 ESP 內容。
- Keepalive 機制:每隔 20 秒發送 1 byte(0xFF)UDP 封包,維持 NAT 轉換表項目不被逾時清除。
- 防火牆規則:需額外放行 UDP 4500,不可只開放 UDP 500 與 ESP Protocol 50。
NAT-T 讓 IPsec 得以在幾乎所有網路環境中穩定運作,是 VPN 互通性的關鍵基石。理解其偵測與封裝流程,能大幅提升排障效率,避免 UDP 500 與 UDP 4500 防火牆規則遺漏所導致的連線失敗。
📚 參考文獻
- RFC 3948 – UDP Encapsulation of IPsec ESP Packets(IETF 官方規範)
- RFC 3947 – Negotiation of NAT-Traversal in the IKE(IETF 官方規範)
- strongSwan NAT Traversal 官方文件
⚠️ 本文內容基於撰寫時的最新資訊,實際應用時請參考官方文件的最新版本。
留言
張貼留言