La réponse de mefat m'a beaucoup aidé mais plutôt qu'une copie unique de toutes les règles de la table principale dans les deux tables ISP, une meilleure approche peut être d'utiliser la règle prio pour ajouter les règles par défaut après la table principale.
Configurez / etc / iproute2 / rt_tables comme d'habitude:
...
10 ISP1
20 ISP2
...
Notez que
ip rule show
Affiche les règles 0-> local, 32766-> principal et 32767-> par défaut. Voir man ip
pour plus de détails.
Fondamentalement, le processus de routage fonctionnera de règles de faible valeur à des valeurs de valeur élevée ... mais 32767 n'est pas le numéro de règle le plus élevé. Donc, si la table de routage principale n'a pas de route par défaut (mais peut contenir toutes sortes de routes à changement dynamique pour les VPN, etc.), si une correspondance n'est pas établie, elle passe à la valeur par défaut (normalement vide) et recherche ensuite des règles de priorité plus élevées.
Voir la section 'throw' ici: http://linux-ip.net/html/routing-tables.html
Alors maintenant, configurez
ip route add default dev $ISP1_IFACE table ISP1
ip route add default dev $ISP2_IFACE table ISP2
et pour s'assurer qu'ils sont regardés après la table principale:
ip rule add fwmark 20 table ISP1 prio 33000
ip rule add fwmark 10 table ISP2 prio 33000
Utilisation
ip rule show
à nouveau pour vérifier que ces règles sont plus élevées que les principales
Utilisez ensuite CONNMARK mangling comme mefat l'a dit:
# 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
Choses à noter: pppd a besoin nodefaultroute
sinon il s'installe dans main; lorsqu'un périphérique redémarre, les tables ISP1 / ISP2 sont nettoyées et doivent donc être restaurées à l'aide d'un script.
J'utilise un script dans /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
Il s'agit d'un équilibrage de charge basé sur la connexion, je vais donc examiner l'utilisation de la charge pour surveiller et remplacer la règle de statistiques: iptables -t mangle -R PREROUTING <n>
depuis l'espace utilisateur. Donc, s'il y a un téléchargement de longue durée sur une connexion et que l'autre connexion est légèrement chargée, nous devrions préférer la connexion légèrement chargée.