6. Routage via le lien WAN

Après avoir testé les échanges de paquets sur le lien WAN dans la section précédente, on se préoccupe maintenant du routage depuis et vers le routeur spoke via ce même lien.

Désactivation de la configuration de l'interface LAN du routeur Spoke

Dans les sections précédentes, l'interface eth0 du routeur spoke a servi à communiquer avec l'Internet. On doit donc désactiver la configuration automatique de cette interface aussi bien en IPv4 qu'en IPv6.

Voici un extrait du fichier /etc/network/interfaces du routeur spoke pour l'interface eth0 sans configuration automatique.

allow-hotplug eth0
iface eth0 inet manual
        up echo 0 > /proc/sys/net/ipv6/conf/$IFACE/forwarding
        up echo 0 > /proc/sys/net/ipv6/conf/$IFACE/accept_ra
        up ip link set dev $IFACE up
        down ip link set dev $IFACE down

Cette solution permet de conserver un accès depuis le système hôte via l'adresse IPv6 de lien local.

Pour forcer l'application de la route par défaut via le protocole PPP, on utilise les scripts système de manipulation des interfaces.

# ifdown dsl-provider
# ifup dsl-provider

La table de routage IPv4 devient :

# ip route ls
default dev ppp0  scope link
203.0.113.1 dev ppp0  proto kernel  scope link  src 203.0.113.11

La table de routage IPv6 reste inchangée tant que le routeur hub ne dispose pas d'outil d'annonce SLAAC.

Activation du routage IPv4 & IPv6 sur le routeur Hub

Si on respecte la règle de configuration adoptée dans les sections précédentes, on utilise les fichiers système pour configurer le routage. Ici, c'est le fichier /etc/sysctl.conf qui nous intéresse. Voici la liste des options de configuration utilisées. Dans la copie d'écran ci-dessous, on a supprimé les commentaires et les lignes vides.

# 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.accept_redirects = 0
net.ipv6.conf.all.accept_redirects = 0
net.ipv4.conf.all.log_martians = 1

Ces options sont appliquées à l'aide de la commande # sysctl -p.

Traduction d'adresses IPv4 sur le routeur Hub

Le démon pppd du routeur hub délivre des adresses IPv4 appartenant au préfixe 203.0.113.0/24. Ce préfixe de la famille TESTNET est non routable sur l'Internet. On a donc recours à la traduction d'adresses sources pour que le trafic du routeur spoke soit correctement routé.

On utilise le paquet ipatbles-persistent pour préserver les règles de traduction d'adresses d'un redémarrage système à l'autre. Le fichier de sauvegarde est : /etc/iptables/rules.v4.

*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -o eth0 -p tcp -m tcp --syn -m tcpmss --mss 1400:1536 -j TCPMSS --clamp-mss-to-pmtu
-A POSTROUTING -o eth0 -j MASQUERADE
COMMIT

Il suffit de consulter les compteurs associés aux règles de filtrage pour valider leur fonctionnement.

# iptables -t nat -vL  POSTROUTING
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source     destination         
   30  1800 TCPMSS     tcp  --  any    eth0    anywhere   anywhere  tcp flags:FIN,SYN,RST,ACK/SYN tcpmss match 1400:1536 TCPMSS clamp to PMTU
  256 26578 MASQUERADE all  --  any    eth0    anywhere   anywhere
[Note] Note

L'utilisation du module TCPMSS joue un rôle important dans la gestion de l'encapsulation entre les couches transport, réseau et liaison. En effet, le dialogue PPPoE consomme 8 octets de chaque trame. La quantité maximale d'octets qu'une trame peut encapsuler passe de 1500 à 1492. Voir la page Maximum transmission unit.

Le protocole TCP de la couche transport négocie, lors de l'établissement d'une connexion, la quantité maximale d'octets que peut contenir un segment. Comme la couche transport ne sait rien de l'encapsulation en couche liaison, la règle de filtrage qui fait appel au module TCPMSS est là pour forcer l'adaptation au contexte PPPoE du paramètre Maximum segment size lors de l'établissement des connexions TCP.

Adresses IPv6 ULA

Avec IPv6, les adresses dites Unique local address sont l'équivalent des adresses privées IPv4. Ce document constitue une bonne occasion d'illustrer leur utilisation.

Par définition, le préfixe réseau à utiliser est le : fd00::/8. À ce préfixe il faut adjoindre 40 bits aléatoires pour obtenir un préfixe /48 qui constitue la base du plan d'adressage.

On commence donc par générer une chaine de 40 bits aléatoires notée en hexadécimal.

$ openssl rand -hex 5
271684e79b

Le préfixe réseau obtenu est le : fd27:1684:e79b::/48. Pour adresser les différents routeurs spoke potentiels, l'espace d'adressage est ainsi de 2^16 liens WAN possibles. Les 16 bits réseau sont obtenus en faisant la différence entre 64 (le nombre de bits de la partie hôte) et 48 (le nombre de bits de la partie réseau). Puisque la maquette utilisée ne comprend qu'un seul lien WAN, on utilise le premier préfixe réseau disponible pour la suite des manipulations : fd27:1684:e79b::/64.

Une fois le plan d'adressage défini, on passe à la configuration du routeur hub.

  • Affectation d'une adresse IPv6 à l'interface ppp0.

    # ip -6 addr add fd27:1684:e79b::1/64 dev ppp0
  • Configuration du démon radvd pour annoncer le préfixe réseau ainsi que le resolver DNS en direction du routeur spoke.

    interface ppp0
    {
       AdvSendAdvert on;
       prefix fd27:1684:e79b::/64
       {
           AdvOnLink on;
           AdvAutonomous on;
           AdvRouterAddr on;
       };
    
       RDNSS 2001:db8:fe00:8175::1
       {
       };
    };
    

Ces deux étapes de configuration doivent normalement être réalisées lors de l'établissement du lien WAN via le démon pppd. On peut donc placer deux scripts dans le répertoire /etc/ppp/ipv6-up.d/. Ainsi, dès que l'interface pppX est activée, on effectue automatiquement les opérations de configuration spécifiques à IPv6.

  • Ajout automatique de l'adresse IPv6 de la famille Unique local address à l'interface PPP. Voici le script /etc/ppp/ipv6-up.d/ipv6-ula-address

    #!/bin/sh
    
    # ULA network prefix
    prefix=fd27:1684:e79b
    
    # extract $IFACE number as network nibble
    netnum=$(echo $IFACE | grep -o [0-9]*)
    
    # compute ULA interface address
    ula=$prefix:$netnum::1/64
    
    ip -6 addr add $ula dev $IFACE
    
  • Le démon radvd est conçu pour réagir dynamiquement aux activations/désactivations d'interfaces et au modifications de son fichier de configuration : /etc/radvd.conf. Voici le script qui permet de compléter dynamiquement la configuration en fonction de l'activation d'une interface PPP : /etc/ppp/ipv6-up.d/radvd-conf-update.

    #!/bin/sh
    
    # radvd main configuration file
    radvd_conf="/etc/radvd.conf"
    
    if [ -z "$(grep $IFACE $radvd_conf)" ]
    then
    
    # ULA network prefix
    prefix=fd27:1684:e79b
    
    # DNS resolver IPv6 address
    ipv6_resolver=2001:db8:fe00:8175::1
    
    # extract $IFACE number as network nibble
    netnum=$(echo $IFACE | grep -o [0-9]*)
    
    cat << EOF >> $radvd_conf
    
    interface $IFACE
    {
            AdvSendAdvert on;
            prefix $prefix:$netnum::/64
            {
                    AdvOnLink on;
                    AdvAutonomous on;
                    AdvRouterAddr on;
            };
    
            RDNSS $ipv6_resolver
            {
            };
    };
    EOF
    
    systemctl restart radvd
    
    fi
    

Traduction d'adresses IPv6 sur le routeur Hub

On reprend ici la même démarche que pour le protocole IPv4 avec l'utilisation du paquet ipatbles-persistent et la sauvegarde des règles de filtrage dans le fichier /etc/iptables/rules.v6.

*nat
:PREROUTING ACCEPT [15:2078]
:INPUT ACCEPT [9:1586]
:OUTPUT ACCEPT [13:1536]
:POSTROUTING ACCEPT [9:1120]
-A POSTROUTING -o eth0 -p tcp -m tcp --syn -m tcpmss --mss 1400:1536 -j TCPMSS --clamp-mss-to-pmtu
-A POSTROUTING -s fd00::/8 -o eth0 -j SNAT --to 2001:db8:fe00:8175:b8ad:ff:feca:fe00
COMMIT

Comme avec le routage des paquets IPv4, les compteurs servent à qualifier l'utilisation des règles de filtrage.

  • Sur le routeur spoke, on lance le chargement d'une page web.

    $ wget -q -6 -O /dev/null http://inetdoc.net
  • Sur le routeur hub, on relève les compteurs des règles de la table nat.

    # ip6tables -t nat -vnL POSTROUTING
    Chain POSTROUTING (policy ACCEPT 13 packets, 2149 bytes)
     pkts bytes target     prot opt in     out     source    destination
        8   640 TCPMSS     tcp      *      eth0    ::/0      ::/0     tcp flags:0x17/0x02 tcpmss match 1400:1536 TCPMSS clamp to PMTU
       14  1312 SNAT       all      *      eth0    fd00::/8  ::/0     to:2001:db8:fe00:8175:b8ad:ff:feca:fe00
[Note] Note

Avec le protocole IPv6, l'emploi du module TCPMSS est aussi utile. Voir la Note sur les règles de filtrage IPv4.