Comme nous l’avons anticipé dans les tutoriels précédents de cette série LFCE (Linux Foundation Certified Engineer), dans cet article, nous discuterons du routage du trafic IP de manière statique et dynamique avec des applications spécifiques.

Introduction au programme de certification de la Linux Foundation
Commençons par les définitions:
- En termes simples, un paquet est l’unité de base utilisée pour transmettre des informations au sein d’un réseau. Les réseaux utilisant TCP/IP comme protocole réseau suivent les mêmes règles pour la transmission de données: les informations réelles sont divisées en paquets composés à la fois de données et de l’adresse où elles doivent être envoyées.
- Le routage est le processus de « guidage » des données de la source à la destination à l’intérieur d’un réseau.
- Le routage statique nécessite un ensemble de règles configurées manuellement définies dans une table de routage. Ces règles sont fixes et sont utilisées pour définir le chemin qu’un paquet doit suivre lorsqu’il se déplace d’une machine à une autre.
- Le routage dynamique, ou routage intelligent (si vous le souhaitez), signifie que le système peut modifier automatiquement, si nécessaire, l’itinéraire qu’un paquet suit.
Configuration avancée des adresses IP et des périphériques réseau
Le package iproute fournit un ensemble d’outils pour gérer le réseau et le contrôle du trafic que nous utiliserons tout au long de cet article car ils représentent le remplacement des outils hérités tels que ifconfig et route.
L’utilitaire central dans la suite iproute s’appelle simplement ip. Sa syntaxe de base est la suivante :
# ip object command
Où object ne peut être qu’un des éléments suivants (seuls les objets les plus fréquents sont affichés – vous pouvez vous référer à man ip pour une liste complète) :
- link : dispositif réseau.
- addr : adresse de protocole (IP ou IPv6) sur un dispositif.
- route : entrée de table de routage.
- rule : règle dans la base de données de la politique de routage.
Tandis que command représente une action spécifique qui peut être effectuée sur un objet. Vous pouvez exécuter la commande suivante pour afficher la liste complète des commandes qui peuvent être appliquées à un objet particulier :
# ip object help
Par exemple,
# ip link help

L’image ci-dessus montre, par exemple, que vous pouvez changer l’état d’une interface réseau avec la commande suivante :
# ip link set interface {up | down}
Pour plus d’exemples de la commande ‘ip‘, consultez 10 Commandes ‘ip’ Utiles pour Configurer une Adresse IP
Exemple 1 : Désactiver et activer une interface réseau
Dans cet exemple, nous allons désactiver et activer eth1 :
# ip link show # ip link set eth1 down # ip link show

Si vous souhaitez réactiver eth1,
# ip link set eth1 up
Au lieu d’afficher toutes les interfaces réseau, nous pouvons spécifier l’une d’entre elles :
# ip link show eth1
Ce qui retournera toutes les informations pour eth1.
Exemple 2 : Afficher la table de routage principale actuelle
Vous pouvez consulter votre table de routage principale actuelle avec l’une des 3 commandes suivantes :
# ip route show # route -n # netstat -rn

La première colonne dans la sortie des trois commandes indique le réseau cible. La sortie de la commande ip route affiche (après le mot-clé dev) également les dispositifs réseau qui servent de passerelle physique vers ces réseaux.
Bien qu’aujourd’hui la commande ip soit préférée à route, vous pouvez toujours vous référer au manuel ip-route et man route pour une explication détaillée du reste des colonnes.
Exemple 3 : Utilisation d’un serveur Linux pour router des paquets entre deux réseaux privés
Nous voulons router des paquets icmp (ping) de dev2 à dev4 et vice versa également (notez que les deux machines clientes sont sur des réseaux différents). Le nom de chaque carte réseau, ainsi que son adresse IPv4 correspondante, est donné entre crochets.
Notre environnement de test est le suivant:
Client 1: CentOS 7 [enp0s3: 192.168.0.17/24] - dev1 Router: Debian Wheezy 7.7 [eth0: 192.168.0.15/24, eth1: 10.0.0.15/24] - dev2 Client 2: openSUSE 13.2 [enp0s3: 10.0.0.18/24] - dev4
Examinons la table de routage dans dev1 (boîte CentOS):
# ip route show
et modifions-la afin d’utiliser sa carte enp0s3 et la connexion à 192.168.0.15 pour accéder aux hôtes dans le réseau 10.0.0.0/24:
# ip route add 10.0.0.0/24 via 192.168.0.15 dev enp0s3
Ce qui se lit essentiellement comme suit : « Ajouter une route vers le réseau 10.0.0.0/24 via l’interface réseau enp0s3 en utilisant 192.168.0.15 comme passerelle ».

De même dans dev4 (boîte openSUSE) pour faire un ping vers les hôtes dans le réseau 192.168.0.0/24:
# ip route add 192.168.0.0/24 via 10.0.0.15 dev enp0s3

Enfin, nous devons activer le transfert dans notre routeur Debian:
# echo 1 > /proc/sys/net/ipv4/ip_forward
Maintenant faisons un ping:

et,

Pour rendre ces paramètres persistants au démarrage, éditez /etc/sysctl.conf sur le routeur et assurez-vous que la variable net.ipv4.ip_forward est définie sur true comme suit:
net.ipv4.ip_forward = 1
Configurez les cartes réseau sur les deux clients (cherchez le fichier de configuration dans /etc/sysconfig/network sur openSUSE et /etc/sysconfig/network-scripts sur CentOS – dans les deux cas, il s’appelle ifcfg-enp0s3).
Voici le fichier de configuration de la machine openSUSE:
BOOTPROTO=static BROADCAST=10.0.0.255 IPADDR=10.0.0.18 NETMASK=255.255.255.0 GATEWAY=10.0.0.15 NAME=enp0s3 NETWORK=10.0.0.0 ONBOOT=yes
Exemple 4: Utilisation d’un serveur Linux pour router des paquets entre des réseaux privés et Internet
Un autre scénario où une machine Linux peut être utilisée comme routeur est lorsque vous avez besoin de partager votre connexion Internet avec un LAN privé.
Router: Debian Wheezy 7.7 [eth0: Public IP, eth1: 10.0.0.15/24] - dev2 Client: openSUSE 13.2 [enp0s3: 10.0.0.18/24] - dev4
En plus de configurer le transfert de paquets et la table de routage statique dans le client comme dans l’exemple précédent, nous devons ajouter quelques règles iptables dans le routeur:
# iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE # iptables -A FORWARD -i eth0 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT # iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT
La première commande ajoute une règle à la chaîne POSTROUTING dans la table nat (Network Address Translation), indiquant que la carte eth0 doit être utilisée pour les paquets sortants.
MASQUERADE indique que cette carte possède une IP dynamique et qu’avant d’envoyer le paquet dans le « monde sauvage » d’Internet, l’adresse source privée du paquet doit être modifiée pour correspondre à l’IP publique du routeur.
Dans un LAN avec de nombreux hôtes, le routeur garde une trace des connexions établies dans /proc/net/ip_conntrack afin de savoir où renvoyer la réponse de l’Internet.
Seule une partie de la sortie de:
# cat /proc/net/ip_conntrack
est affichée dans la capture d’écran suivante.

Les origines (IP privée de la machine openSUSE) et les destinations (DNS Google) des paquets sont mises en évidence. Ceci était le résultat de l’exécution de:
# curl www.tecmint.com
sur la machine openSUSE.
Comme je suis sûr que vous pouvez déjà le deviner, le routeur utilise le 8.8.8.8 de Google comme serveur de noms, ce qui explique pourquoi la destination des paquets sortants pointe vers cette adresse.
Note: Les paquets entrants en provenance d’Internet ne sont acceptés que s’ils font partie d’une connexion déjà établie (commande n°2), tandis que les paquets sortants sont autorisés à « sortir librement » (commande n°3).
N’oubliez pas de rendre vos règles iptables persistantes en suivant les étapes décrites dans la Partie 8 – Configurer le pare-feu Iptables de cette série.
Routage dynamique avec Quagga
De nos jours, l’outil le plus utilisé pour le routage dynamique sous Linux est quagga. Il permet aux administrateurs système de mettre en œuvre, avec un serveur Linux relativement peu coûteux, la même fonctionnalité que celle fournie par de puissants (et coûteux) routeurs Cisco.
L’outil lui-même ne gère pas le routage, mais modifie plutôt la table de routage du noyau lorsqu’il apprend de nouvelles meilleures routes pour traiter les paquets.
Étant donné qu’il s’agit d’un fork de zebra, un programme dont le développement a cessé il y a un certain temps, il conserve pour des raisons historiques les mêmes commandes et la même structure que zebra. C’est pourquoi vous verrez beaucoup de références à zebra à partir de ce point.
Veuillez noter qu’il n’est pas possible de couvrir le routage dynamique et tous les protocoles connexes dans un seul article, mais je suis convaincu que le contenu présenté ici servira de point de départ pour vous.
Installation de Quagga sous Linux
Pour installer quagga sur votre distribution choisie :
# aptitude update && aptitude install quagga [On Ubuntu] # yum update && yum install quagga [CentOS/RHEL] # zypper refresh && zypper install quagga [openSUSE]
Nous utiliserons le même environnement que dans l’exemple n°3, avec la seule différence qu’eth0 est connecté à un routeur de passerelle principal avec l’IP 192.168.0.1.
Ensuite, modifiez /etc/quagga/daemons avec :
zebra=1 ripd=1
Créez maintenant les fichiers de configuration suivants.
# /etc/quagga/zebra.conf # /etc/quagga/ripd.conf
et ajoutez ces lignes (remplacez par un nom d’hôte et un mot de passe de votre choix) :
service quagga restart hostname dev2 password quagga
# service quagga restart

Note : Que ripd.conf est le fichier de configuration du protocole d’information de routage, qui fournit au routeur les informations sur les réseaux pouvant être atteints et la distance (en termes de nombre de sauts) à laquelle ils se trouvent.
Remarquez que ceci n’est qu’un des protocoles pouvant être utilisés avec quagga, et je l’ai choisi pour ce tutoriel en raison de sa facilité d’utilisation et du fait que la plupart des dispositifs réseau le supportent, bien qu’il ait l’inconvénient de transmettre les identifiants en texte clair. Pour cette raison, vous devez attribuer des autorisations appropriées au fichier de configuration :
# chown quagga:quaggavty /etc/quagga/*.conf # chmod 640 /etc/quagga/*.conf
Exemple 5 : Configuration de quagga pour router le trafic IP de manière dynamique
Dans cet exemple, nous utiliserons la configuration suivante avec deux routeurs (assurez-vous de créer les fichiers de configuration pour le routeur n°2 comme expliqué précédemment) :

Important : N’oubliez pas de répéter la configuration suivante pour les deux routeurs.
Connectez-vous à zebra (écoutant sur le port 2601), qui est l’intermédiaire logique entre le routeur et le noyau :
# telnet localhost 2601
Entrez le mot de passe qui a été défini dans le fichier /etc/quagga/zebra.conf, puis activez la configuration :
enable configure terminal
Entrez l’adresse IP et le masque réseau de chaque NIC :
inter eth0 ip addr 192.168.0.15 inter eth1 ip addr 10.0.0.15 exit exit write

Maintenant, nous devons nous connecter au terminal du démon RIP (port 2602) :
# telnet localhost 2602
Entrez le nom d’utilisateur et le mot de passe tels que configurés dans le fichier /etc/quagga/ripd.conf, puis saisissez les commandes suivantes en gras (des commentaires sont ajoutés pour plus de clarté) :
enable turns on privileged mode command. configure terminal changes to configuration mode. This command is the first step to configuration router rip enables RIP. network 10.0.0.0/24 sets the RIP enable interface for the 10.0.0.0/24 network. exit exit write writes current configuration to configuration file.

Remarque : Dans les deux cas, la configuration est ajoutée aux lignes que nous avons précédemment ajoutées (/etc/quagga/zebra.conf et /etc/quagga/ripd.conf).
Enfin, reconnectez-vous au service zebra sur les deux routeurs et notez comment chacun d’eux a « appris » la route vers le réseau qui est derrière l’autre, et quel est le prochain saut pour atteindre ce réseau, en exécutant la commande show ip route :
# show ip route

Si vous souhaitez essayer différents protocoles ou configurations, vous voudrez peut-être consulter le site du projet Quagga pour plus de documentation.
Conclusion
Dans cet article, nous avons expliqué comment configurer un routage statique et dynamique en utilisant un ou plusieurs routeurs Linux. N’hésitez pas à ajouter autant de routeurs que vous le souhaitez et à expérimenter autant que vous le voulez. N’hésitez pas à nous contacter en utilisant le formulaire de contact ci-dessous si vous avez des commentaires ou des questions.