Linux 双网卡策略路由实践
有台机器加了第二块网卡,配了静态地址,同网段能通,跨网段就不行。原因很简单:默认路由只有一条,而且绑在 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 限制,跟本机配置无关。排查时先把「本来该不该通」确认清楚,能省很多时间。