VPN 流量为什么不能做源 NAT
站点间 VPN 互访依赖两端各自的私网地址:本端路由器根据 VPN 隧道路由把报文送到对端,对端再按目的地址回程。如果这些互访流量被出口的通用源 NAT 改写成公网地址,对端路由表里根本没有这条路由,回程报文无路可走。所以必须为 VPN 互访流量配置免转换例外,让地址保持原样穿过。
基本信息
| 适用平台 | 华为 USG 等做 NAT 与 IPsec 的边界设备 |
|---|---|
| 需求 | 内网网段之间的互访保持原始地址,不被改写 |
| 实现 | 在 NAT 策略前新增 no-nat 例外规则,或让该流量走不经 NAT 的路径 |
| 验证 | 对端路由表与两端抓包确认源地址未被改写 |
典型使用场景
- 总部与分支互访:分支访问总部业务系统,需要保持私网源地址以便对端回程
- 多站点互联:多个分支网段互访时,例外规则要覆盖全部对端网段
- 与第三方专线或合作方对接:对方要求源地址保持约定网段
- VPN 上跑需要源地址识别的业务:白名单、审计类系统依赖源地址一致
- 改造后回归:新增 NAT 规则时最容易打破既有例外,需重点复测
华为 no-nat 示例
华为 no-nat 示例
system-view
nat-policy
rule name no-nat-to-branch # 例外规则放前面,先命中
source-zone trust
destination-zone untrust
destination-address 10.200.0.0 mask 255.255.0.0 # 对端私网网段
action no-nat
quit
quit
# 顺序关键:该规则必须排在通用源 NAT 之前,否则永远不会被命中规则顺序与结果
| 规则顺序 | 实际效果 | 业务表现 |
|---|---|---|
| no-nat 在前 | 互访流量保持原地址 | 对端可正常回程 |
| no-nat 在后 | 被通用源 NAT 先命中 | 对端无回程路由,访问不通 |
| 只覆盖部分网段 | 新增网段被改写 | 部分地址随机不通 |
| 例外范围过宽 | 上网流量也被改写 | 业务出网出现异常 |
规则顺序决定成败:NAT 策略通常按顺序匹配,no-nat 放到通用源 NAT 后面,配置看起来没错但永远不会生效。