多网卡主机默认只走一个出口,因内核路由仅匹配到唯一默认路由条目;需用策略路由(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 + 策略路由组合实现透明绑定。例如:
系统特点:功能简洁实用。目前互联网上最简洁的企业网站建设系统!原创程序代码。非网络一般下载后修改的代码。更安全。速度快!界面模版分离。原创的分离思路,完全不同于其他方式,不一样的简单感受!搜索引擎优化。做了基础的seo优化。对搜索引擎更友好系统功能关于我们:介绍企业介绍类信息,可自由添加多个介绍栏目!资讯中心:公司或行业资讯类内容展示。可自由添加多个资讯内容!产品展示:支持类别设置,可添加产品图片
iptables -t mangle -A OUTPUT -d 10.0.0.0/8 -j MARK --set-mark 1ip rule add fwmark 1 table 300ip route add default via 10.0.0.1 dev eth2 table 300
注意:fwmark 方案对 UDP 连接(如 DNS 查询)尤其重要,否则可能因响应包路径不一致而超时。
rp_filter 和 conntrack 的隐性影响
开启 rp_filter=1(默认启用)时,内核会检查“进来的包,其源 IP 是否能通过当前入口网卡的路由表反向到达”。多网卡场景下,如果响应包从 eth1 回,但主路由表里 192.168.1.0/24 只在 eth0 表中,就会被丢弃。
解决方式不是直接关 rp_filter(有安全风险),而是:
- 设为宽松模式:
sysctl -w net.ipv4.conf.all.rp_filter=2(允许任意接口回包) - 或为每个接口单独设:
sysctl -w net.ipv4.conf.eth1.rp_filter=0(仅禁用特定卡) - conntrack 状态跟踪也可能干扰:若两张卡都连同一内网,NAT 或 DNAT 规则冲突会导致连接状态混乱,建议明确划分网段边界
真实环境中,rp_filter 和策略路由不配套是最常被忽略的断连原因——配置完路由,一定要测双向通信,不能只看能否 ping 通网关。










