7. Routeur Spoke (vert)

7.1. Configuration des interfaces du routeur

Une fois la machine virtuelle serveur de conteneurs lancée, les premières étapes consistent à lui attribuer un nouveau nom et à configurer les interfaces réseau pour joindre le routeur voisin et l'Internet.

Q30.

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/vert/g' /etc/hosts
etu@vm0:~$ sudo sed -i 's/vm0/vert/g' /etc/hostname
sudo: impossible de résoudre l'hôte vm0: Échec temporaire dans la résolution du nom
etu@vm0:~$ sudo reboot

Q31.

Comment appliquer la configuration réseau IPv4 et IPv6 de l'interface du serveur ?

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.

La configuration par défaut doit être éditée et remplacée par une configuration manuelle pour l'interface enp0s6 et pour le VLAN orange. Pour la supervision dans le VLAN violet, l'adresse IPv6 de lien locale est fournie dans le tableau du plan d'adressage.

En attendant que la configuration du routeur bleu soit prête, on ajoute temporairement une interface enp0s6.217 avec une configuration automatique. Ainsi, il est possible d'installer et de configurer des services en parallèle. Cette interface doit être désactivée dès que tous les outils sont en place.

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

# ---------- VLAN VIOLET ----------
auto enp0s6.430
iface enp0s6.430 inet6 static
        address fe80:1ae::2/64

# ---------- VLAN ORANGE ----------
auto enp0s6.431
iface enp0s6.431 inet manual
        up ip link set dev $IFACE up
        down ip link set dev $IFACE down

# ---------- TEMPORAIRE -----------
auto enp0s6.217
iface enp0s6.217 inet dhcp

7.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.

Q32.

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

7.3. Activation du protocole PPP dans le VLAN orange

Le routeur vert utilise un démon pppd sur le VLAN Data pour établir une session PPP avec le routeur bleu. À la différence de ce dernier, il n'est pas à l'initiative du dialogue PPPoE mais il doit être capable de gérer l'encapsulation des trames PPP sur un réseau local Ethernet.

Q33.

Quel paquet fournit le démon de gestion des sessions du protocole PPP sur le routeur vert ?

Rechercher dans le catalogue des paquets, la référence ppp.

$ aptitude search ^ppp
i   ppp               - Point-to-Point Protocol (PPP) - daemon
p   ppp-dev           - Point-to-Point Protocol (PPP) - development fil
p   ppp-gatekeeper    - PPP manager for handling balanced, redundant an
p   pppoe             - PPP over Ethernet driver
p   pppoeconf         - configures PPPoE/ADSL connections

Le résultat de la commande aptitude show ppp montre que c'est bien ce paquet qui répond au besoin.

Q34.

Comment utiliser l'encapsulation des trames PPP dans Ethernet à partir du démon pppd fourni avec le paquet ppp ?

Rechercher dans le répertoire de documentation du paquet ppp.

Dans le répertoire /usr/share/doc/ppp/, on trouve le fichier README.pppoe qui indique que l'appel au module rp-pppoe.so permet d'encapsuler des trames PPP sur un réseau local Ethernet.

Toujours à partir du même répertoire, on trouve dans la liste des fichiers d'exemples de configuration un modèle adapté à notre contexte : peers-pppoe.

Q35.

Dans quel fichier sont stockés les paramètres d'identité et d'authentification utilisés par le protocole CHAP ?

Consulter les pages de manuels du démon pppd à la section AUTHENTICATION.

C'est le fichier /etc/ppp/chap-secrets qui contient les couples login/password utilisés lors de l'authentification.

Voici un exemple du contenu de ce fichier. Le nom du client ainsi que son mot de passe secret doivent être identiques à chaque extrémité de la session PPP.

# Secrets for authentication using CHAP
# client        server  secret                  IP addresses
"green"         *               "5p0k3"                 *

Q36.

Quelles sont les options de configuration du démon pppd à placer dans le fichier /etc/ppp/peers/pppoe-provider pour assurer l'établissement de la session PPP entre les routeurs ?

Utiliser le fichier exemple PPPoE fourni avec la documentation du paquet ppp.

Voici une copie du fichier /etc/ppp/peers/pppoe-provider avec les options correspondant au contexte de la maquette du routeur vert.

# There should be a matching entry with the password in /etc/ppp/chap-secrets.
user "green"

# Load the PPPoE plugin.
plugin rp-pppoe.so

# Ethernet interface to which the modem is connected.
enp0s6.431

# Assumes that your IP address is allocated dynamically by the ISP.
noipdefault
# Try to get the name server addresses from the ISP.
usepeerdns
# Use this connection as the default route.
defaultroute

# Makes pppd "dial again" when the connection is lost.
persist

# Do not ask the remote to authenticate.
noauth

debug
+ipv6

Q37.

Comment lancer le démon pppd pour qu'il prenne en compte les paramètres définis dans le fichier complété à la question précédente ?

Consulter les pages de manuels du démon pppd.

C'est l'option file qui permet de désigner le fichier de configuration à utiliser. Voici une copie d'écran du lancement de pppd.

$ sudo pppd file /etc/ppp/peers/pppoe-provider

Q38.

Quels sont les noms des deux sous-couches du protocole PPP qui apparaissent dans les journaux systèmes ? Quels sont les rôles respectifs de ces deux sous-couches ?

Consulter la page Point-to-Point Protocol.

La consultation des journaux système lors du dialogue PPP fait apparaître des informations suivantes.

pppd[2272]: Plugin rp-pppoe.so loaded.
pppd[2273]: pppd 2.4.7 started by etu, uid 0
pppd[2273]: Send PPPOE Discovery V1T1 PADI session 0x0 length 4
pppd[2273]:  dst ff:ff:ff:ff:ff:ff  src b0:ad:ca:fe:00:65
pppd[2273]:  [service-name]
pppd[2273]: Recv PPPOE Discovery V1T1 PADO session 0x0 length 36
pppd[2273]:  dst b0:ad:ca:fe:00:65  src b0:ad:ca:fe:00:64
pppd[2273]:  [AC-name BRAS] [service-name] [AC-cookie  f9 fc 4d 12 f1 13 03 f3 bd e8 34 7b 83 d5 2e bf 5b 0b 00 00]
pppd[2273]: Send PPPOE Discovery V1T1 PADR session 0x0 length 28
pppd[2273]:  dst b0:ad:ca:fe:00:64  src b0:ad:ca:fe:00:65
pppd[2273]:  [service-name] [AC-cookie  f9 fc 4d 12 f1 13 03 f3 bd e8 34 7b 83 d5 2e bf 5b 0b 00 00]
pppd[2273]: Recv PPPOE Discovery V1T1 PADS session 0x1 length 4
pppd[2273]:  dst b0:ad:ca:fe:00:65  src b0:ad:ca:fe:00:64
pppd[2273]:  [service-name]
pppd[2273]: PADS: Service-Name: ''
pppd[2273]: PPP session is 1
pppd[2273]: Connected to b0:ad:ca:fe:00:64 via interface enp0s6.431
pppd[2273]: using channel 19
pppd[2273]: Using interface ppp0
pppd[2273]: Connect: ppp0 <--> enp0s6.431
pppd[2273]: sent [LCP ConfReq id=0x1 <mru 1492> <magic 0xc8ff53a8>]
pppd[2273]: rcvd [LCP ConfReq id=0x1 <mru 1492> <auth chap MD5> <magic 0x11d42bb4>]
pppd[2273]: sent [LCP ConfAck id=0x1 <mru 1492> <auth chap MD5> <magic 0x11d42bb4>]
pppd[2273]: sent [LCP ConfReq id=0x1 <mru 1492> <magic 0xc8ff53a8>]
pppd[2273]: rcvd [LCP ConfAck id=0x1 <mru 1492> <magic 0xc8ff53a8>]
pppd[2273]: sent [LCP EchoReq id=0x0 magic=0xc8ff53a8]
pppd[2273]: rcvd [LCP EchoReq id=0x0 magic=0x11d42bb4]
pppd[2273]: sent [LCP EchoRep id=0x0 magic=0xc8ff53a8]
pppd[2273]: rcvd [CHAP Challenge id=0xde <208dcd62a1589d928f94e384cdb43910eb9b03bf9b0ac0>, name = "bleu"]
pppd[2273]: sent [CHAP Response id=0xde <32bb85b4fa53e24b73a4137db04278e6>, name = "green"]
pppd[2273]: rcvd [LCP EchoRep id=0x0 magic=0x11d42bb4]
pppd[2273]: rcvd [CHAP Success id=0xde "Access granted"]
pppd[2273]: CHAP authentication succeeded: Access granted
pppd[2273]: CHAP authentication succeeded
pppd[2273]: peer from calling number B0:AD:CA:FE:00:64 authorized
pppd[2273]: sent [IPCP ConfReq id=0x1 <addr 0.0.0.0> <ms-dns1 0.0.0.0> <ms-dns2 0.0.0.0>]
pppd[2273]: sent [IPV6CP ConfReq id=0x1 <addr fe80::adfa:a20d:dbba:3553>]
pppd[2273]: rcvd [CCP ConfReq id=0x1 <deflate 15> <deflate(old#) 15> <bsd v1 15>]
pppd[2273]: sent [CCP ConfReq id=0x1]
pppd[2273]: sent [CCP ConfRej id=0x1 <deflate 15> <deflate(old#) 15> <bsd v1 15>]
pppd[2273]: rcvd [IPCP ConfReq id=0x1 <compress VJ 0f 01> <addr 10.4.31.1>]
pppd[2273]: sent [IPCP ConfRej id=0x1 <compress VJ 0f 01>]
pppd[2273]: rcvd [IPV6CP ConfReq id=0x1 <addr fe80::f558:469f:1034:fd29>]
pppd[2273]: sent [IPV6CP ConfAck id=0x1 <addr fe80::f558:469f:1034:fd29>]
pppd[2273]: rcvd [IPCP ConfNak id=0x1 <addr 10.4.31.2> <ms-dns1 172.16.0.2> <ms-dns2 172.16.0.2>]
pppd[2273]: sent [IPCP ConfReq id=0x2 <addr 10.4.31.2> <ms-dns1 172.16.0.2> <ms-dns2 172.16.0.2>]
pppd[2273]: rcvd [IPV6CP ConfAck id=0x1 <addr fe80::adfa:a20d:dbba:3553>]
pppd[2273]: local  LL address fe80::adfa:a20d:dbba:3553
pppd[2273]: remote LL address fe80::f558:469f:1034:fd29
pppd[2273]: Script /etc/ppp/ipv6-up started (pid 2280)
pppd[2273]: rcvd [CCP ConfAck id=0x1]
pppd[2273]: rcvd [CCP ConfReq id=0x2]
pppd[2273]: sent [CCP ConfAck id=0x2]
pppd[2273]: rcvd [IPCP ConfReq id=0x2 <addr 10.4.31.1>]
pppd[2273]: sent [IPCP ConfAck id=0x2 <addr 10.4.31.1>]
pppd[2273]: rcvd [IPCP ConfAck id=0x2 <addr 10.4.31.2> <ms-dns1 172.16.0.2> <ms-dns2 172.16.0.2>]
pppd[2273]: not replacing default route to enp0s6.217 [172.16.99.1]
pppd[2273]: local  IP address 10.4.31.2
pppd[2273]: remote IP address 10.4.31.1
pppd[2273]: primary   DNS address 172.16.0.2
pppd[2273]: secondary DNS address 172.16.0.2
pppd[2273]: Script /etc/ppp/ip-up started (pid 2282)
pppd[2273]: Script /etc/ppp/ipv6-up finished (pid 2280), status = 0x0
pppd[2273]: Script /etc/ppp/ip-up finished (pid 2282), status = 0x0

Q39.

Quels sont les en-têtes du dialogue qui identifient les requêtes (émises|reçues), les rejets et les acquittements ?

Consulter les journaux système contenant les traces d'une connexion PPP.

La copie d'écran donnée ci-dessus fait apparaître les directives Conf* pour chaque paramètre négocié.

  • ConfReq indique une requête.

  • ConfAck indique un acquittement.

  • ConfNak indique un rejet.

Q40.

Quelles sont les modifications à apporter au fichier système de configuration des interfaces réseau pour ouvrir la session PPP à chaque réinitialisation système ?

Consulter les pages de manuel du fichier /etc/network/interfaces : man interfaces.

Voici une copie du fichier modifié dans le contexte 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

# ---------- VLAN VIOLET ----------
auto enp0s6.430
iface enp0s6.430 inet6 static
        address fe80:1ae::2/64

# ---------- VLAN ORANGE ----------
auto enp0s6.431
iface enp0s6.431 inet manual
        up ip link set dev $IFACE up
        down ip link set dev $IFACE down

# ---------- PPPoE ---------------
auto pppoe-provider
iface pppoe-provider inet ppp
        pre-up ifup enp0s6.431
        provider pppoe-provider

# ---------- TEMPORAIRE -----------
#auto enp0s6.217
#iface enp0s6.217 inet dhcp

7.4. Activation du commutateur virtuel asw-host

Dans le scénario étudié, les services sont hébergés dans un réseau de conteneurs propre au routeur vert. La mise en œuvre de cette configuration passe par l'installation d'un commutateur virtuel appelé asw-host. On utilise Open vSwitch pour configurer ce commutateur.

Q41.

Quel est le paquet à installer pour pouvoir ajouter un commutateur virtuel au routeur vert ?

Rechercher le mot clé openvswitch dans la liste des paquets.

Voici un exemple de recherche.

$ sudo aptitude search ^openvswitch
p   openvswitch-common           - Open vSwitch common components
p   openvswitch-dbg              - Debug symbols for Open vSwitch packages
p   openvswitch-dev              - Open vSwitch development package
p   openvswitch-ipsec            - Open vSwitch IPsec tunneling support
p   openvswitch-pki              - Open vSwitch public key infrastructure dependency package
p   openvswitch-switch           - Open vSwitch switch implementations
p   openvswitch-switch-dpdk      - DPDK enabled Open vSwitch switch implementation
v   openvswitch-test             -
p   openvswitch-testcontroller   - Simple controller for testing OpenFlow setups
p   openvswitch-vtep             - Open vSwitch VTEP utilities

C'est le paquet openvswitch-switch qui nous intéresse.

$ sudo apt install openvswitch-switch

Q42.

Quel est le fichier de documentation qui fournit les directives de configuration d'un commutateur intégré au fichier système /etc/network/interfaces ?

Rechercher dans la liste des fichiers des paquets installés à la question précédente.

Voici un exemple de recherche.

$ dpkg -L openvswitch-switch | grep README
/usr/share/doc/openvswitch-switch/README.Debian.gz

Q43.

Quelles sont les modiifications à apporter au fichier /etc/network/interfaces pour configurer le commutateur asw-host ?

Voici une copie du fichier de configuration réseau système dans le contexte 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

# ---------- VLAN VIOLET ----------
auto enp0s6.430
iface enp0s6.430 inet6 static
        address fe80:1ae::2/64

# ---------- VLAN ORANGE ----------
auto enp0s6.431
iface enp0s6.431 inet manual
        up ip link set dev $IFACE up
        down ip link set dev $IFACE down

# ---------- PPPoE ----------------
auto pppoe-provider
iface pppoe-provider inet ppp
        pre-up ifup enp0s6.431
        provider pppoe-provider

#auto enp0s6.217
#iface enp0s6.217 inet dhcp

# ---------- VLAN VERT ------------
allow-ovs asw-host
iface asw-host inet manual
        ovs_type OVSBridge
        ovs_ports sw-vlan40
        up ip link set dev $IFACE up
        down ip link set dev $IFACE down

allow-asw-host sw-vlan40
iface sw-vlan40 inet static
        ovs_type OVSBridge
        ovs_bridge asw-host
        ovs_options asw-host 40
        address 203.0.113.1/24

iface sw-vlan40 inet6 static
        ovs_type OVSBridge
        ovs_bridge asw-host
        ovs_options asw-host 40
        address fda0:7a62:28::1/64

7.5. 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é.

Q44.

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 sw-vlan40
{
        AdvSendAdvert on;

        prefix fda0:7a62:28::/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.

7.6. Ajout des routes par défaut vers le réseau opérateur

Pour joindre l'Internet situé au delà du routeur bleu, il est nécessaire d'ajouter une route par défaut pour chaque protocole de la couche réseau : IPv4 et IPv6.

Attention ! Les tests de connectivité vers l'Internet supposent que le routeur bleu soit fonctionnel.

Q45.

Comment ajouter manuellement les routes par défaut IPv4 et IPv6 vers le routeur bleu ?

Consulter les pages de manuel sur le routage avec la commande : man ip-route.

Sachant que le site distant est raccordé via une liaison point à point unique, on choisit de désigner la destination par l'interface de la liaison.

$ sudo ip route add default dev ppp0
$ sudo ip -6 route add default dev ppp0

Q46.

Quels sont les tests de connectivité qui permettent valider la communication vers l'Internet en passant par le routeur bleu ?

Au niveau de la couche réseau, on lance les requêtes ICMP classques.

Attention ! Les deux exemples de tests ci-dessous prennent les conteneurs comme point de départ. L'idée est de parcourir la chaîne de communication la plus longue. Si les conteneurs ne sont pas disponibles, il est tout à possible de prendre le routeur vert comme origine.

Voici un exemple de test pour IPv4.

$ for i in {0..2}; do lxc exec container$i -- ping -q -c2 9.9.9.9; done

On change l'adresse de destination IPv6.

$ for i in {0..2}; do lxc exec container$i -- ping -q -c2 2620:fe::fe; done

Q47.

Comment appliquer ces routes statiques dans la configuration système pour qu'elles soient activées à chaque établissement de session PPP ?

Il faut parcourir l'arborescence du répertoire /etc/ppp/ pour repérer les scripts exécutés lors de l'ouverture de session. Créer un script pour chaque protocole de couche réseau qui ajoute la route statique voulue.

  • Pour IPv4, le répertoire est /etc/ppp/ip-up.d/. Voici une copie du script exécutable staticroute.

    #!/bin/sh
    
    if [ -z "${CONNECT_TIME}" ]; then
            ip route add default dev ${PPP_IFACE}
    fi
  • Pour IPv6, le répertoire est /etc/ppp/ipv6-up.d/. Voici une copie du script exécutable staticroute.

    #!/bin/sh
    
    if [ -z "${CONNECT_TIME}" ]; then
            ip -6 route add default dev ${PPP_IFACE}
    fi

7.7. Installation du gestionnaire de conteneurs LXD

Sur le routeur vert, la gestion des conteneurs est confiée à LXD. Pour des raisons de rapidité de mise en œuvre, on choisit de passer par le gestionnaire de paquets snapd pour l'installation des outils.

Q48.

Comment installer le gestionnaire de paquets snap sur une distribution Debian GNU/Linux ?

Effectuer une recherche dans les paquets fournis via APT.

Il existe tout simplement un paquet appelé snapd.

$ sudo apt install snapd

Q49.

Comment installer le gestionnaire de conteneurs LXD ?

Rechercher dans la liste des snaps.

Le snap s'appelle tout simplement lxd.

$ sudo snap install lxd
2020-09-21T18:12:31+02:00 INFO Waiting for automatic snapd restart...
Warning: /snap/bin was not found in your $PATH. If you've not restarted your session since you
         installed snapd, try doing that. Please see https://forum.snapcraft.io/t/9469 for more
         details.

lxd 4.6 from Canonical✓ installed

On peut lister les snaps installés.

$ snap list
Name    Version   Rev    Tracking       Publisher   Notes
core18  20200724  1885   latest/stable  canonical✓  base
lxd     4.6       17320  latest/stable  canonical✓  -
snapd   2.46.1    9279   latest/stable  canonical✓  snapd

Q50.

Comment faire pour que l'utilisateur normal etu ait la capacité à gérer les conteneurs ?

Rechercher le nom du groupe système correspondant à l'utilisation des outils LXD.

Il faut que l'utilisteur normal appartienne au groupe système lxd pour qu'il est tous les droits sur la gestion des conteneurs.

$ sudo adduser etu lxd

Attention ! il faut se déconnecter/reconnecter pour bénéficier de la nouvelle attribution de groupe. On peut utiliser la commande groups pour vérifier le résultats.

$ groups
etu adm cdrom floppy sudo audio dip video plugdev staff netdev lxd

7.8. Configuration du gestionnaire de conteneurs LXD

Q51.

Quelle est l'instruction de configuration initiale du gestionnaire LXD ?

Utiliser l'aide de la commande lxd.

C'est l'instruction lxd init qui nous intéresse.

Voici une copie d'écran de son exécution.

$ lxd init
Would you like to use LXD clustering? (yes/no) [default=no]:
Do you want to configure a new storage pool? (yes/no) [default=yes]:
Name of the new storage pool [default=default]:
Name of the storage backend to use (btrfs, dir, lvm, ceph) [default=btrfs]:
Create a new BTRFS pool? (yes/no) [default=yes]:
Would you like to use an existing empty disk or partition? (yes/no) [default=no]:
Size in GB of the new loop device (1GB minimum) [default=13GB]:
Would you like to connect to a MAAS server? (yes/no) [default=no]:
Would you like to create a new local network bridge? (yes/no) [default=yes]: no
Would you like to configure LXD to use an existing bridge or host interface? (yes/no) [default=no]: yes
Name of the existing bridge or host interface: sw-vlan40
Would you like LXD to be available over the network? (yes/no) [default=no]:
Would you like stale cached images to be updated automatically? (yes/no) [default=yes]
Would you like a YAML "lxd init" preseed to be printed? (yes/no) [default=no]: yes
config: {}
networks: []
storage_pools:
- config:
    size: 13GB
  description: ""
  name: default
  driver: btrfs
profiles:
- config: {}
  description: ""
  devices:
    eth0:
      name: eth0
      nictype: macvlan
      parent: sw-vlan40
      type: nic
    root:
      path: /
      pool: default
      type: disk
  name: default
cluster: null

Q52.

Comment changer le type de raccordement défini par le paramètre nictype de macvlan à bridged ?

Rechercher dans les options d'édition des paramètres du profil avec la commande lxc.

Il faut suivre les champs du fichier yaml de description du profil.

$ lxc profile device set default eth0 nictype bridged
$ lxc profile device get default eth0 nictype
bridged

Q53.

Quelle est l'instruction qui permet d'afficher le profil par défaut des conteneur ?

Rechercher dans les options de la commande lxc.

Voici un exemple d'exécution.

$ lxc profile show default
config: {}
description: Default LXD profile
devices:
  eth0:
    name: eth0
    nictype: bridged
    parent: sw-vlan40
    type: nic
  root:
    path: /
    pool: default
    type: disk
name: default
used_by: []

Q54.

Quelle est l'instruction de lancement d'un conteneur ?

Rechercher dans les options de la commande lxc.

Tester son exécution avec un conteneur de type debian/bullseye.

Voici un exemple d'exécution.

$ lxc launch images:debian/bullseye container0
Creating container0
Starting container0
$ lxc launch images:debian/bullseye container1
Starting container1
$ lxc launch images:debian/bullseye container2
Starting container2
$ lxc ls
+------------+---------+------+------------------------------------------+-----------+-----------+
|    NAME    |  STATE  | IPV4 |                   IPV6                   |   TYPE    | SNAPSHOTS |
+------------+---------+------+------------------------------------------+-----------+-----------+
| container0 | RUNNING |      | fda0:7a62:28:0:216:3eff:feda:e1a (eth0)  | CONTAINER | 0         |
+------------+---------+------+------------------------------------------+-----------+-----------+
| container1 | RUNNING |      | fda0:7a62:28:0:216:3eff:fec4:d325 (eth0) | CONTAINER | 0         |
+------------+---------+------+------------------------------------------+-----------+-----------+
| container2 | RUNNING |      | fda0:7a62:28:0:216:3eff:fe66:86fb (eth0) | CONTAINER | 0         |
+------------+---------+------+------------------------------------------+-----------+-----------+

Q55.

Comment appliquer une configuration IPv4 statique à chaque conteneur ?

Identifier le fichier de configuration système et modifier ce fichier pour chaque conteneur

En mode “manuel“, on édite directement le fichier /etc/network/interfaces dans chacun des trois conteneurs avec une commande comme celle-ci :

$ lxc exec container0 -- vim /etc/network/interfaces

pour ce qui est du resolver DNS qui est identique dans chaque conteneur, on peut utiliser une boucle.

$ for i in {0..2}; do lxc exec container$i -- sh -c "echo nameserver 9.9.9.9 > /etc/resolv.conf"; done

Une fois la configuration complétée, on redémarre les conteneurs pour vérifier que tous les paramètres ont bien été appliqués.

$ for i in {0..2}; do lxc restart container$i; done

Enfin, on peut relever le résultat avec la commande lxc ls.

$ lxc ls
+------------+---------+---------------------+------------------------------------------+-----------+-----------+
|    NAME    |  STATE  |        IPV4         |                   IPV6                   |   TYPE    | SNAPSHOTS |
+------------+---------+---------------------+------------------------------------------+-----------+-----------+
| container0 | RUNNING | 203.0.113.10 (eth0) | fda0:7a62:28:0:216:3eff:feda:e1a (eth0)  | CONTAINER | 0         |
+------------+---------+---------------------+------------------------------------------+-----------+-----------+
| container1 | RUNNING | 203.0.113.11 (eth0) | fda0:7a62:28:0:216:3eff:fec4:d325 (eth0) | CONTAINER | 0         |
+------------+---------+---------------------+------------------------------------------+-----------+-----------+
| container2 | RUNNING | 203.0.113.12 (eth0) | fda0:7a62:28:0:216:3eff:fe66:86fb (eth0) | CONTAINER | 0         |
+------------+---------+---------------------+------------------------------------------+-----------+-----------+