Si vous avez un routeur important, il se peut que vous vouliez
satisfaire les besoins de différentes personnes, qui peuvent être
traitées différemment. Les bases de données des politiques de
routage vous aident à faire cela, en gérant plusieurs ensembles de
tables de routage. Si vous voulez utiliser cette fonctionnalité,
assurez-vous que le noyau est compilé avec les options "IP :
Advanced router" et "IP: policy routing".
Quand le noyau doit prendre une décision de routage, il
recherche quelle table consulter. Par défaut, il y a trois tables.
L'ancien outil route modifie les tables "main"
(principale) et "local" (locale), comme le fait l'outil
ip (par défaut).
Les règles par défaut :
[ahu@home ahu]$ ip rule list
0: from all lookup local
32766: from all lookup main
32767: from all lookup default
Ceci liste la priorité de toutes les règles. Nous voyons que
toutes les règles sont appliquées à tous les paquets ("from all").
Nous avons vu la table "main" précédemment, sa sortie s'effectuant
avec ip route ls, mais les tables "local" et "default"
sont nouvelles.
Si nous voulons faire des choses fantaisistes, nous pouvons
créer des règles qui pointent vers des tables différentes et qui
nous permettent de redéfinir les règles de routage du système.
Pour savoir exactement ce que fait le noyau en présence d'un
assortiment de règles plus complet, référez-vous à la documentation
ip-cref d'Alexey [NdT : dans le paquet iproute(2) de votre
distribution].
Prenons encore une fois un exemple réel. J'ai 2 modems câble,
connectés à un routeur Linux NAT ("masquerading"). Les personnes
habitant avec moi me paient pour avoir accès à Internet. Supposons
qu'un de mes co-locataires visite seulement hotmail et veuille
payer moins. C'est d'accord pour moi, mais il utilisera le modem le
plus lent.
Le modem câble "rapide" est connu sous 212.64.94.251 et est en
liaison PPP avec 212.64.94.1. Le modem câble "lent" est connu sous
diverses adresses ip, 212.64.78.148 dans notre exemple avec un lien
vers 195.96.98.253.
La table locale :
[ahu@home ahu]$ ip route list table local
broadcast 127.255.255.255 dev lo proto kernel scope link src 127.0.0.1
local 10.0.0.1 dev eth0 proto kernel scope host src 10.0.0.1
broadcast 10.0.0.0 dev eth0 proto kernel scope link src 10.0.0.1
local 212.64.94.251 dev ppp0 proto kernel scope host src 212.64.94.251
broadcast 10.255.255.255 dev eth0 proto kernel scope link src 10.0.0.1
broadcast 127.0.0.0 dev lo proto kernel scope link src 127.0.0.1
local 212.64.78.148 dev ppp2 proto kernel scope host src 212.64.78.148
local 127.0.0.1 dev lo proto kernel scope host src 127.0.0.1
local 127.0.0.0/8 dev lo proto kernel scope host src 127.0.0.1
Il y a beaucoup de choses évidentes, mais aussi des choses qui
ont besoin d'être précisées quelque peu, ce que nous allons faire.
La table de routage par défaut est vide.
Regardons la table principale ("main") :
[ahu@home ahu]$ ip route list table main
195.96.98.253 dev ppp2 proto kernel scope link src 212.64.78.148
212.64.94.1 dev ppp0 proto kernel scope link src 212.64.94.251
10.0.0.0/8 dev eth0 proto kernel scope link src 10.0.0.1
127.0.0.0/8 dev lo scope link
default via 212.64.94.1 dev ppp0
Maintenant, nous générons une nouvelle règle que nous
appellerons "John", pour notre hypothétique co-locataire. Bien que
nous puissions travailler avec des nombres IP purs, il est plus
facile d'ajouter notre table dans le fichier
/etc/iproute2/rt_tables.
# echo 200 John >> /etc/iproute2/rt_tables
# ip rule add from 10.0.0.10 table John
# ip rule ls
0: from all lookup local
32765: from 10.0.0.10 lookup John
32766: from all lookup main
32767: from all lookup default
Maintenant, tout ce qu'il reste à faire est de générer la table
"John", et de vider le cache des routes :
# ip route add default via 195.96.98.253 dev ppp2 table John
# ip route flush cache
Et voilà qui est fait. Il ne reste plus, comme exercice laissé
au lecteur, qu'à implanter cela dans ip-up.