3. Préparer les systèmes pour le routage IPv4 et IPv6

Les manipulations de ce support s'appuient sur la documentation du projet : FRRouting User Guide

La première étape consiste à installer les outils sur les trois routeurs, à appliquer une configuration commune et à mettre en place la topologie physique.

  1. Si on respecte la topologie physique présentée dans la section précédente, chaque routeur virtuel est raccordé sur un port de commutateur en mode trunk. Il est donc nécessaire de définir une sous-interface réseau appartenant à un VLAN avec adressage automatique pour réaliser les opérations suivantes.

    Voici un exemple de fichier /etc/network/interfaces avec une définition d'interface temporaire qui permet d'installer des paquets et de préparer la suite de la configuration.

    # 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 enp0s1
    iface enp0s1 inet manual
            up ip link set dev $IFACE up
            down ip link set dev $IFACE down
    
    # ---------- TEMPORAIRE
    auto enp0s1.20
    iface enp0s1.20 inet dhcp
    
    iface enp0s1.20 inet6 auto
    [Avertissement] Avertissement

    Attention ! L'interface temporaire doit être désactivée dès que la partie préparation est terminée.

  2. Pour installer le paquet frr, on doit ajouter un nouveau dépôt au système.

    On commence par ajouter la clé de signature des paquets à la configuration du gestionnaire.

    sudo apt -y install curl
    curl -s https://deb.frrouting.org/frr/keys.asc | \
    sudo gpg -o /usr/share/keyrings/frr-keyring.gpg --dearmor

    On créé une nouvelle entrée dans la liste des sources de paquets et on lance la mise à jour du catalogue.

    echo "deb [signed-by=/usr/share/keyrings/frr-keyring.gpg] \
    https://deb.frrouting.org/frr bullseye frr-stable" | \
    sudo tee /etc/apt/sources.list.d/frr.list
    sudo apt update
    sudo apt -y install frr frr-pythontools
    apt search ^frr$
    En train de trier... Fait
    Recherche en texte intégral... Fait
    frr/stable,now 8.3.1-0~deb11u1 amd64  [installé]
      FRRouting suite of internet protocols (BGP, OSPF, IS-IS, ...)

    Sans configuration particulière, les services zebra et staticd sont lancés. Aucun protocole de routage dynamique n'est activé.

    systemctl status frr
    • frr.service - FRRouting
         Loaded: loaded (/lib/systemd/system/frr.service; enabled; preset: enabled)
         Active: active (running) since Sun 2022-10-23 14:55:02 CEST; 1min 22s ago
           Docs: https://frrouting.readthedocs.io/en/latest/setup.html
        Process: 2369 ExecStart=/usr/lib/frr/frrinit.sh start (code=exited, status=0/SUCCESS)
       Main PID: 2378 (watchfrr)
         Status: "FRR Operational"
          Tasks: 7 (limit: 1114)
         Memory: 9.4M
            CPU: 201ms
         CGroup: /system.slice/frr.service
                 ├─2378 /usr/lib/frr/watchfrr -d -F traditional zebra staticd
                 ├─2389 /usr/lib/frr/zebra -d -F traditional -A 127.0.0.1 -s 90000000
                 └─2394 /usr/lib/frr/staticd -d -F traditional -A 127.0.0.1
    
    oct. 23 14:55:02 R1 watchfrr[2378]: [ZCJ3S-SPH5S] zebra state -> down : initial connection attempt failed
    oct. 23 14:55:02 R1 watchfrr[2378]: [ZCJ3S-SPH5S] staticd state -> down : initial connection attempt failed
    oct. 23 14:55:02 R1 watchfrr[2378]: [YFT0P-5Q5YX] Forked background command [pid 2379]: /usr/lib/frr/watchfrr.sh restart all
    oct. 23 14:55:02 R1 zebra[2389]: [VTVCM-Y2NW3] Configuration Read in Took: 00:00:00
    oct. 23 14:55:02 R1 staticd[2394]: [VTVCM-Y2NW3] Configuration Read in Took: 00:00:00
    oct. 23 14:55:02 R1 watchfrr[2378]: [QDG3Y-BY5TN] zebra state -> up : connect succeeded
    oct. 23 14:55:02 R1 watchfrr[2378]: [QDG3Y-BY5TN] staticd state -> up : connect succeeded
    oct. 23 14:55:02 R1 watchfrr[2378]: [KWE5Q-QNGFC] all daemons up, doing startup-complete notify
    oct. 23 14:55:02 R1 frrinit.sh[2369]: Started watchfrr.
    oct. 23 14:55:02 R1 systemd[1]: Started FRRouting.
  3. Activer le routage IPv4 et IPv6 au niveau noyau.

    Il faut éditer le fichier /etc/sysctl.conf pour fixer les valeurs des paramètres de configuration du routage. Voir la section Fonctions réseau d'une interface du support Configuration d'une interface de réseau local.

    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
    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
  4. Pour créer les interfaces associées aux VLANs sur chacun des routeurs R1, R2 et R3, on édite le fichier /etc/network/interfaces.

    Auparavant, on doit installer le paquet du commutateur virtuel qui sert à raccorder des conteneurs du VLAN “vert“ d'hébergement.

    sudo apt -y install openvswitch-switch

    Voici un exemple de fichier /etc/network/interfaces pour le routeur R1 de la maquette.

    # The loopback network interface
    auto lo
    iface lo inet loopback
    
    # The primary network interface
    auto enp0s1
    iface enp0s1 inet manual
            up ip link set dev $IFACE up
            down ip link set dev $IFACE down
    
    # uplink
    auto enp0s1.360
    iface enp0s1.360 inet static
            address 192.168.104.130/27
            gateway 192.168.104.129
            dns-nameserver 172.16.0.2
    
    iface enp0s1.360 inet6 static
            address 2001:678:3fc:168::2/64
            gateway fe80:168::1
    
    # R1 -> R2
    auto enp0s1.480
    iface enp0s1.480 inet static
            address 10.48.0.1/29
    
    # R1 -> R3
    auto enp0s1.481
    iface enp0s1.481 inet static
            address 10.48.1.1/29
    
    # R1 -> lxd
    auto asw-host
    iface asw-host inet manual
            ovs_type OVSBridge
            ovs_ports sw-vlan10
            up ip link set dev $IFACE up
            down ip link set dev $IFACE down
    
    allow-asw-host sw-vlan10
    iface sw-vlan10 inet static
            ovs_type OVSBridge
            ovs_bridge asw-host
            ovs_options asw-host 10
            address 10.10.0.1/24
    
    iface sw-vlan10 inet6 static
            ovs_type OVSBridge
            ovs_bridge asw-host
            ovs_options asw-host 10
            address fd14:ca46:3864:a::1/64
    

    On adapte la liste des interfaces pour les deux autres routeurs R2 et R3 avec les numéros de VLANs concernés.

  5. Éditer le fichier de configuration de la console “unifiée“ vtysh de façon à ce qu'il contienne les informations minimales.

    Voici un exemple pour le routeur R1 de la maquette.

    echo service integrated-vtysh-config | \
    sudo tee /etc/frr/vtysh.conf

    Cet outil offre une console unifiée pour les trois démons : zebra, ospfd et ospf6d.

  6. Ajouter l'utilisateur etu aux groupes frr et frrvty pour lui donner un accès direct à la console de configuration des démons et aux fichiers de configuration.

    sudo adduser etu frrvty
    sudo adduser etu frr

    Il ne faut pas oublier de se déconnecter/reconnecter pour bénéficier de la nouvelle attribution de groupe.

  7. Activer les deux démons relatifs au protocole OSPF dans le fichier de configuration : /etc/frr/daemons.

    sudo sed -i 's/ospfd=no/ospfd=yes/' /etc/frr/daemons
    sudo sed -i 's/ospf6d=no/ospf6d=yes/' /etc/frr/daemons
    sudo systemctl restart frr

    On peut alors relancer le service et vérifier que les nouveaux démons de routage dynamique OSPF sont bien activés.

    systemctl status frr
    • frr.service - FRRouting
         Loaded: loaded (/lib/systemd/system/frr.service; enabled; preset: enabled)
         Active: active (running) since Sun 2022-10-23 15:36:35 CEST; 8s ago
           Docs: https://frrouting.readthedocs.io/en/latest/setup.html
        Process: 3356 ExecStart=/usr/lib/frr/frrinit.sh start (code=exited, status=0/SUCCESS)
       Main PID: 3365 (watchfrr)
         Status: "FRR Operational"
          Tasks: 11 (limit: 1114)
         Memory: 16.0M
            CPU: 237ms
         CGroup: /system.slice/frr.service
                 ├─3365 /usr/lib/frr/watchfrr -d -F traditional zebra ospfd ospf6d staticd
                 ├─3381 /usr/lib/frr/zebra -d -F traditional -A 127.0.0.1 -s 90000000
                 ├─3386 /usr/lib/frr/ospfd -d -F traditional -A 127.0.0.1
                 ├─3389 /usr/lib/frr/ospf6d -d -F traditional -A ::1
                 └─3392 /usr/lib/frr/staticd -d -F traditional -A 127.0.0.1
    
    oct. 23 15:36:35 R1 ospfd[3386]: [VTVCM-Y2NW3] Configuration Read in Took: 00:00:00
    oct. 23 15:36:35 R1 ospf6d[3389]: [VTVCM-Y2NW3] Configuration Read in Took: 00:00:00
    oct. 23 15:36:35 R1 staticd[3392]: [VTVCM-Y2NW3] Configuration Read in Took: 00:00:00
    oct. 23 15:36:35 R1 watchfrr[3365]: [QDG3Y-BY5TN] zebra state -> up : connect succeeded
    oct. 23 15:36:35 R1 watchfrr[3365]: [QDG3Y-BY5TN] ospfd state -> up : connect succeeded
    oct. 23 15:36:35 R1 watchfrr[3365]: [QDG3Y-BY5TN] ospf6d state -> up : connect succeeded
    oct. 23 15:36:35 R1 watchfrr[3365]: [QDG3Y-BY5TN] staticd state -> up : connect succeeded
    oct. 23 15:36:35 R1 watchfrr[3365]: [KWE5Q-QNGFC] all daemons up, doing startup-complete notify
    oct. 23 15:36:35 R1 frrinit.sh[3356]: Started watchfrr.
    oct. 23 15:36:35 R1 systemd[1]: Started FRRouting.

    On peut aussi lister les démons actifs à partir de la console du service.

    vtysh
    
    Hello, this is FRRouting (version 8.3.1).
    Copyright 1996-2005 Kunihiro Ishiguro, et al.
    
    R1# sh daemons
     zebra ospfd ospf6d watchfrr staticd
  8. Compléter la configuration des interfaces dans la console unifiée vtysh de façon à fixer la bande passante de chaque interface active à 1Gbps.

    Voici un exemple de séquence d'instructions pour configurer les interfaces du routeur rouge de la maquette.

    On commence par lister les interfaces actives à partir de la console.

    R1# sh int brief
    Interface       Status  VRF             Addresses
    ---------       ------  ---             ---------
    asw-host        up      default
    enp0s1          up      default
    enp0s1.360      up      default         192.168.104.130/27
                                            + 2001:678:3fc:168::2/64
    enp0s1.480      up      default         10.48.0.1/29
    enp0s1.481      up      default         10.48.1.1/29
    lo              up      default
    ovs-system      down    default
    sw-vlan10       up      default         10.10.0.1/24
                                            + fd14:ca46:3864:a::1/64

    Pour les interfaces enp0s1.480 (lien R1 -> R2) et enp0s1.481 (lien R1 -> R3), on ajoute le paramètre bandwidth qui permet de définir arbitrairement le débit binaire d'une interface.

    R1# conf t
    R1(config)# int enp0s1.480
    R1(config-if)# bandwidth ?
      (1-100000)  Bandwidth in megabits
    R1(config-if)# bandwidth 100000
    R1(config-if)# ^Z
    R1# sh int enp0s1.480
    Interface enp0s1.480 is up, line protocol is up
      Link ups:       1    last: 2022/10/24 09:25:42.65
      Link downs:     0    last: (never)
      vrf: default
      index 4 metric 0 mtu 1500 speed 4294967295
      flags: <UP,BROADCAST,RUNNING,MULTICAST>
      Type: Ethernet
      HWaddr: b8:ad:ca:fe:00:c8
      bandwidth 100000 Mbps
      inet 10.48.0.1/29
      inet6 fe80::baad:caff:fefe:c8/64
      Interface Type Vlan
      Interface Slave Type None
      VLAN Id 480
      protodown: off
      Parent interface: enp0s1

    On répète la même opération pour l'interface enp0s1.481. Ensuite, on peut sauvegarder la configuration.

    R1# copy run start
    Note: this version of vtysh never writes vtysh.conf
    Building Configuration...
    Integrated configuration saved to /etc/frr/frr.conf
    [OK]

    Une fois la configuration complétée, les paramètres apparaissent dans la configuration du service.

    R1# sh run
    Building configuration...
    
    Current configuration:
    !
    frr version 8.3.1
    frr defaults traditional
    hostname R1
    log syslog informational
    service integrated-vtysh-config
    !
    interface enp0s1.480
     bandwidth 100000
    exit
    !
    interface enp0s1.481
     bandwidth 100000
    exit
    !
    end
    [Note] Note

    Contrairement à un routeur «intégré» avec un système d'exploitation dédié, le démon de routage statique n'a pas directement accès aux interfaces matérielles. Or, sur un système GNU/Linux, le débit d'une interface Ethernet filaire peut varier en fonction du débit proposé par le port du commutateur. Sans information spécifique du noyau, l'application «service de routage» n'a aucun moyen de connaître le débit exact de l'interface. C'est la raison pour laquelle il est nécessaire de paramétrer manuellement les débits de chaque interface dans la configuration.

    [Avertissement] Avertissement

    Sans configuration manuelle du coût de lien d'une interface, ce paramétrage de la bande passante est essentiel dans le calcul des métriques et le fonctionnement du protocole de routage OSPF. Si les calculs de métriques pour les liens actifs sont erronés, le choix des routes à emprunter pour faire transiter le trafic utilisateur entre deux routeurs peut lui aussi être erroné.

Une fois l'ensemble des opérations de cette section réalisées, chaque routeur dispose des outils pour mettre en œuvre la topologie physique et ensuite les protocoles de routage dynamique OSPF.