5. Rôle routeur

Dans cette section, on étudie la machine virtuelle qui joue le rôle de routeur entre le réseau d'hébergement et un réseau de conteneurs. Pour traiter les questions, il est nécessaire de mettre en œuvre une maquette avec un adressage indépendant de la liste de la section Plan d'adressage des réseaux d'hébergement et de conteneurs. Voici les choix effectués pour la maquette.

Tableau 3. Plan d'adressage des réseaux de la maquette

Réseau Numéro VLAN Adresses de passerelles Numéro interface tap
Hébergement
VLAN rouge
300 10.141.0.161/27
2001:678:3fc:12c::1/64
100
Services
VLAN vert
430 192.0.2.1/24
fda0:7a62:1ae::1/64
1

5.1. Configuration des interfaces du routeur

Une fois la machine virtuelle routeur lancée, les premières étapes consistent à lui attribuer un nouveau nom et à configurer les interfaces réseau pour joindre les hôtes voisins.

Q5.

Comment changer le nom de la machine virtuelle ?

Il faut éditer les deux fichiers /etc/hosts et /etc/hostname en remplaçant le nom de l'image maître vm0 par le nom voulu. Il est ensuite nécessaire de redémarrer pour que le nouveau nom soit pris en compte par tous les outils du système.

etu@vm0:~$ sudo sed -i 's/vm0/rtr/g' /etc/hosts
[sudo] Mot de passe de etu :
etu@vm0:~$ sudo sed -i 's/vm0/rtr/g' /etc/hostname
sudo: impossible de résoudre l'hôte vm0: Échec temporaire dans la résolution du nom
etu@vm0:~$ sudo reboot

Q6.

Comment appliquer les configurations réseau IPv4 et IPv6 à partir de l'unique interface du routeur ?

Consulter les pages de manuels du fichier de configuration système à l'aide de la commande man interfaces.

Il existe plusieurs possibilités pour configurer une interface réseau. Dans le contexte de ces manipulations, on utilise le fichier de configuration fourni par la distribution Debian GNU/Linux : /etc/network/interfaces.

La configuration de base fournie avec l'image maître suppose que l'interface obtienne un bail DHCP pour la partie IPv4 et une configuration automatique via SLAAC pour la partie IPv6. Cette configuration par défaut doit être éditée et remplacée. Il faut configurer trois interfaces.

  • L'interface principale doit être placée en mode manuel (manual). Elle doit être activée/désactivée au niveau de la couche liaison.

  • Une interface doit être créée pour le réseau d'hébergement avec le numéro de VLAN désigné dans le tableau de la section Plan d'adressage des réseaux d'hébergement et de conteneurs. Cette interface doit désigner les passerelles IPv4 et IPv6 de façon à joindre l'Internet.

  • Une interface doit être créée pour le réseau des conteneurs avec, là encore, le bon numéro de VLAN. Les adresses IPv4 et IPv6 de cette interface deviendront les passerelles du serveur et des conteneurs.

Voici une copie du fichier /etc/network/interfaces de la maquette.

# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

source /etc/network/interfaces.d/*

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
auto enp0s6
iface enp0s6 inet manual
        up ip link set dev $IFACE up
        down ip link set dev $IFACE down

auto enp0s6.300
iface enp0s6.300 inet static
        address 10.141.0.162/27
        gateway 10.141.0.161
        dns-nameserver 9.9.9.9

iface enp0s6.300 inet6 static
        address 2001:678:3fc:12c::2/64
        gateway 2001:678:3fc:12c::1

auto enp0s6.430
iface enp0s6.430 inet static
        address 192.0.2.1/24

iface enp0s6.430 inet6 static
        address fda0:7a62:1ae::1/64

Une fois le fichier de configuration en place, il est préférable de redémarrer la machine virtuelle de façon à vérifier que la configuration des interfaces est bien appliquée après chaque réinitialisation.

Q7.

Quels sont les tests de connectivité réalisables après application de la nouvelle configuration des interfaces réseau ?

Relever l'état des trois interfaces et procédez aux tests en respectant les couches de la modélisation.

La commande ip addr ls permet de relever l'état de la configuration pour chaque interface.

$ ip addr ls | grep state
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
2: enp0s6: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
3: enp0s6.300@enp0s6: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
4: enp0s6.430@enp0s6: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000

Sans la confirmation que la configuration du serveur de conteneurs est prête, c'est du côté hébergement et accès Internet qu'il faut orienter les tests. Classiquemt, on cherche à joindre la passerelle en premier puis l'Internet ensuite via des requêtes ICMP. Enfin, on effectue un test de couche application avec une requête DNS.

$ ping -q -c2 10.141.0.161
PING 10.141.0.161 (10.141.0.161) 56(84) bytes of data.

--- 10.141.0.161 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1002ms
rtt min/avg/max/mdev = 0.990/1.188/1.387/0.198 ms
$ ping -q -c2 9.9.9.9
PING 9.9.9.9 (9.9.9.9) 56(84) bytes of data.

--- 9.9.9.9 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1002ms
rtt min/avg/max/mdev = 12.218/12.227/12.237/0.009 ms
$ ping -q -c2 2001:678:3fc:12c::1
PING 2001:678:3fc:12c::1(2001:678:3fc:12c::1) 56 data bytes

--- 2001:678:3fc:12c::1 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1002ms
rtt min/avg/max/mdev = 1.023/1.164/1.306/0.141 ms
$ ping -q -c2 2620:fe::fe
PING 2620:fe::fe(2620:fe::fe) 56 data bytes

--- 2620:fe::fe ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1002ms
rtt min/avg/max/mdev = 39.999/40.391/40.784/0.392 ms
$ host quad9.net
quad9.net has address 216.21.3.77
quad9.net has IPv6 address 2620:0:871:9000::77
quad9.net mail is handled by 20 mx2.quad9.net.
quad9.net mail is handled by 100 keriomail.pch.net.
quad9.net mail is handled by 5 mx1.quad9.net.

5.2. Activation de la fonction routage

Sans modification de la configuration par défaut, un système GNU/Linux n'assure pas la fonction de routage du trafic d'une interface réseau à une autre.

L'activation du routage correspond à un réglage de paramètres du sous-système réseau du noyau Linux. L'outil qui permet de consulter et modifier les réglages de paramètre sur le noyau est appelé sysctl. Son fichier de configuration principal est /etc/sysctl.conf.

Q8.

Comment activer le routage dans le sous-système réseau du noyau Linuxe ?

Utiliser la commande sysctl pour effectuer des recherches et identifier les paramètres utiles. Par exemple : $ sudo sysctl -a -r ".*forward.*".

Le fichier /etc/sysctl.conf contient des commentaires qui guident facilement vers les bons paramètres.

Attention ! Il ne faut pas oublier d'appliquer les nouvelles valeurs des paramètres de configuration.

Voici un extrait du fichier /etc/sysctl.conf du routeur de la maquette après édition.

$ egrep -v '(^#|^$)' /etc/sysctl.conf
net.ipv4.conf.default.rp_filter=1
net.ipv4.conf.all.rp_filter=1
net.ipv4.ip_forward=1
net.ipv6.conf.all.forwarding=1
net.ipv4.conf.all.log_martians = 1

Voici une copie d'écran de l'application des nouveaux paramètres.

$ sudo sysctl --system
* Applying /usr/lib/sysctl.d/50-pid-max.conf ...
kernel.pid_max = 4194304
* Applying /etc/sysctl.d/99-sysctl.conf ...
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.all.rp_filter = 1
net.ipv4.ip_forward = 1
net.ipv6.conf.all.forwarding = 1
net.ipv4.conf.all.log_martians = 1
* Applying /usr/lib/sysctl.d/protect-links.conf ...
fs.protected_fifos = 1
fs.protected_hardlinks = 1
fs.protected_regular = 2
fs.protected_symlinks = 1
* Applying /etc/sysctl.conf ...
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.all.rp_filter = 1
net.ipv4.ip_forward = 1
net.ipv6.conf.all.forwarding = 1
net.ipv4.conf.all.log_martians = 1

Q9.

Quelles sont les conditions à réunir pour tester le fonctionnement du routage ?

Rechercher comment utiliser l'analyseur réseau tshark pour caractériser l'acheminement du trafic d'un réseau à l'autre.

Le plan d'adressage prévoit d'utiliser des préfixes ayant une portée locale pour les réseaux de conteneurs. Il n'est donc pas possible de passer par une requête ICMP pour caractériser l'accès aux réseaux distants. En effet, l'adresse source n'est pas reconnue par l'hôte distant et les routeurs de l'Internet ne disposent d'aucune solution pour joindre le réseau des conteneurs.

Voici un extrait de capture qui montre que le serveur de conteneur cherche à joindre un hôte sur l'Internet sans succès. Cette capture étant réalisée sur l'interface réseau côté hébergement, elle montre que le trafic est bien echeminé d'un réseau à l'autre.

$ tshark -i enp0s6.300
Capturing on 'enp0s6.300'
    1 0.000000000    192.0.2.2 → 9.9.9.9      DNS 81 Standard query 0xbdab A 1.debian.pool.ntp.org
    2 0.000056361    192.0.2.2 → 9.9.9.9      DNS 81 Standard query 0xab92 AAAA 1.debian.pool.ntp.org

5.3. Activation de la traduction d'adresses

Le résultat de la question ci-dessus montre que les hôtes situés dans le réseau des conteneurs ne peuvent pas joindre l'Internet puisque les préfixes réseau utilisés ont une portée limitée.

Q10.

Quels sont les paquets qui fournissent les outils de gestion de la traduction d'adresses ?

Rechercher les paquets relatifs au filtrage et à la gestion des règles de pare-feux.

Sur les systèmes GNU/Linux, le système de pare-feux comprend une partie "espace utilisateur" appelée iptables et une partie "noyau" appelée netfilter.

C'est la partie "espace utilisateur" qui nous intéresse ici.

$ aptitude search iptables
p   arno-iptables-firewall          - single- and multi-homed firewall script wi
p   golang-github-coreos-go-iptable - Go bindings for iptables utility
i   iptables                        - administration tools for packet filtering
p   iptables-converter              - convert iptables-commands from a file to i
p   iptables-converter-doc          - convert iptables-commands from a file to i
p   iptables-netflow-dkms           - iptables target which generates netflows
p   iptables-persistent             - boot-time loader for netfilter rules, ipta
p   libiptables-chainmgr-perl       - Perl extension for manipulating iptables p
p   libiptables-parse-perl          - Perl extension for parsing iptables firewa
p   python-iptables-doc             - documentation for the python-iptables libr
p   python3-iptables                - Python bindings for iptables (Python 3 int

On voit que le paquet iptables est déjà installé et qu'il ne manque que la gestion de la sauvegarde des règles de filtrage et traduction d'adresses.

$ sudo apt install iptables-persistent

Q11.

Quelles sont les règles à appliquer pour assurer une traduction des adresses sources en sortie sur le réseau hébergement ?

Rechercher dans les pages de manuel de la commande iptables.

C'est la cible MASQUERADE qui nous intéresse. Voici un exemple de règles de traduction des adresses sources pour la maquette.

$ sudo iptables -t nat -A POSTROUTING -o enp0s6.300 -j MASQUERADE
$ sudo sh -c "iptables-save >/etc/iptables/rules.v4"
$ sudo ip6tables -t nat -A POSTROUTING -o enp0s6.300 -j MASQUERADE
$ sudo sh -c "ip6tables-save >/etc/iptables/rules.v6"

Q12.

Comment caractériser le fonctionnement de la traduction d'adresses sources ?

Rechercher dans les pages de manuel de la commande iptables les options d'affichage du décompte du trafic traité.

Voici un exemple d'affichage pour le trafic IPv4 uniquement.

$ sudo iptables -vnL -t nat
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination
    8   598 MASQUERADE  all  --  *      enp0s6.300  0.0.0.0/0            0.0.0.0/0

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination

5.4. Activation de la configuration IPv6 automatique pour le réseau de conteneurs

Pour que les hôtes du réseau de conteneurs obtiennent automatiquement une configuration IPv6, il faut que le routeur assure les annonces auprès de ces voisins. Un moyen simple pour assurer la configuration SLAAC des hôtes voisins du routeur consiste à utiliser le paquet radvd.

On débute par l'installation de ce paquet.

$ sudo apt install radvd
...
Préparation du dépaquetage de .../radvd_1%3a2.17-2+b1_amd64.deb ...
Dépaquetage de radvd (1:2.17-2+b1) ...
Paramétrage de radvd (1:2.17-2+b1) ...
Job for radvd.service failed because the control process exited with error code.
See "systemctl status radvd.service" and "journalctl -xe" for details.
invoke-rc.d: initscript radvd, action "start" failed.
● radvd.service - Router advertisement daemon for IPv6
     Loaded: loaded (/lib/systemd/system/radvd.service; disabled; vendor preset: enabled)
     Active: failed (Result: exit-code) since Sun 2020-09-13 22:32:10 CEST; 17ms ago
       Docs: man:radvd(8)
    Process: 2814 ExecStartPre=/usr/sbin/radvd --logmethod stderr_clean --configtest (code=exited, status=1/FAILURE)

On voit que le lancement du service a échoué.

Q13.

Comment configurer le service radvd pour publier les annonces côté conteneurs ?

Rechercher les options utiles dans les pages de manuel du service : man radvd.conf.

Voici une copie du fichier de configuration /etc/radvd.conf de la maquette.

interface enp0s6.430
{
        AdvSendAdvert on;

        prefix fda0:7a62:1ae::/64
        {
                AdvOnLink on;
                AdvAutonomous on;
                AdvRouterAddr on;
        };

        RDNSS 2620:fe::fe
        {
        };
};

Attention ! Une fois le fichier créé, il ne faut pas oublier de redémarrer le service et de contrôler l'état de son fonctionnement.

$ sudo systemctl enable radvd
$ sudo systemctl restart radvd
$ systemctl status radvd
● radvd.service - Router advertisement daemon for IPv6
     Loaded: loaded (/lib/systemd/system/radvd.service; disabled; vendor preset: enabled)
     Active: active (running) since Sun 2020-09-13 22:39:34 CEST; 5s ago
       Docs: man:radvd(8)
    Process: 2890 ExecStartPre=/usr/sbin/radvd --logmethod stderr_clean --configtest (code=exited, status=0/SUCCESS)
    Process: 2891 ExecStart=/usr/sbin/radvd --logmethod stderr_clean (code=exited, status=0/SUCCESS)
   Main PID: 2892 (radvd)
      Tasks: 2 (limit: 1142)
     Memory: 1.3M
     CGroup: /system.slice/radvd.service
             ├─2892 /usr/sbin/radvd --logmethod stderr_clean
             └─2893 /usr/sbin/radvd --logmethod stderr_clean

sept. 13 22:39:34 rtr systemd[1]: Starting Router advertisement daemon for IPv6...
sept. 13 22:39:34 rtr radvd[2890]: config file, /etc/radvd.conf, syntax ok
sept. 13 22:39:34 rtr radvd[2891]: version 2.17 started
sept. 13 22:39:34 rtr systemd[1]: Started Router advertisement daemon for IPv6.

Enfin, le résultat doit se retrouver sur la configuration réseau de l'interface du serveur de conteneurs.

etu@srvr:~$ ip addr ls dev enp0s6
2: enp0s6: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether b0:ad:ca:fe:00:01 brd ff:ff:ff:ff:ff:ff
    inet 192.0.2.2/24 brd 192.0.2.255 scope global enp0s6
       valid_lft forever preferred_lft forever
    inet6 fda0:7a62:1ae:0:b2ad:caff:fefe:1/64 scope global dynamic mngtmpaddr
       valid_lft 86124sec preferred_lft 14124sec
    inet6 fe80::b2ad:caff:fefe:1/64 scope link
       valid_lft forever preferred_lft forever