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

    $ wget -qO - https://deb.frrouting.org/frr/keys.asc | sudo apt-key add -
    Warning: apt-key is deprecated. Manage keyring files in trusted.gpg.d instead (see apt-key(8)).
    OK

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

    $ echo deb https://deb.frrouting.org/frr bullseye frr-stable | \
    sudo tee -a /etc/apt/sources.list.d/frr.list 
    
    $ sudo apt update
    $ sudo apt install frr
    
    $ sudo aptitude -w 80 versions frr
    p   7.5.1-1.1                                     testing                   500
    i   8.0.1-0~deb11u1                               stable                    500

    Sans configuration particulière, le service zebra est lancé, mais sans aucun protocole de routage dynamique.

    $ systemctl status frr
    ● frr.service - FRRouting
         Loaded: loaded (/lib/systemd/system/frr.service; enabled; vendor preset: enabled)
         Active: active (running) since Sun 2021-10-24 14:26:28 CEST; 2min 45s ago
           Docs: https://frrouting.readthedocs.io/en/latest/setup.html
        Process: 2954 ExecStart=/usr/lib/frr/frrinit.sh start (code=exited, status=0/SUCCESS)
       Main PID: 2963 (watchfrr)
         Status: "FRR Operational"
          Tasks: 7 (limit: 1121)
         Memory: 9.0M
            CPU: 323ms
         CGroup: /system.slice/frr.service
                 ├─2963 /usr/lib/frr/watchfrr -d -F traditional zebra staticd
                 ├─2976 /usr/lib/frr/zebra -d -F traditional -A 127.0.0.1 -s 90000000
                 └─2981 /usr/lib/frr/staticd -d -F traditional -A 127.0.0.1
    
    oct. 24 14:26:27 R1-rouge watchfrr[2963]: [YFT0P-5Q5YX] Forked background command [pid 2964]: /usr/lib/frr/watchfrr.sh restart all
    oct. 24 14:26:27 R1-rouge watchfrr.sh[2972]: Cannot stop staticd: pid file not found
    oct. 24 14:26:27 R1-rouge watchfrr.sh[2974]: Cannot stop zebra: pid file not found
    oct. 24 14:26:28 R1-rouge zebra[2976]: [VTVCM-Y2NW3] Configuration Read in Took: 00:00:00
    oct. 24 14:26:28 R1-rouge staticd[2981]: [VTVCM-Y2NW3] Configuration Read in Took: 00:00:00
    oct. 24 14:26:28 R1-rouge watchfrr[2963]: [QDG3Y-BY5TN] zebra state -> up : connect succeeded
    oct. 24 14:26:28 R1-rouge watchfrr[2963]: [QDG3Y-BY5TN] staticd state -> up : connect succeeded
    oct. 24 14:26:28 R1-rouge watchfrr[2963]: [KWE5Q-QNGFC] all daemons up, doing startup-complete notify
    oct. 24 14:26:28 R1-rouge frrinit.sh[2954]: Started watchfrr.
    oct. 24 14:26:28 R1-rouge systemd[1]: Started FRRouting.
  2. 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
  3. 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 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 enp0s2
    iface enp0s2 inet manual
            up ip link set dev $IFACE up
            down ip link set dev $IFACE down
    
    # uplink
    auto enp0s2.300
    iface enp0s2.300 inet static
            address 10.141.0.162/27
            gateway 10.141.0.161
            dns-nameserver 172.16.0.2
    
    iface enp0s2.300 inet6 static
            address 2001:678:3fc:12c::2/64
            gateway 2001:678:3fc:12c::1
    
    # R1 -> R2
    auto enp0s2.290
    iface enp0s2.290 inet static
            address 10.2.90.1/29
    
    # R1 -> R3
    auto enp0s2.291
    iface enp0s2.291 inet static
            address 10.2.91.1/29
    
    # R1 -> lxd
    auto asw-host
    iface asw-host inet manual
            ovs_type OVSBridge
            ovs_ports sw-vlan292
            up ip link set dev $IFACE up
            down ip link set dev $IFACE down
    
    allow-asw-host sw-vlan292
    iface sw-vlan292 inet static
            ovs_type OVSBridge
            ovs_bridge asw-host
            ovs_options asw-host 292
            address 10.2.92.1/24
    
    iface sw-vlan292 inet6 static
            ovs_type OVSBridge
            ovs_bridge asw-host
            ovs_options asw-host 292
            address 2001:678:3fc:124::1/64
    

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

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

  5. Ajouter l'utilisateur etu aux groupes 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.

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

    Une fois la modification du fichier effectuée on obtient le résultat suivant.

    $ sudo grep ^ospf /etc/frr/daemons
    ospfd=yes
    ospf6d=yes
    ospfd_options="  -A 127.0.0.1"
    ospf6d_options=" -A ::1"

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

    $ sudo systemctl restart frr
    
    $ sudo systemctl status frr
    ● frr.service - FRRouting
         Loaded: loaded (/lib/systemd/system/frr.service; enabled; vendor preset: enabled)
         Active: active (running) since Sun 2021-10-24 14:41:35 CEST; 5s ago
           Docs: https://frrouting.readthedocs.io/en/latest/setup.html
        Process: 3326 ExecStart=/usr/lib/frr/frrinit.sh start (code=exited, status=0/SUCCESS)
       Main PID: 3336 (watchfrr)
         Status: "FRR Operational"
          Tasks: 11 (limit: 1121)
         Memory: 17.7M
            CPU: 366ms
         CGroup: /system.slice/frr.service
                 ├─3336 /usr/lib/frr/watchfrr -d -F traditional zebra ospfd ospf6d staticd
                 ├─3358 /usr/lib/frr/zebra -d -F traditional -A 127.0.0.1 -s 90000000
                 ├─3363 /usr/lib/frr/ospfd -d -F traditional -A 127.0.0.1
                 ├─3366 /usr/lib/frr/ospf6d -d -F traditional -A ::1
                 └─3369 /usr/lib/frr/staticd -d -F traditional -A 127.0.0.1
    
    oct. 24 14:41:35 R1-rouge ospfd[3363]: [VTVCM-Y2NW3] Configuration Read in Took: 00:00:00
    oct. 24 14:41:35 R1-rouge ospf6d[3366]: [VTVCM-Y2NW3] Configuration Read in Took: 00:00:00
    oct. 24 14:41:35 R1-rouge staticd[3369]: [VTVCM-Y2NW3] Configuration Read in Took: 00:00:00
    oct. 24 14:41:35 R1-rouge watchfrr[3336]: [QDG3Y-BY5TN] zebra state -> up : connect succeeded
    oct. 24 14:41:35 R1-rouge watchfrr[3336]: [QDG3Y-BY5TN] ospfd state -> up : connect succeeded
    oct. 24 14:41:35 R1-rouge watchfrr[3336]: [QDG3Y-BY5TN] ospf6d state -> up : connect succeeded
    oct. 24 14:41:35 R1-rouge watchfrr[3336]: [QDG3Y-BY5TN] staticd state -> up : connect succeeded
    oct. 24 14:41:35 R1-rouge watchfrr[3336]: [KWE5Q-QNGFC] all daemons up, doing startup-complete notify
    oct. 24 14:41:35 R1-rouge frrinit.sh[3326]: Started watchfrr.
    oct. 24 14:41:35 R1-rouge 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.0.1).
    Copyright 1996-2005 Kunihiro Ishiguro, et al.
    
    R1-rouge# sh daemons
     zebra ospfd ospf6d watchfrr staticd
    R1-rouge#
  7. 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.

    $ vtysh
    
    Hello, this is FRRouting (version 8.0.1).
    Copyright 1996-2005 Kunihiro Ishiguro, et al.
    
    R1-rouge# sh int brief
    Interface       Status  VRF             Addresses
    ---------       ------  ---             ---------
    asw-host        up      default
    enp0s2          up      default
    enp0s2.290      up      default         10.2.90.1/29
    enp0s2.291      up      default         10.2.91.1/29
    enp0s2.300      up      default         10.141.0.162/27
                                            + 2001:678:3fc:12c::2/64
    lo              up      default
    ovs-system      down    default
    sw-vlan292      up      default         10.2.92.1/24
                                            + 2001:678:3fc:124::1/64

    Pour l'interface enp0s2.290, on ajoute le paramètre bandwidth.

    R1-rouge# conf t
    R1-rouge(config)# int enp0s2.290
    R1-rouge(config-if)# bandwidth ?
      (1-100000)  Bandwidth in megabits
    R1-rouge(config-if)# bandwidth 1000
    R1-rouge(config-if)# ^Z
    R1-rouge# sh int enp0s2.290
    Interface enp0s2.290 is up, line protocol is up
      Link ups:       0    last: (never)
      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:64
      bandwidth 1000 Mbps
      inet 10.2.90.1/29
      inet6 fe80::baad:caff:fefe:64/64
      Interface Type Vlan
      Interface Slave Type None
      VLAN Id 290
      protodown: off
      Parent interface: enp0s2
    R1-rouge# 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-rouge# sh run
    Building configuration...
    
    Current configuration:
    !
    frr version 8.0.1
    frr defaults traditional
    hostname R1-rouge
    log syslog informational
    service integrated-vtysh-config
    !
    interface enp0s2.290
     bandwidth 1000
    !
    interface enp0s2.291
     bandwidth 1000
    !
    line vty
    !
    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.