多网卡ECS的网络不通,问题多半出在路由表上
给多网卡ECS配置策略路由,核心思路是让系统根据数据包的“来源IP”选择不同的路由表,而不是用一张默认路由表处理所有流量。 多数情况下,你只需要修改两个文件:/etc/iproute2/rt_tables 和 /etc/sysconfig/network-scripts/route-eth1(以CentOS为例),再配合 ip rule 和 ip route 命令即可搞定。
为什么多网卡ECS默认路由会“打架”
云服务器默认只有一张网卡,路由表简单清晰,但当你给ECS绑定第二张、第三张网卡后,问题就来了:Linux内核默认只认一张默认路由表(main表),所有网卡的默认路由都会挤在一起。
假设你的ECS有两张网卡:
- eth0:主网卡,IP为
0.0.10,网关0.0.1 - eth1:辅助网卡,IP为
0.1.10,网关0.1.1
如果两张网卡的默认路由都写进main表,后写入的会覆盖先写入的,结果就是:从eth1进来的数据包,回复时可能走eth0出去,源IP和目标IP对不上,连接直接超时。
业内专家指出,这个问题在简米云、酷番云等主流云平台上非常常见,尤其是当你用“辅助网卡”接入业务流量时,解决思路就一条:为每一张网卡建立独立的路由表,然后用策略规则(ip rule)告诉内核“谁来的从谁那回去”。
如何为多网卡ECS配置策略路由:完整实操步骤
第一步:确认网卡和IP信息
先登录服务器,执行以下命令:
ip addr show ip route show table main
记录下每张网卡的:
- 网卡名称(如eth0、eth1)
- IP地址和子网掩码
- 网关地址
假设你得到如下信息:
| 网卡 | IP地址 | 网关 |
|---|---|---|
| eth0 | 0.0.10 | 0.0.1 |
| eth1 | 0.1.10 | 0.1.1 |
第二步:编辑路由表编号文件
编辑 /etc/iproute2/rt_tables,在文件末尾添加自定义路由表编号,编号范围从 1 到 252 可用,建议使用
100 和 200 这类好记的数字:
vim /etc/iproute2/rt_tables
100 eth0_table
200 eth1_table
这里 eth0_table 和 eth1_table 只是自定义名称,你可以随意命名,但名称和编号必须唯一。
第三步:为每张网卡配置独立路由
配置eth0的路由表
ip route add 10.0.0.0/24 dev eth0 src 10.0.0.10 table eth0_table ip route add default via 10.0.0.1 dev eth0 table eth0_table
配置eth1的路由表
ip route add 10.0.1.0/24 dev eth1 src 10.0.1.10 table eth1_table ip route add default via 10.0.1.1 dev eth1 table eth1_table
添加策略规则
ip rule add from 10.0.0.10 lookup eth0_table ip rule add from 10.0.1.10 lookup eth1_table
这两条规则的意思是:凡是源IP为 0.0.10 的数据包,查 eth0_table 路由表;凡是源IP为 0.1.10 的数据包,查 eth1_table 路由表。
第四步:验证配置是否生效
ip route show table eth0_table ip route show table eth1_table ip rule show
然后从本机ping两个网关:
ping -I 10.0.0.10 10.0.0.1 ping -I 10.0.1.10 10.0.1.1
如果两边都能通,说明策略路由已经生效,但注意,这些配置重启后会丢失,需要持久化。
如何让策略路由永久生效
使用网卡配置文件(推荐)
以CentOS 7/8为例,编辑 /etc/sysconfig/network-scripts/route-eth1 文件(如果不存在则创建):
vim /etc/sysconfig/network-scripts/route-eth1
0.1.0/24 dev eth1 src 10.0.1.10 table eth1_table
default via 10.0.1.1 dev eth1 table eth1_table
然后在 /etc/sysconfig/network-scripts/rule-eth1 文件中写入策略规则:
vim /etc/sysconfig/network-scripts/rule-eth1
写入:
from 10.0.1.10 lookup eth1_table
同样为eth0创建对应的 route-eth0 和 rule-eth0 文件。
使用rc.local(简单粗暴)
在 /etc/rc.local 文件末尾追加所有 ip route 和 ip rule 命令,并确保该文件有执行权限:
chmod +x /etc/rc.d/rc.local
NetworkManager的Dispatcher脚本(适用于Ubuntu)
Ubuntu系统推荐使用 /etc/network/interfaces 配合 up 指令,或者NetworkManager的dispatcher脚本,在 /etc/network/interfaces 中为eth1添加:
auto eth1
iface eth1 inet static
address 10.0.1.10
netmask 255.255.255.0
gateway 10.0.1.1
up ip route add 10.0.1.0/24 dev eth1 src 10.0.1.10 table eth1_table
up ip route add default via 10.0.1.1 dev eth1 table eth1_table
up ip rule add from 10.0.1.10 lookup eth1_table
配置完成后重启网络服务或直接重启ECS来验证。
不同场景下的配置差异
两张网卡在同一VPC的不同子网
这种情况下,除了默认路由,你还需要确保VPC的路由表已经正确配置了到两个子网的路由,如果配置后仍然不通,多数情况下是云平台安全组或网络ACL拦截了流量,而不是服务器本身的问题。
一张网卡走公网,一张走内网专线
这是很常见的混合云架构,公网网卡eth0保持默认路由不变,内网网卡eth1添加专线网关路由,此时策略路由的优先级需要注意:
ip rule add from 10.0.1.10 lookup eth1_table priority 100 ip rule add from 10.0.0.10 lookup eth0_table priority 200
priority 数值越小优先级越高,这样内网流量优先走专线,避免占用公网带宽。
Ubuntu 22.04 + Netplan配置策略路由
Netplan是Ubuntu的现代网络配置工具,配置方式与CentOS完全不同,在 /etc/netplan/01-netcfg.yaml 中:
network:
version: 2
ethernets:
eth0:
addresses:
- 10.0.0.10/24
routes:
- to: default
via: 10.0.0.1
table: 100
from: 10.0.0.10
routing-policy:
- from: 10.0.0.10
table: 100
eth1:
addresses:
- 10.0.1.10/24
routes:
- to: default
via: 10.0.1.1
table: 200
from: 10.0.1.10
routing-policy:
- from: 10.0.1.10
table: 200
然后执行 netplan apply 生效。
多网卡ECS配置策略路由的排查思路
配置完成后,如果网络仍然不通,按以下顺序排查:
- 确认路由表内容:
ip route show table eth1_table是否包含正确的默认路由? - 确认策略规则:
ip rule show中是否有from 10.0.1.10 lookup eth1_table? - 确认网卡状态:
ethtool eth1是否显示Link detected: yes? - 确认云平台安全组:云平台上的安全组是否放行了对应网卡的入方向和出方向流量?
- 抓包确认:
tcpdump -i eth1 host 目标IP看数据包是否到达eth1,回复包是否从eth1发出。
如果数据包到达了eth1但回复包从eth0发出,说明策略路由没生效,重新检查 ip rule 的配置顺序。
常见问题解答
多网卡ECS配置策略路由后,为什么ping网关通但ping外网不通?
这通常是云平台安全组或网络ACL的规则限制,云平台上的安全组是针对弹性网卡级别生效的,你需要检查辅助网卡关联的安全组是否放行了出方向到公网的流量,另外确认一下云平台是否允许辅助网卡绑定公网IP,部分云平台默认不开放这个能力。
服务器多网卡路由配置文件修改后,是否需要重启服务器?
不需要重启,执行 ip route、ip rule 相关命令后立即生效,如果你是通过修改配置文件(如 route-eth1)来实现持久化,执行 systemctl restart network 或 ip route flush cache 让配置重新加载即可,不建议直接重启ECS,因为如果配置有误,重启后可能直接失联。
不同网段ECS多网卡配置策略路由,和同网段配置有什么区别?
同网段的多网卡配置,两张网卡的默认路由可能指向同一个网关,优先级冲突更明显,不同网段的多网卡配置,关键在于云平台的路由表中是否已经写入了去往两个网段的路由条目,如果云平台没有配置,服务器无论怎么设置策略路由都无法跨网段通信,可以先在ECS上执行 ip neigh 查看ARP表,确认网关是否可达,再排查云平台路由表配置。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/567054.html




