真正的按流负载均衡需组合iptables/nftables标记、策略路由、多路由表及禁用rp_filter,仅默认路由或ip rule无法实现稳定均匀分流。

单纯加几条默认路由或只用 ip rule 无法实现真正的按流负载均衡。它本质是“分流器”,不是“调度器”。要让不同 TCP/UDP 连接稳定、均匀地走不同出口,同时保证同一连接所有包路径一致(避免回程不一致被丢弃),必须组合 iptables/nftables 标记、策略规则查 mark、多路由表和关键内核参数调整。
定义独立路由表并配置各出口路径
先在 /etc/iproute2/rt_tables 中注册新表,例如:
101 isp_b
再为每张表添加对应网关和直连子网路由(注意 src 指定源 IP,避免出包选错地址):
ip route add 203.107.1.0/30 dev eth0 src 203.107.1.10 table isp_aip route add default via 203.107.1.1 dev eth0 table isp_aip route add 114.255.2.0/30 dev eth1 src 114.255.2.20 table isp_bip route add default via 114.255.2.1 dev eth1 table isp_b
别忘了把直连网段也加进 main 表,否则本地通信可能异常:
ip route replace 203.107.1.0/30 dev eth0 src 203.107.1.10 table mainip route replace 114.255.2.0/30 dev eth1 src 114.255.2.20 table main
用 iptables 对新连接做一致性哈希标记
轮询(nth)适合测试,但易受连接突发影响;推荐基于源 IP 的哈希,保障客户端粒度的路径稳定性:
Linux 性能分析与调优专家,覆盖 CPU、内存、磁盘 I/O、网络、内核参数、编译优化、容器/K8s。适用场景:系统卡顿/高负载、内存不足/OOM/Swap 高、CPU 异常/iowait 高。
iptables -t mangle -A OUTPUT -m state --state NEW -m hashlimit --hashlimit-mode srcip --hashlimit-name out_hash -j CONNMARK --save-mark- 该规则会为每个新连接计算固定哈希值,并存入连接跟踪(conntrack)中
- 后续同连接的所有包都会复用这个标记,确保五元组路径不变
如果需更精细控制(如按目标端口分线),可叠加 --dport 53 或 --sport 条件。
用 ip rule 查 fwmark 分流到对应路由表
标记已存在连接中,接下来在路由决策前查 mark 并跳转:
ip rule add fwmark 0x1 table isp_aip rule add fwmark 0x2 table isp_b- 实际标记值由 iptables 规则决定,例如用
--save-mark后配合CONNMARK --restore-mark可还原 - 规则优先级建议设为 30000 左右,高于默认的 32766(main 表),确保生效
验证命令:ip rule show 看规则是否加载,ip route show table isp_a 看路由是否完整。
必须禁用反向路径过滤(rp_filter)
Linux 默认开启严格反向路径检查(rp_filter=1),当回包接口与出包接口不一致时直接丢弃——这正是多出口场景下的典型问题:
- 编辑
/etc/sysctl.conf,加入:
net.ipv4.conf.default.rp_filter = 0
net.ipv4.conf.eth0.rp_filter = 0
net.ipv4.conf.eth1.rp_filter = 0
- 执行
sysctl -p生效 - 否则即使路由和规则全对,DNS 查询、SSH 连接等也会间歇性失败
不复杂但容易忽略。










