OpenSwan VPN NAT配置故障排查:需避免流量暴露私有源IP
嘿,我来帮你捋捋这个VPN+NAT失效的问题——我之前在AWS环境里碰过几乎一模一样的场景,踩过不少坑,给你分享几个核心排查方向:
核心问题定位
首先明确:VPN隧道已经通了,但发往客户网络的流量源IP没有被NAT转换为合法非私有IP,导致客户那边看到的还是你这边的私有IP。我们从AWS VPC的路由、NAT配置、流量路径三个维度来排查:
1. 先盯紧路由表的优先级顺序
AWS VPC的路由表是流量走向的核心,这里最容易出问题:
- 检查你的私有子网路由表:如果发往客户网络的CIDR条目是直接指向VPN网关,优先级高于NAT的0.0.0.0/0,那流量会直接跳过NAT设备走VPN,源IP自然还是私有IP。
- 解决办法:调整路由表,让发往客户CIDR的流量先指向NAT实例/网关,再由NAT设备转发到VPN隧道;或者在NAT实例上配置策略路由,单独针对客户CIDR做源NAT。
2. 排查NAT设备的关键配置
如果你用的是AWS托管NAT网关
NAT网关默认只处理发往公网的流量,对VPN对等网络、其他VPC的流量不会自动做NAT。这种情况下,你得换成NAT实例来做自定义源NAT配置。
如果你用的是EC2 NAT实例
这是更灵活的方案,但有两个必查点:
- 必须关闭EC2实例的源/目标检查:AWS默认开启这个选项,会阻止NAT实例转发不是自己发起的流量,在EC2控制台实例详情的“网络”选项里就能关掉。
- 确认IP转发和iptables规则:
先开启内核IP转发:
然后添加针对客户CIDR的SNAT规则(替换成你的合法IP和客户网段):sysctl net.ipv4.ip_forward=1 echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
最后保存规则避免重启失效:iptables -t nat -A POSTROUTING -d 192.168.x.0/24 -o eth0 -j SNAT --to-source 1.2.3.4# CentOS/RHEL iptables-save > /etc/sysconfig/iptables # Ubuntu/Debian apt install netfilter-persistent netfilter-persistent save
3. 用抓包工具验证流量路径
你已经在用tcpdump/tshark,可以分节点抓包确认问题环节:
- 在私有子网测试实例抓包:出站流量源IP是私有IP(正常,还没到NAT)。
- 在NAT实例内网接口抓包:看流量是否到达NAT设备,源IP仍为私有,目标是客户CIDR。
- 在NAT实例外网接口抓包:确认经过SNAT后的源IP已经变成合法IP,再发往VPN方向。
- 在AWS VPN网关侧抓包:检查进入隧道的流量源IP是否是转换后的合法IP。
如果NAT外网接口没看到转换后的流量,说明NAT规则没命中,回头查路由或iptables;如果已经转换但客户那边仍看到私有IP,可能是客户侧做了反向NAT或者路由冲突,得和客户同步排查。
4. 确认VPN路由的传播
确保AWS VPN网关已经把客户的CIDR路由传播到了你的VPC路由表,同时NAT实例所在子网能正常访问VPN网关。如果用的是BGP动态路由,还要确认BGP邻居正确学习到了路由,且NAT策略路由的优先级高于BGP路由。
内容的提问来源于stack exchange,提问作者Joel Bouwkamp
相关产品推荐
相关产品推荐

