Base documentaire GNU/Linux et développement

Fiches techniques pour la configuration de machines GNU/Linux, de réseau et de développement logiciel

Outils pour utilisateurs

Outils du site


administration-systemes:reseau:routage

Routage IP

Activation du routage

Par défaut sur CentOS le routage de paquets est désactivé. Il est contrôlé au niveau du noyau. Pour consulter le statut du routage, on utilise sysctl :

sysctl net.ipv4.ip_forward

Si le résultat est « 1 », le routage est actif, l’autre cas est une sortie à « 0 ». Il est à noter que les éléments contrôlés par sysctl sont simplement les éléments du système de fichier virtuel monté dans /proc/sys.

Pour activer le routage, il suffit de définir ce paramètre à « 1 », ou « 0 » pour le désactiver.

sysctl -w net.ipv4.ip_forward=1

Pour une modification persistante, on modifie le fichier /etc/sysctl.conf en ajoutant la ligne suivante :

net.ipv4.ip_forward = 1

Translation d’adresses pour un sous-réseau

Concernant le réseau des machines virtuelles gérées par virt, le routeur est un intermédiaire entre le sous-réseau et l’hôte. L’hôte et les machines hors de ce sous-réseau n’ont pas nécessairement besoin de connaître ce réseau pour accéder à l’extérieur. Il faut procéder à de la translation d’adresses pour permettre aux machines du sous-réseau de pouvoir recevoir les réponses aux requêtes sans ajouter de route supplémentaire sur des routeurs hors de ce sous-réseau, notamment l’hôte exécutant l’hyperviseur.

Avec IPTables

Ce processus est géré facilement à l’aide d’IPTables (interface à Netfilter dans le noyau Linux), sur la table nat. On réalise donc l’opération de translation pour les adresses IPv4 provenant du sous-réseau 192.168.123.0/24 et sortant par l’interface eth0 (à adapter). La cible est MASQUERADE.

iptables -t nat -A POSTROUTING -s 192.168.123.0/24 -o eth0 -j MASQUERADE

La sauvegarde des règles IPTables est indiquée sur la page dédiée.

Avec firewalld

Par utilisation des zones pré-définies

L’utilisation de firewalld est davantage recommandé car beaucoup plus souple et plus simple à administrer. La page dédiée à firewalld explique les concepts principaux.

Dans firewalld, tout est prévu pour correspondre au cas d’un routeur. Deux zones existent : internal et external et permettent de régler la translation automatiquement. En effet, la translation est active par défaut dans la zone external :

[root@orion ~]# firewall-cmd --zone=external --list-all
external (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0
  sources: 
  services: ssh
  ports: 
  protocols: 
  masquerade: yes
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules:

Les deux interfaces doivent changer de zone pour se conformer à la topologie : eth0 est l’interface connecté à l’extérieur par virbrext, et eth1 est l’interface connectée au sous-réseau via virbrint.

[root@orion ~]# firewall-cmd --zone=external --change-interface=eth0
[root@orion ~]# firewall-cmd --zone=internal --change-interface=eth1
[root@orion ~]# firewall-cmd --get-active-zone
internal
  interfaces: eth1
external
  interfaces: eth0

Ajouter dans une zone existante

La translation d’adresses est spécifique à la zone de l’interface et peut s’ajouter avec :

[root@orion ~]# firewall-cmd --zone=external --add-masquerade --permanent
[root@orion ~]# firewall-cmd --reload

La commande ip

La commande ip permet de contrôler finement les routes de réseau sur une machine routeur. Une fiche d’aide est proposé par RedHat : “ip COMMAND CHEAT SHEET”.

Requêtes de base

  • Pour identifier les adresses IP des interfaces :
# Sans restriction
ip addr

# Uniquement pour le périphérique eth0
ip adrr show dev eth0
  • Pour afficher l’état des interfaces réseau (statistiques avec -s :
# Sans restriction
ip link

# Uniquement pour un périphérique particulier
ip link show dev eth0
  • Pour afficher la table de routage :
ip route
  • Pour obtenir la table ARP pour IPv4 :
# Pour toutes les interfaces
ip neigh

# Pour une interface spécifique
ip neigh show dev eth0

Modifier les adresses et propriétés des interfaces réseau

  • Définir l’adresse IP d’une interface :
ip addr add 192.168.123.2/24 dev eth0
  • Supprimer une adresse IP d’une interface :
ip addr del 192.168.123.2/24 dev eth0
  • Activer ou désactiver une interface :
ip addr set eth0 up
ip addr set eth0 down

Modifier la table de routage

  • Ajouter une route
# Pour un réseau, vers une passerelle
ip route add 192.168.123.0/24 dev eth0

# Pour un réseau, vers une passerelle
ip route add 192.168.123.0/24 via 192.168.123.1 dev eth0

# Pour une route par défaut
ip route add default via 192.168.123.1 dev eth0
  • Supprimer une route
ip route del 192.168.123.2/24 dev eth0
  • Remplacer une route
ip route replace 192.168.123.2/24 dev eth0
  • Afficher la route empruntée par les paquets provenant d’une certaine adresse
ip route get 172.18.0.2

Routage basé sur l’adresse source du paquet

Le routage par le noyau Linux permet une grande précision de filtrage. Une fonctionnalité moins connue mais réellement intéressante et la possibilité de router des paquets en se basant sur leur origine. Dans le cadre de la mise en place de la topologie réseau décrite dans la page dédiée à la gestion d’un petit parc de machines, c’est indispensable. En effet, les paquets qui sont à destination du sous-réseau 192.168.123.0/24 et transitent, ou proviennent de la machine hôte sont dirigés directement vers les machines du sous-réseau via le commutateur virtuel virbrint. Le comportement idéal serait que seuls les paquets provenant et à destination des machines du sous-réseau soient routés via cette interface, pas les paquets émis depuis la machine hôte, qui eux doivent transiter par le routeur orion.

Création d’une nouvelle table de routage

Le noyau peut gérer plusieurs tables de routage, bien qu’une seule ne soit présentée par la commande route, la table appelée main. Les différents tables qui existent sont configurées dans le fichier /etc/iproute2/rt_tables. Il est possible de consulter les différentes règles qui orientent les paquets vers ces tables avec la commande ip rule.

Ce qui est décrit ici n’est pas persistent entre les redémarrages. Il est préférable de ne pas désactiver NetworkManager, qui simplifie la vie dans bien des situations : on peut le configurer pour qu’il se souvienne de ces règles.

[root@hote ~]# ip rule list
0:	from all lookup local 
32766:	from all lookup main 
32767:	from all lookup default 

Nous voulons ajouter une nouvelle table pour qu’une nouvelle ligne s’ajoute à cette sortie :

32764:	from 192.168.123.0/24 lookup interne 

Cette entrée a un numéro inférieur aux tables main et default, la règle sera d’abord étudiée, et si elle est fausse, ira regarder les autres. Concrètement, il s’agit de dire que les paquets provenant de 192.168.123.0/24 sont routés par règles renseignées dans la table interne.

Pour créer une nouvelle table, il est nécessaire de modifier le fichier /etc/iproute2/rt_tables. Ce fichier contient l’ensemble des tables de routage désignées par un numéro et par un nom. Les numéros sont affectés automatiquement par ordre décroissant à partir de 255. La table interne est ajoutée, portant le numéro 100, dans ce fichier :

# reserved values
255	local
254	main
253	default
0	unspec
# local
100	interne

Il est maintenant possible d’ajouter la règle indiquant que les paquets provenant du sous-réseau 192.168.123.0/24 doivent être orientés vers la table de routage interne :

ip rule add from 192.168.123.0/24 table interne

Il est possible de consulter les différentes tables grâce à ip rule list.

# ip rule list                                   
0:	from all lookup local 
32765:	from 192.168.123.0/24 lookup interne 
32766:	from all lookup main 
32767:	from all lookup default

Ne reste qu’à ajouter une règle dans cette table indiquant que les paquets à destination du sous-réseau 192.168.123.0/24 doivent être routés via l’interface virbrint.

ip route add 192.168.123.0/24 dev virbrint table interne

Il est possible de consulter cette table de routage en une commande :

# ip route show table interne
192.168.123.0/24 dev virbrint scope link 

Communiquer avec le sous-réseau via le routeur

À ce stade, la communication avec les machines du sous-réseau est toujours possible. En effet, une règle de la table main a été ajoutée automatiquement par libvirt : elle permet le routage direct des paquets à destination du sous-réseau via l’interface virbrint. Il faut commencer par la supprimer :

ip route del 192.168.123.0/24 dev virbrint table main

Enfin, on peut ajouter la règle de routage spécifiant que les paquets à destination du sous-réseau doivent transiter par le routeur orion :

ip route add 192.168.123.0/24 via 172.18.0.2

Test final de fonctionnement

On peut tester que les paquets transitent bien par le routeur avec le programme traceroute :

# traceroute 192.168.123.10
traceroute to 192.168.123.10 (192.168.123.10), 30 hops max, 60 byte packets
 1  172.18.0.2 (172.18.0.2)  0.517 ms  0.488 ms  0.449 ms
 2  192.168.123.10 (192.168.123.10)  1.252 ms !X  1.230 ms !X  1.194 ms !X

Les paquets à destination du sous-réseau transitent bien par le routeur orion, la topologie décrite est enfin correctement fonctionnelle.

administration-systemes/reseau/routage.txt · Dernière modification: 2018/04/08 08:46 par Guillaume Bernard