← 返回列表

Linux 双网卡策略路由实践

Linux2026-09-14 · 约 8 分钟

有台机器加了第二块网卡,配了静态地址,同网段能通,跨网段就不行。原因很简单:默认路由只有一条,而且绑在 eth0 上。这篇记录完整的解决过程,以及一个让人误判很久的坑。

先看清楚现状

ip addr
# eth0: 10.100.3.222/24
# eth1: 10.100.18.52/24

ip route
# default via 10.100.3.254 dev eth0 metric 100
# 10.100.3.0/24 dev eth0 ...
# 10.100.18.0/24 dev eth1 ...

main 表里只有 eth1 的同网段直连路由,没有任何跨网段的入口。所以从 eth1 发出的包发到网关层就不知道往哪走。

建独立路由表

echo "100  vlan18" >> /etc/iproute2/rt_tables

ip route add 10.100.18.0/24 dev eth1 src 10.100.18.52 table vlan18
ip route add default via 10.100.18.254 dev eth1 table vlan18

ip rule add from 10.100.18.52 lookup vlan18 priority 100

三件事:给表起个名(不然只能写数字)、往表里放路由、加一条规则让「源地址是这个 IP 的流量」去查这张表。

那个坑:ping -I 网卡名测不出来

配完之后我用 ping -I eth1 10.100.30.10 测,还是 100% 丢包。抓包一看,发现内核在 eth1 上对 10.100.30.10 发 ARP 请求:

17:26:25 ARP, Request who-has 10.100.30.10 tell 10.100.18.52

这说明它根本没走策略路由,而是想直接在二层找目标。原因是 -I 后面跟网卡名时,内核先绑定设备再选源地址,绕过了 ip rule 的 from 匹配。

换成源 IP 就正常了:

ping -I 10.100.18.52 10.100.30.10
# 2 packets transmitted, 2 received, 0% packet loss
以后测策略路由一律用 -I <源IP>,或者直接用 ip route get <目标> from <源IP> 看选路结果。

持久化

CentOS / Alibaba Cloud Linux 系用这几个文件,重启自动恢复:

/etc/iproute2/rt_tables
  100  vlan18

/etc/sysconfig/network-scripts/route-eth1
  10.100.18.0/24 dev eth1 src 10.100.18.52 table vlan18
  default via 10.100.18.254 dev eth1 table vlan18

/etc/sysconfig/network-scripts/rule-eth1
  from 10.100.18.52 lookup vlan18 priority 100

最后一件要注意的事

配完发现有些网段还是不通,一度以为是策略路由写错了。后来用 eth0 的默认路径测同一个目标,同样不通 —— 说明是上游 ACL 限制,跟本机配置无关。排查时先把「本来该不该通」确认清楚,能省很多时间。