Routage amélioré
Niveau :
Résumé : ip rule ; ip route
Le routage IP est communément défini en fonction de la destination. Remarquez c'est logique. La fonction d'un routeur est de faire en sorte que les paquets arrivent à bon port (héhé), la route à prendre ne devrait dépendre que de cette destination.
Mais comme pour les GPS, il peut parfois y avoir quelques options à prendre en compte, êtes vous un camion (passage de tunnels) ou un piéton (passage d'escaliers) ? Pour toutes les options de routage qui ne dépendent pas uniquement de la destination, linux utilise ce qu'il appelle "policy based routing" qui est une option qui doit être activée dans le noyau (c'est le cas pour la plupart des distributions).
Le concept est simple. Vous écrivez des règles pour matcher les paquets, lesquelles vont décider de la table de routage à choisir. La table en question étant une table de routage tout ce qu'il y a de plus standard telle que vous connaissez sous linux.
Les tables
Les tables se créent et se gèrent avec ip route (comme d'hab). Exemple :
$ ip route add default via 10.0.0.1 table 1 $ ip route add default via 10.0.0.2 table 2
Vous avez 255 tables à votre disposition, j'espère que vous saurez en profiter.
Vous pouvez donner un nom plutôt qu'un numéro à votre table. C'est tout simple, il suffit d'éditer le fichier /etc/iproute2/rt_tables. Et voila :
$ ip route del default table matable
Remarquez que les fichiers permettent de nommer de nombreuses choses qui sont représentées par des numéros pour la commande ip.
Et pour le contenu des routes, c'est la commande show, par défaut c'est la table "main" qui est affichée avec la commande "ip route show". Pour en voir une autre :
# la table local ne doit pas être modifiée à la main, elle est gérée par le noyau $ ip route show table local
Ça c'était la partie facile.
Les règles
Les règles se créent avec ip rules
Il est possible de créer des règles sur l'adresse source, l'interface réseau sur laquelle le paquet a été reçu, ou même sur une marque posée sur le paquet par netfilter (fwmark, ça permet de faire tout et n'importe quoi). Pour la liste complète, voyez le manuel.
$ ip rule add iif eth3 table matable
Par défaut 3 règles existent, la première force le passage par la table "local" pour les route gérées par le noyau. Les 2 dernières servent de défaut et pointent vers la table de routage habituelle : "main". On peut les voir avec :
$ ip rule show
Exemple
Supposons un monde composé d'un centre de production (avec des serveurs), d'un réseau avec des postes de travail et d'un accès au monde extérieur.
On va faire passer les postes de travail à travers un firewall pour sortir et pas les serveurs.
# TABLE SPÉCIFIQUE : routage spécifique pour les paquets en provenance du réseau user $ ip rule add iff ethUser table 1 # pas de firewall pour accéder aux serveurs en interne $ ip route add $SERVER_NETWORK dev ethServer table 1 # on les envoi vers le firewall par défaut $ ip route add default via $FW_IP table 1 # TABLE PRINCIPALE : ne pas oublier de répéter les règles communes $ ip route add $SERVER_NETWORK dev ethServer # et une route de sortie aussi pour les non User $ ip route add default via $3G_BOX
PS : pour ceux qui ne savent pas encore que je suis sur twitter, cette semaine c'est une série d'astuces réseau.
Tags:planet-libre, Réseau, Routeur