mefat的答案对我有很大帮助,但是与其将所有主表规则一次性复制到两个ISP表中,一种更好的方法可能是使用规则prio在主表后添加默认规则。
正常设置/ etc / iproute2 / rt_tables:
...
10 ISP1
20 ISP2
...
注意
ip rule show
显示规则0-> local,32766-> main和32767-> default。请参阅man ip
以获取更多详细信息。
至关重要的是,路由过程将从低优先级规则到高优先级规则进行工作……但是32767不是最高规则。因此,如果主路由表没有默认路由(但可能包含vpn等的各种动态更改路由),则如果不匹配,它将变为默认路由(通常为空),然后寻找更高的优先级规则。
请参阅此处的“抛出”部分:http : //linux-ip.net/html/routing-tables.html
所以现在设置
ip route add default dev $ISP1_IFACE table ISP1
ip route add default dev $ISP2_IFACE table ISP2
并确保在主表之后对其进行了检查:
ip rule add fwmark 20 table ISP1 prio 33000
ip rule add fwmark 10 table ISP2 prio 33000
采用
ip rule show
再次验证这些规则是否比主要规则更高
然后使用CONNMARK修改,如mefat所述:
# iptables -t mangle -A PREROUTING -j CONNMARK --restore-mark
# iptables -t mangle -A PREROUTING -m mark ! --mark 0 -j ACCEPT
# iptables -t mangle -A PREROUTING -j MARK --set-mark 10
# iptables -t mangle -A PREROUTING -m statistic --mode random --probability 0.5 -j MARK --set-mark 20
# iptables -t mangle -A PREROUTING -j CONNMARK --save-mark
注意事项:pppd nodefaultroute
否则需要在main中设置;设备重新启动时,将清除ISP1 / ISP2表,因此需要使用脚本进行还原。
我在/etc/ppp/ip-{up,down}.d/dual-routing中使用脚本
# One of my connections is ~2x faster than the other
BALANCED=0.3
ALL_ISP1=0
ALL_ISP2=1
RULENUM=4
set_balance() {
iptables -t mangle -R PREROUTING $RULENUM -m statistic --mode random --probability $0 -j MARK --set-mark 2
}
# if both up
set_balance $BALANCED
# if ppp1 down:
set_balance $ALL_ISP1
# if ppp0 down:
set_balance $ALL_ISP2
这是基于连接的负载平衡,因此,我将研究使用负载来监视和替换统计信息规则:iptables -t mangle -R PREROUTING <n>
来自用户空间。因此,如果在一个连接上长期运行下载,而另一个连接的负载很轻,则我们应该选择轻负载的连接。