AWS双ENI实例作为NAT服务器时的同接口转发配置问题
嘿,我太懂你遇到的这个糟心问题了——多ENI的NAT实例里出现“进错接口出”的情况,本质是Linux默认路由不会区分流量的入站接口,只会一股脑走默认路由。要实现**“哪个接口收的流量就从哪个接口发出去”,咱们得靠策略路由(Policy Routing)**来解决,下面是一步步的实操方案:
1. 先确保IP转发已开启
这是NAT服务器的基础前提,先临时开启:
echo 1 > /proc/sys/net/ipv4/ip_forward
如果要永久生效,编辑/etc/sysctl.conf,把net.ipv4.ip_forward的值改成1,然后执行sysctl -p加载配置。
2. 为每个ENI创建独立路由表
咱们要给ens5和ens6各配专属路由表,避免路由混乱:
- 先查看系统现有路由表:
ip route show table all - 新增两个自定义路由表,比如用10、11作为编号(编号只要不冲突就行):
echo "10 ens5-table" >> /etc/iproute2/rt_tables echo "11 ens6-table" >> /etc/iproute2/rt_tables
3. 给每个路由表配置专属路由
把对应ENI的子网路由和默认网关加到各自的表中(替换成你实际的子网和网关地址):
# 配置ens5的路由规则:子网+默认网关 ip route add 10.x.x.0/24 dev ens5 table ens5-table ip route add default via 10.x.x.1 dev ens5 table ens5-table # 配置ens6的路由规则:子网+默认网关 ip route add 10.y.y.0/24 dev ens6 table ens6-table ip route add default via 10.y.y.1 dev ens6 table ens6-table
这里的网关地址可以从AWS控制台对应子网的路由表中查到,也可以用ip route show看默认路由里的网关。
4. 添加策略路由规则,绑定入站接口
告诉系统:“从ens5进来的流量,就用ens5的路由表;从ens6进来的,用ens6的表”:
# 匹配ens5的入站流量,用ens5-table路由 ip rule add iif ens5 table ens5-table # 匹配ens6的入站流量,用ens6-table路由 ip rule add iif ens6 table ens6-table
5. 配置SNAT规则(关键!)
最后要给每个ENI做SNAT,让出站流量用对应ENI的公网IP(替换成你实际的公网IP):
# ens5子网的流量,出站时转成ens5的公网IP iptables -t nat -A POSTROUTING -o ens5 -s 10.x.x.0/24 -j SNAT --to-source A.B.C.D # ens6子网的流量,出站时转成ens6的公网IP iptables -t nat -A POSTROUTING -o ens6 -s 10.y.y.0/24 -j SNAT --to-source E.F.G.H
如果有多个内网子网需要通过对应ENI转发,把-s后面的网段换成对应的就行。
验证配置
做完上面的操作后,再用tcpdump测试:
tcpdump -i any -nn host 1.1.1.1
现在应该能看到从ens6进来的流量,会乖乖从ens6出去了。也可以用ip rule show和ip route show table ens5-table检查路由规则和表是否正确生效。
要是想让配置重启后不丢失,可以把这些命令加到开机脚本里,比如/etc/rc.local(系统支持的话),或者写个systemd服务来管理。
备注:内容来源于stack exchange,提问作者Ra'Jiska

