首页/网络/BGP 与广域网速查/NAT-T:NAT 环境下的 ESP 封装
IPsec VPN60 条

NAT-T:NAT 环境下的 ESP 封装

检测到 NAT 时 ESP 改用 UDP 4500 封装:检测基于 NAT-D 载荷;Keepalive 用于维持 NAT 映射表项,细腰 NAT 设备尤其需要。

BGP 与广域网速查网络更新于 2026-10-13

NAT-T 做什么

ESP 是协议 50,不带端口信息,中间设备做端口转换时无法正确回填,因此 IPsec 穿越 NAT 需要 NAT-T(NAT Traversal):IKE 交换过程中用 NAT-D 载荷探测路径上是否存在地址转换,一旦确认存在,就把 ESP 封装进 UDP 4500 传输。它让站点在 NAT 设备后也能建立隧道,代价是多一层封装与对映射表老化的依赖。

基本信息

检测机制IKE 交换中的 NAT-D 载荷判断路径是否存在 NAT
封装方式ESP 装入 UDP 4500(RFC 3948)
协商端口IKE 使用 UDP 500
保活Cisco 可用 crypto isakmp nat keepalive <秒> 维持映射表项
防火墙要求放行 UDP 500 与 UDP 4500,两者都要

典型使用场景

  • 分支机构在 NAT 设备之后:必须启用 NAT-T 才能建立可用隧道
  • 两端都在 NAT 后:需确认设备支持并正确检测,否则协商能过而数据不通
  • 防火墙策略梳理:逐条确认 500 与 4500 都被放行,避免协商中途失败
  • 映射表老化导致周期性中断:调整保活间隔以维持 NAT 表项
  • 排障取证:抓包确认 ESP 是否真的封装进 UDP 4500

保活与核对

保活与核对
# 定期发送保活报文,维持中间设备的映射表项
crypto isakmp nat keepalive 20
# 查看 SA 是否处于 NAT 环境及加密封装情况
show crypto ipsec sa | include NAT|local|remote
# 抓包确认封装形态(NAT 外侧应看到 UDP 4500)
tcpdump -ni eth0 'udp port 4500' -c 20

现象与定位

现象可能原因核对动作
IKE 协商成功但数据不通ESP 被中间设备丢弃确认 NAT-T 是否启用、4500 是否放行
隧道周期性中断NAT 映射表项老化配置保活并缩短间隔,观察中断周期是否改善
只有一侧能发起一侧设备未检测到 NAT两端同时抓包,比对 NAT-D 判断结果
协商到一半失败只放行了 UDP 500补放行 UDP 4500 后复测
保活间隔要比中间设备映射表的老化时间短,否则隧道会在空闲期被清理,表现为「每隔一段时间自己断一次、随后又自己恢复」。
两端都是公网地址时不需要 NAT-T;但路径中间若有做端口转换的设备,即使端点没有 NAT 也要按 NAT-T 规划端口放行。上线前先确认报文实际走 500 还是 4500,再据此配置安全策略。

易错点

  • NAT 映射老化快而保活未配:隧道周期性中断,业务侧只看到间歇性丢包
  • 只放行 UDP 500:NAT-T 建立后流量走 4500,被拦截则表现为协商成功数据不通
  • 两端都在 NAT 后未做验证:检测结果与预期不符时,需要两端同时抓包比对
  • 把 NAT-T 当成必选项:两端都是公网地址时无需该封装,启用后反而增加开销

数据来源与参考

  • RFC 3947: NAT-T 协商
  • RFC 3948: UDP 封装 ESP
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌