单纯加默认路由或仅用ip rule无法实现真正的多出口负载分担,必须组合iptables/nftables标记、ip rule查mark、多路由表及禁用rp_filter;先注册独立路由表并配置各出口路径,再用iptables对新连接做一致性哈希标记存入conntrack,接着添加fwmark策略规则跳转对应表,最后关闭rp_filter防止回程丢包。

单纯加几条默认路由或只用 ip rule 无法实现真正的多出口负载分担。它本质是“分流器”,不是“调度器”。要让不同连接稳定、均匀走不同出口,同时保证同一连接所有包路径一致(避免回程不一致被丢弃),必须组合 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 的哈希,保障客户端粒度的路径稳定性:
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
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 条件。
添加策略规则匹配标记并跳转路由表
标记之后,需要让内核根据包上的 fwmark 查指定路由表:
ip rule add fwmark 1 table isp_aip rule add fwmark 2 table isp_b
注意:规则优先级数字越小越先执行,建议将这些规则放在 main 规则(32766)之前,例如用 ip rule add pref 100 fwmark 1 table isp_a 显式指定优先级,避免被默认规则覆盖。
禁用反向路径过滤防止回程包被丢弃
若开启 rp_filter,系统会检查入包是否来自路由表中记录的“合理”方向。多出口时,回程包可能经另一线路到达,触发丢包。需关闭:
echo 0 > /proc/sys/net/ipv4/conf/all/rp_filterecho 0 > /proc/sys/net/ipv4/conf/eth0/rp_filterecho 0 > /proc/sys/net/ipv4/conf/eth1/rp_filter
为持久化,写入 /etc/sysctl.conf:
net.ipv4.conf.eth0.rp_filter = 0
net.ipv4.conf.eth1.rp_filter = 0


















