双同子网IP虚拟机静态路由回复源IP不一致问题求助
双同子网IP虚拟机静态路由回复源IP不一致问题求助
兄弟,你遇到的这个问题其实是Linux默认选路机制导致的——系统默认是按目的地址来选出口网卡和源IP的,不管数据包是从哪个网卡进来的,所以才会出现回复源IP串了的情况。下面给你一步步解决的方案,亲测有效:
核心思路:用策略路由实现「入站接口/源IP对应出站路由」
我们需要给每个网卡单独配置专属的路由表,再通过规则指定:从哪个网卡进来的包,就用对应网卡的路由表来回复,这样就能保证回复的源IP和接收的IP一致。
步骤1:给每个网卡创建专属路由表
首先得给ens192和ens256各分配一个独立的路由表,编辑路由表配置文件:
vi /etc/iproute2/rt_tables
在文件末尾添加两行(数字只要不冲突就行):
10 ens192_table 20 ens256_table
保存退出后,系统就识别这两个自定义路由表了。
步骤2:给每个路由表添加路由规则
接下来要给每个自定义路由表配置子网路由和默认路由,确保每个表只对应自己的网卡:
给ens192的路由表配置:
# 添加子网内路由,确保同网段的包走ens192 ip route add 10.10.10.0/24 dev ens192 src 10.10.10.142 table ens192_table # 添加默认网关,对外的包通过ens192走网关10.10.10.129 ip route add default via 10.10.10.129 dev ens192 src 10.10.10.142 table ens192_table
给ens256的路由表配置:
ip route add 10.10.10.0/24 dev ens256 src 10.10.10.143 table ens256_table ip route add default via 10.10.10.129 dev ens256 src 10.10.10.143 table ens256_table
步骤3:添加策略路由规则(关键!)
现在要告诉系统:从哪个源IP进来的包,就用对应的路由表回复(按源IP匹配比按入站接口更准确,适合同子网场景):
# 来自10.10.10.142的流量,用ens192_table路由 ip rule add from 10.10.10.142 table ens192_table priority 100 # 来自10.10.10.143的流量,用ens256_table路由 ip rule add from 10.10.10.143 table ens256_table priority 200
如果想按入站接口匹配,就换成这两条:
ip rule add iif ens192 table ens192_table priority 100 ip rule add iif ens256 table ens256_table priority 200
步骤4:调整反向路径过滤参数
Linux默认的反向路径过滤(rp_filter)可能会拦截我们的策略路由流量,所以需要修改sysctl参数:
编辑/etc/sysctl.conf文件,添加或修改:
net.ipv4.conf.all.rp_filter = 2 net.ipv4.conf.ens192.rp_filter = 2 net.ipv4.conf.ens256.rp_filter = 2
然后执行命令让参数生效:
sysctl -p
步骤5:验证配置
配置完后可以用以下命令验证:
- 查看自定义路由表:
ip route show table ens192_table和ip route show table ens256_table,确认每条路由都对应正确的网卡和源IP - 查看策略规则:
ip rule list,能看到我们添加的两条规则在优先级列表里 - 从192.168.1.5分别ping 10.10.10.142和10.10.10.143,抓包或者查看对方的ping日志,应该能看到回复的源IP和目标IP对应上了
永久生效提示
上面的命令都是临时生效的,重启机器会失效。如果要永久生效,可以:
- 把步骤2和3的命令加到
/etc/rc.local文件里(记得给rc.local加执行权限:chmod +x /etc/rc.local) - 或者用systemd写一个自定义服务,开机时执行这些命令
备注:内容来源于stack exchange,提问作者Aboelnoor90




