Die Antwort von mefat hat mir sehr geholfen, aber anstatt eine einmalige Kopie aller Regeln der Haupttabelle in die beiden ISP-Tabellen zu kopieren, ist es möglicherweise besser, das Regel-Prio zu verwenden, um die Standardregeln nach der Haupttabelle hinzuzufügen.
Richten Sie / etc / iproute2 / rt_tables wie gewohnt ein:
...
10 ISP1
20 ISP2
...
Beachten Sie, dass
ip rule show
Zeigt die Regeln 0-> local, 32766-> main und 32767-> default an. Sehen Sie man ip
für weitere Details.
Entscheidend ist, dass der Routing-Prozess von Low-Prio-Regeln zu High-Prio-Regeln funktioniert ... aber 32767 ist nicht die höchste Regel #. Wenn die Hauptrouting-Tabelle also keine Standardroute enthält (aber möglicherweise alle Arten von sich dynamisch ändernden Routen für VPNs usw. enthält), wird bei Nichtübereinstimmung die Standardroute (normalerweise leer) verwendet und nach höheren Prio-Regeln gesucht.
Siehe den Abschnitt 'throw' hier: http://linux-ip.net/html/routing-tables.html
Also jetzt einrichten
ip route add default dev $ISP1_IFACE table ISP1
ip route add default dev $ISP2_IFACE table ISP2
und um sicherzugehen, dass sie sich um den Haupttisch kümmern:
ip rule add fwmark 20 table ISP1 prio 33000
ip rule add fwmark 10 table ISP2 prio 33000
Verwenden
ip rule show
erneut, um sicherzustellen, dass diese Regeln höher sind als main
Dann benutze CONNMARK Mangling, wie Mefat sagte:
# 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
Dinge, die zu beachten sind: pppd muss nodefaultroute
ansonsten in main eingerichtet werden; Beim Neustart eines Geräts werden die ISP1 / ISP2-Tabellen bereinigt. Sie müssen daher mithilfe eines Skripts wiederhergestellt werden.
Ich benutze ein Skript in /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
Dies ist ein verbindungsbasierter Lastenausgleich. Daher werde ich die Verwendung von Load zum Überwachen und Ersetzen der Statistikregel untersuchen: iptables -t mangle -R PREROUTING <n>
From Userspace. Wenn also eine Verbindung über einen längeren Zeitraum heruntergeladen wird und die andere Verbindung leicht geladen ist, sollten wir die leicht geladene Verbindung vorziehen.