Odpowiedź mefata bardzo mi pomogła, ale zamiast jednorazowej kopii wszystkich reguł tabeli głównej do dwóch tabel ISP lepszym rozwiązaniem może być użycie reguły prio do dodania domyślnych reguł po tabeli głównej.
Skonfiguruj / etc / iproute2 / rt_tables w normalny sposób:
...
10 ISP1
20 ISP2
...
Zauważ, że
ip rule show
Pokazuje reguły 0-> lokalne, 32766-> główne i 32767-> domyślne. Zobacz man ip
po więcej szczegółów.
Zasadniczo proces routingu będzie działał od reguł niskich do wysokich prio ... ale 32767 nie jest najwyższą regułą #. Więc jeśli główna tabela routingu nie ma domyślnej trasy (ale może zawierać wszystkie rodzaje dynamicznie zmieniających się tras dla VPN itp.), To jeśli dopasowanie nie zostanie wykonane, przechodzi do domyślnej (zwykle pustej), a następnie szuka wyższych reguł prio.
Zobacz sekcję „rzut” tutaj: http://linux-ip.net/html/routing-tables.html
Więc teraz skonfiguruj
ip route add default dev $ISP1_IFACE table ISP1
ip route add default dev $ISP2_IFACE table ISP2
i aby upewnić się, że są oglądane po głównym stole:
ip rule add fwmark 20 table ISP1 prio 33000
ip rule add fwmark 10 table ISP2 prio 33000
Posługiwać się
ip rule show
jeszcze raz, aby sprawdzić, czy te zasady są wyższe niż prio
Następnie użyj mangowania CONNMARK, jak mefat powiedział:
# 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
Warto zwrócić uwagę: pppd potrzebuje nodefaultroute
inaczej konfiguruje się w main; kiedy urządzenie uruchomi się ponownie, tabele ISP1 / ISP2 są czyszczone, więc należy je przywrócić za pomocą skryptu.
Używam skryptu w /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
Jest to równoważenie obciążenia oparte na połączeniu, więc zamierzam rozważyć użycie obciążenia do monitorowania i zastąpienia reguły statystyk: iptables -t mangle -R PREROUTING <n>
z przestrzeni użytkownika. Więc jeśli na jednym połączeniu istnieje długotrwałe pobieranie, a drugie połączenie jest lekko obciążone, powinniśmy preferować lekko obciążone połączenie.