La risposta di mefat mi ha aiutato molto, ma piuttosto che una copia una tantum di tutte le regole della tabella principale nelle due tabelle ISP, un approccio migliore potrebbe essere quello di utilizzare la regola prio per aggiungere le regole predefinite dopo la tabella principale.
Configurare / etc / iproute2 / rt_tables come di consueto:
...
10 ISP1
20 ISP2
...
Nota che
ip rule show
Mostra le regole 0-> locale, 32766-> principale e 32767-> predefinito. Vedi man ip
per maggiori dettagli.
Fondamentalmente il processo di routing funzionerà da regole prio basse a regole prio alte ... ma 32767 non è la regola più alta #. Quindi, se la tabella di routing principale non ha route predefinita (ma può contenere tutti i tipi di route che cambiano in modo dinamico per VPN, ecc.), Se non viene effettuata una corrispondenza, questa passa all'impostazione predefinita (normalmente vuota) e quindi cerca regole prio più elevate.
Vedi la sezione 'lancio' qui: http://linux-ip.net/html/routing-tables.html
Quindi ora l'installazione
ip route add default dev $ISP1_IFACE table ISP1
ip route add default dev $ISP2_IFACE table ISP2
e per assicurarsi che siano esaminati dopo il tavolo principale:
ip rule add fwmark 20 table ISP1 prio 33000
ip rule add fwmark 10 table ISP2 prio 33000
Uso
ip rule show
di nuovo per verificare che queste regole siano più alte delle principali
Quindi usa CONNMARK mangling come diceva 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
Cose da notare: pppd ha bisogno nodefaultroute
altrimenti si configura principalmente; quando un dispositivo si riavvia, le tabelle ISP1 / ISP2 vengono pulite, quindi è necessario ripristinarle utilizzando uno script.
Uso uno script 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
Questo è il bilanciamento del carico basato sulla connessione, quindi esaminerò l'utilizzo del carico per monitorare e sostituire la regola delle statistiche: iptables -t mangle -R PREROUTING <n>
dallo spazio utente. Quindi, se c'è un download a lungo termine su una connessione e l'altra connessione è leggermente caricata, dovremmo preferire la connessione leggermente caricata.