多网卡主机默认只走一个出口,因内核路由仅匹配到唯一默认路由条目;需用策略路由(ip rule + 多路由表)分流,并配合调整rp_filter或fwmark机制确保双向路径一致。
多网卡主机为什么默认只走一个出口
Linux 内核路由决策基于目标 IP 查找最长前缀匹配的路由条目,而 ip route show 显示的默认路由(default via ... dev eth0)通常只有一条。即使你插了 eth1、ens33 多个网卡,只要没有显式添加对应网段或默认路由,所有非本地流量都会被送到第一个配置了默认路由的接口。
这不是“没生效”,而是路由表本身没给其他网卡分配路径。常见现象是:能 ping 通 eth1 所连网段的机器,但无法访问外网;或者 SSH 连上后突然断连——本质是响应包从另一张卡回,触发反向路径过滤(rp_filter)丢包。
如何让不同目的地址走不同网卡
核心是使用策略路由(policy routing),绕过单一主路由表,为不同流量指定出口。关键不在加几条 ip route add,而在配合 ip rule 做分流。
- 先给每张网卡配独立路由表(如
table 100对应eth0,table 200对应eth1) - 在对应表中添加该网卡的默认路由:
ip route add default via 192.168.1.1 dev eth0 table 100 - 用
ip rule标记流量去哪个表:比如ip rule add from 192.168.1.100/32 table 100表示源 IP 是这张卡的地址时查表 100 - 别漏掉本地响应:加
ip rule add to 192.168.1.100/32 table 100,否则别人 ping 你这 IP 会走错表返回
出站连接如何绑定特定网卡
应用层不指定网卡时,内核按路由表选出口;但有些程序(如 curl、wget)支持 --interface 参数强制绑定:
curl --interface eth1 http://example.com
更通用的方式是用 SO_BINDTODEVICE(需 root)或通过 iptables + MARK + 策略路由组合实现透明绑定。例如: