objectif
Comprendre pourquoi un paquet prend une route spécifique: règles ip rule, tables de routage, marque fwmark et adresse source.
code minimal
# afficher les règles et leurs priorités
ip rule show
# lister les routes des tables utiles (main, default et 100-200)
for t in main default 100 200; do echo "# table $t"; ip route show table "$t"; done
# simuler un routage avec source, fwmark et interface
ip -o route get 203.0.113.10 from 192.0.2.5 fwmark 0x1 iif eth0
utilisation
# paquet marqué fwmark=0x1 vers data.pm -> quelle table ?
dst="$(getent ahosts data.pm | awk 'NR==1{print $1}')"
ip -o route get "$dst" fwmark 0x1
# voir règles appliquées aux paquets locaux sortants
ip rule show | nl
# route par source (policy "source-based routing")
ip rule add from 192.0.2.0/24 table 100 prio 10000
ip route add default via 192.0.2.1 dev eth0 table 100
variante(s) utile(s)
# marquer des paquets sortants d'un process (iptables/nft requis, exemple iptables mangle)
iptables -t mangle -A OUTPUT -p tcp --dport 443 -m owner --uid-owner web -j MARK --set-mark 0x1
# tables personnalisées persistées dans /etc/iproute2/rt_tables
echo "100 uplink_a" | sudo tee -a /etc/iproute2/rt_tables
notes
- les priorités basses sont évaluées après les hautes (ordre croissant).
- combinez
ip rule+ip route getpour vérifier la table choisie et l’adresse source. - pour nftables, utilisez
meta mark set 0x1dans la chaîneoutputéquivalente.