linux多网卡策略路由与负载均衡需通过规则、独立路由表和路由条目协同实现:基于源/目的ip或fwmark分流流量至不同出口,辅以iptables标记轮询,并持久化配置及禁用rp_filter等避坑。

Linux多网卡环境下实现策略路由和多出口负载均衡,核心在于打破默认路由的单一路径限制,让不同流量按规则走不同网卡出口。关键不是简单添加多条默认路由,而是结合源地址、目标地址、应用标记等条件,配合独立路由表与策略规则完成精细化控制。
一、理解策略路由基本组成:规则 + 路由表 + 路由条目
Linux策略路由依赖三要素协同工作:
- 路由规则(ip rule):决定“什么流量查哪张表”,例如“来自192.168.10.100的包查table 100”;
- 自定义路由表(/etc/iproute2/rt_tables):为每个出口网卡定义独立路由表(如table 100 对应 eth0,table 200 对应 eth1);
-
路由条目(ip route):在对应表中配置具体路径,比如
ip route add default via 192.168.10.1 dev eth0 table 100。
注意:系统默认只用 main 表和 default 规则,新增策略必须显式添加规则并绑定表,否则不会生效。
二、双网卡双出口策略路由实操(以 eth0/eth1 为例)
假设环境:
- eth0:192.168.10.100/24,网关 192.168.10.1,运营商A;
- eth1:10.0.20.100/24,网关 10.0.20.1,运营商B;
- 希望:内网192.168.100.0/24走eth0,10.0.100.0/24走eth1;公网访问按源IP分流。
操作步骤:
- 编辑/etc/iproute2/rt_tables,追加两行:
100 tab_eth0<br>200 tab_eth1
- 为 eth0 出口配置路由表 100:
ip route add 192.168.10.0/24 dev eth0 src 192.168.10.100 table tab_eth0<br>ip route add default via 192.168.10.1 dev eth0 table tab_eth0
- 为 eth1 出口配置路由表 200:
ip route add 10.0.20.0/24 dev eth1 src 10.0.20.100 table tab_eth1<br>ip route add default via 10.0.20.1 dev eth1 table tab_eth1
- 添加策略规则:
ip rule add from 192.168.10.100/32 table tab_eth0<br>ip rule add from 10.0.20.100/32 table tab_eth1<br>ip rule add to 192.168.100.0/24 table tab_eth0<br>ip rule add to 10.0.100.0/24 table tab_eth1
验证:用ip rule show和ip route show table tab_eth0确认规则与表内容;用ping -I eth0 www.example.com测试指定接口连通性。
三、基于连接标记(fwmark)实现负载均衡
若需对同一源IP的出向连接做轮询或哈希分发(如HTTP请求交替走两个出口),需结合iptables标记 + 策略路由:
- 用iptables给新连接打标记:
iptables -t mangle -A OUTPUT -m state --state NEW -m statistic --mode nth --every 2 --packet 0 -j MARK --set-mark 1<br>iptables -t mangle -A OUTPUT -m state --state NEW -m statistic --mode nth --every 2 --packet 1 -j MARK --set-mark 2
- 添加基于mark的路由规则:
ip rule add fwmark 1 table tab_eth0<br>ip rule add fwmark 2 table tab_eth1
- 确保对应路由表中存在默认路由(前面已配)。
说明:statistic模块的--every 2表示每2个包轮一次,--packet 0/1分别对应第1、第2个包,实现简单轮询。生产中可改用--mode random或结合hashlimit更精细控制。
四、持久化配置与常见避坑点
重启后策略路由会丢失,需固化配置:
- 将所有
ip route和ip rule命令写入/etc/network/if-up.d/routing(Debian/Ubuntu)或/etc/sysconfig/network-scripts/route-eth0(RHEL/CentOS)等网络启动脚本; - 确保
net.ipv4.conf.all.send_redirects = 0和net.ipv4.conf.*.send_redirects = 0,避免网关发ICMP重定向干扰策略; - 禁用反向路径过滤(rp_filter):
net.ipv4.conf.eth0.rp_filter = 0<br>net.ipv4.conf.eth1.rp_filter = 0
(否则回程路径不匹配会被丢弃); - 注意DNS解析不受路由策略影响——若/etc/resolv.conf指向单一边DNS,可能造成解析结果与出口不一致,建议部署本地DNS转发器(如dnsmasq)并按出口拆分上游。
策略路由本身不提供故障自动切换,如需高可用,需额外集成健康检查(如fping + ip route replace脚本)或使用keepalived + BFD方案。











