Linux双网卡环境下请求响应接口匹配配置咨询
这种双网卡同时挂默认网关导致的路由乱套问题我之前也踩过坑,咱们先理清楚问题根源,再一步步解决~
问题分析
你的虚拟机两块网卡分别连内网和外网,现在的核心问题有两个:
- 默认网关冲突:两块网卡的默认网关Metric都是100,Linux会优先用排在前面的ens104作为默认路由,所以所有没匹配到具体网段的流量都往外网走;
- 缺少源路由策略:即使内网请求从ens001进来,系统回复的时候还是会走默认路由的ens104,导致请求和响应接口不匹配,自然没法正常通信。
看你给出的路由表,确实能看到两个默认网关优先级一致,而且没有针对不同源IP的路由规则,这就是症结所在。
解决方案
咱们分两步来配置,先理顺默认路由,再加上策略路由实现“进哪出哪”的效果:
1. 调整默认网关优先级(或移除内网默认网关)
内网一般不需要默认网关(除非你要通过内网网关访问其他内网网段),所以推荐直接给内网网卡的默认网关设更高的Metric(让它优先级更低),或者干脆取消。这里以Netplan配置为例(如果是RHEL/CentOS系列,对应修改/etc/sysconfig/network-scripts/ifcfg-ens001):
编辑Netplan配置文件(比如/etc/netplan/00-installer-config.yaml):
network: ethernets: ens001: addresses: [10.20.50.xxx/22] # 替换成你的内网网卡实际IP gateway4: 10.20.50.100 metric: 200 # 比ens104的100高,优先级更低 nameservers: addresses: [你的内网DNS地址] ens104: addresses: [10.25.40.xxx/24] # 替换成你的外网网卡实际IP gateway4: 10.25.40.200 metric: 100 nameservers: addresses: [你的外网DNS地址] version: 2
应用配置:
sudo netplan apply
如果是RHEL/CentOS,修改完网卡配置后执行:
sudo nmcli con reload sudo nmcli con up ens001 sudo nmcli con up ens104
2. 配置策略路由(源路由)
这一步是关键,通过策略路由让系统根据源IP选择对应的路由表,从而实现“从哪个接口收到请求,就从哪个接口回复”:
首先给两个网卡分别创建专属路由表:
echo "200 intranet" >> /etc/iproute2/rt_tables echo "100 internet" >> /etc/iproute2/rt_tables给内网路由表添加规则(所有源IP为ens001的流量走这个表):
ip route add 10.20.50.0/22 dev ens001 table intranet ip route add default via 10.20.50.100 dev ens001 table intranet给外网路由表添加规则(所有源IP为ens104的流量走这个表):
ip route add 10.25.40.0/24 dev ens104 table internet ip route add default via 10.25.40.200 dev ens104 table internet添加路由规则,让系统根据源IP匹配对应的路由表:
ip rule add from 10.20.50.xxx lookup intranet # 替换成ens001的实际IP ip rule add from 10.25.40.xxx lookup internet # 替换成ens104的实际IP要让配置永久生效,可以把这些命令加到
/etc/rc.local里(记得给文件加执行权限sudo chmod +x /etc/rc.local),或者在Netplan/NetworkManager的配置里添加路由规则(不同发行版略有差异,按需查找对应配置方式)。
3. 验证配置
执行以下命令确认配置正确:
# 查看内网路由表 ip route show table intranet # 查看外网路由表 ip route show table internet # 查看所有路由规则 ip rule list
之后可以从内网机器访问虚拟机的ens001 IP,抓包看回复是否从ens001发出;再从外网测试ens104的访问,确认回复接口匹配。
这样配置后,Linux的TCP/IP栈就能做到请求从哪个接口进来,就从哪个接口回复啦~
备注:内容来源于stack exchange,提问作者Qmails

