Source routing sous Linux.
Exemple (tiré d'un cas concret). On veut avoir une route par défaut (vers Internet) différente en fonction de l'origine : deux préfixes IP distincts. Les interfaces de sorties sont également différentes en fonction du préfixe source.
1) On entre un couple id-nom de table dans /etc/iproute2/rt_tables :
252 table1
253 table2
2) On dirige dans une table en fonction du préfixe source :
ip rule add from 192.0.2.0/24 table table1
ip rule add from 198.51.100.0/24 table table2
3) On ajoute les routes vers les deux gw à utiliser :
ip route add 198.18.0.1 dev eth0
ip route add 203.0.113.1 dev eth1
Oui, il est impératif de créer ces routes dans la table principale (main) !
4) On ajoute les routes par défaut dans chaque table
ip route add default via 198.18.0.1 dev eth0 table table1
ip route add default via 203.0.113.1 dev eth1 table table2
5) Pour tester :
ping <destination> : on ne doit pas sortir (je considére que ce qui passe ici appartient à l'un ou l'autre des préfixes et doit donc tomber dans une table, je n'ai aucune route dans main (à part vers les gw, of course)
ping -I 192.0.2.1 <destination> ou traceroute -s 192.0.2.1 <destination> : on doit sortir par eth0 et 198.18.0.1 (table1)
ping -I 198.51.100.1 <destination> ou traceroute -s 198.51.100.1 <destination> : on doit sortir par eth1 et 203.0.113.1 (table 2)
Pour debug vos règles : ip rule s. Une erreur saute vite aux yeux. Exemple kimarche :
0: from all lookup local
32764: from 192.0.2.0/24 lookup table1
32765: from 198.51.100.0/24 lookup table2
32766: from all lookup main
Exemple kimarchepas :
0: from all lookup local
32764: from 192.0.2.0/24 lookup table1
32765: from 198.51.100.0/24 lookup table2
32766: from all lookup main
32767: from all lookup table2
Notez la dernière ligne ;)
Évidemment, le source-routing, comme les autres fonctionnalités réseaux est également disponible dans un netns.
ÉDIT du 21/02/2015 à 17h00 : À partir de Linux 3.12, en IPv6 uniquement, le source routing devient plus simple. Voir :
http://shaarli.guiguishow.info/?i9-rcA . FIN DE L'ÉDIT.