Le policy routing sous Linux et Cisco IOS

Read the updated English version

Qu’est ce que le Policy routing ?

Je n’ai jamais vu le terme “Policy Routing” traduit, donc je préfère garder la dénomination anglaise afin de ne pas créer de mauvaise traduction. En général en réseaux, on définit le routage vers une destination (par exemple route statique ou par défault). Mais dans certains cas on pourrait avoir besoin d’utiliser d’autres règles pour configurer une route. Par exemple, on a un serveur connecté avec deux interfaces réseaux connectées a des modulateurs satellite et l’on voudrait envoyer à la bonne le traffic de la machine. Voici un exemple que j’ai implémenté à mon travail :
Network

Imaginons les adresses IP suivantes :

  • eth0 : 192.168.0.3
  • eth1 : 192.168.1.3
  • eth2 : 192.168.2.3
  • main router (routeur principal) sur eth0 : 192.168.0.1
  • Modulator 1 : 192.168.1.2
  • Modulator 2 : 192.168.2.2

Ceci est l’exemple de mon serveur NNTP. Il veut parler aux clients via satellite et avec ses feedeurs (traduction? :p) via Internet. La configuration va être la suivante : n’importe quel traffic IP partant de l’interface eth0 va être envoyée au routeur principal, le traffic depuis l’interface eth1 (192.168.1.3) va être envoyé au Modulateur 1 (192.168.1.2), et la traffic depuis eth2 va être envoyé au Modulateur 2 (192.168.2.2).

Ceci permet d’avoir différentes passerelles pour chaque interface réseau du système. Attention , la notion d’entrée ou de sortie peut être ambigüe, mais il s’agit de traffic sortant du système sur lequel nous travaillons.

Outils nécessaires (avec Linux)

Pour configurer le policy routing, il faut un noyau Linux 2.2 ou supérieur ainsi que le package iproute2 qui peut être trouvé sur ftp://ftp.inr.ac.ru/ip-routing/ – bien qu’il fasse partie de la majorité des distributions, et quelques bases de connaissances en réseau.

Configuration

Configuration de la carte eth0 ainsi que du routage par défaut sur le routeur:
# /sbin/ifconfig eth0 192.168.0.3 netmask 255.255.255.0 broadcast 192.168.0.255
# /sbin/route add default gw 192.168.0.1

Ensuite il faut avoir iproute2 installé et configuré. En cas de problème il faut regarder le fichier README. Aussi le support “Advanced routing” et “policy routing” doivent être activés dans le noyau.
Ensuite il faut créer les règles du policy :
Pour le 1er modulateur (table 4) :
# ip ru add from 192.168.1.3 lookup 4
# ip ro add 0.0.0.0/0 via 192.168.1.2 table 4

Tout cela signifie :

  • Crée un table (Numéro 4) quand du traffic arrive depuis l’adresse IP 192.168.1.3.
  • Utilise comme route par défault (0.0.0.0/0) la passerelle 192.168.1.2 quand le traffic correspond à la table 4 (depuis 192.168.1.3)

Pour le second modulateur (table 5) :
# ip ru add from 192.168.2.3 lookup 5
# ip ro add 0.0.0.0/0 via 192.168.2.2 table 5

Ensuite il faut tester les règles de policy (Attention j’ai eu quelques problèmes avec traceroute), et les installer dans un script au boot du système.

Note : J’ai eu quelques soucis avec ma version de iproute2 lorsque j’ai voulu enlever des règles et routes, donc il est conseillé de se souvenir des tables et routes que l’on a mises car elles ne sont pas toujours affichées par les commandes ip ro ls et ip ru ls).

Pour plus d’informations…

On peut utiliser d’autres arguments qu’une adresse IP source à l’aide de ipchains (fwmarks) ainsi qu’avec iptables.
On peut aussi faire d’autres choses avec iproute2, comme de la Qualité de Service (QoS). On peut aussi faire du policy routing avec un routeur Cisco (voir ci dessous), mais celà peut engendrer une importante charge processeur sur le routeur, ainsi que tout ce qui cache de route (route-cache) doit être désactivé, et peut avoir de droles d’influences avec les protocoles de routage, donc à utiliser avec précaution…

Avec un routeur Cisco

Celà peut paraître dificile la première fois, surtout si l’on est pas habitué aux access-list et route-map, mais en réalité celà est simple si l’on connait ces derniers. Le principe est un route-map (traduction? :p) appliqué sur une interface du routeur.

Imaginons un système avec 3 adresses IP sur le même sous-réseau (192.168.0.2/24, 192.168.0.3/24 and 192.168.0.4/24), qui est connecté sur l’interface FastEthernet 0/0 de notre routeur.

Nous souhaitons router le traffic venant de 192.168.0.4 vers une autre machine où le routeur est connecté (exemple une passerelle satellite en 192.168.1.2/24). Le traffic venant de 192.168.0.3 doit être routé vers 192.168.2.2, ainsi que le traffic par défaut doit être routé suivant sa route par défaut.

Premièrement, on définit une access-list IP étendue qui définit le traffic :

  • Le traffic allant vers le LAN est renvoyé sur le LAN (évite des soucis si certains systèmes sont mal configurés) :

access-list 130 permit ip any 192.168.0.0 0.0.0.255

  • Le traffic venant de 192.168.0.4 vers n’importe quelle destination :

access-list 131 permit ip host 192.168.0.4 any

  • Le traffic venant de 192.168.0.3 vers n’importe quelle destination :

access-list 132 permit ip host 192.168.0.3 any

  • Le traffic par défaut :

access-list 133 permit ip any any

Maintenant nous allons définir un route-map que nous allons appeler satellite, les numéros sont les mêmes que ceux des access-list pour éviter toute confusion :

  • Tout traffic à destination du LAN est envoyé sur le l’interface FastEthernet 0/0 :

route-map satellite permit 130
match ip address 130
set interface FastEthernet 0/0

  • Tout traffic venant de 192.168.0.4 doit être routé vers 192.168.1.2 :

route-map satellite permit 131
match ip address 131
set ip next-hop 192.168.1.2

  • Tout traffic venant de 192.168.0.3 doit être routé vers 192.168.2.2 :

route-map satellite permit 132
match ip address 132
set ip next-hop 192.168.2.2

  • Tout autre traffic n’a pas de règle particulière, et garde sa route normale – en fonction de la destination du paquet:

route-map satellite permit 133
match ip address 133

Celà ressemble à l’exemple sous Linux, mais ici les tables sont remplacées par les access-list et les route-map remplacent les règles. Ensuite il faut activer ces paramètres sur l’interface FastEthernet 0/0 du routeur, mais avant il est nécessaire de vérifier si la configuration est correcte, donc il est préférable de sauvegarder la configuration de ce dernier. Il est également pas conseillé de tester son premier policy-routing sur un routeur qui tourne en production. En cas de problème, le comportement du réseau peut être étrange et imprévisible, ou bien il peut simplement s’arrêter de fonctionner.

interface FastEthernet0/0
ip policy route-map satellite

Voila, c’est activé, maintenant faut tester, et espérer ne pas avoir à debugger 😉

Divers

La version anglaise de ce document est plus complete et inclut un exemple sous FreeBSD ainsi que quelques liens externes.

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.

New day, new adventure