compréhension et mise en place d’IPv6 (Dual Stack fonctionnel)

Contexte

Je vais vous raconter mon aventure à la découverte d’IPv6. Cette épopée a duré environ 3 jours.

L’objectif était donc de comprendre son fonctionnement, de dépasser les idées reçues et de voir concrètement ce que cela donne dans un environnement réel.

Les a priori que l’on peut avoir

Quand on regarde seulement en surface, on voit ceci

  • Au premier regard, une adresse comme 2001:db8:0:85a3:0:0:ac1f:8001 . Ce mélange de chiffres et de lettres donne l’impression que les adresses IPv6 sont difficiles à lire. Pourtant, une fois la logique d’IPv6 comprise, on découvre une architecture plus simple sans NAT ni redirection de ports. Une simple règle de pare-feu (ACL) permet de définir si une machine est accessible depuis Internet ou non. Au final, la configuration est plus claire et plus propre.
  • En IPv6, chaque machine dispose d’une adresse publique. Dans mon cas, ma première réaction a été :
    « Si chaque machine possède une adresse publique, alors elles sont toutes accessibles depuis Internet. »
    En pratique, ce n’est pas le cas, en tout cas dans mon environnement avec pfSense. Le pare-feu bloque par défaut toutes les connexions entrantes, même si les machines possèdent une adresse IPv6 publique. Pour rendre un équipement accessible depuis Internet, il est nécessaire de créer une règle de pare-feu explicite. Sans cette règle, aucune connexion entrante n’est autorisée.

Partie théorique

Je recommande plutôt d’aborder IPv6 avec un regard neuf. Une fois cette logique comprise, on réalise que le NAT n’est plus au cœur de l’architecture : c’est le pare-feu qui contrôle les accès. Au final, la configuration est souvent plus simple et plus cohérente qu’en IPv4.

Il existe plusieurs types d’adresses IPv6

Il existe plusieurs types d’adresses IPv6. Cependant, afin de ne pas complexifier inutilement les explications, nous allons nous concentrer sur les deux principales utilisées dans mon environnement : Link-Local et Global Unicast. Le troisième type est l’adresse Unique Local (ULA), équivalent des adresses privées en IPv4, mais elle n’est pas utilisée dans mon cas.

Global Unicast

Il s’agit de l’adresse IPv6 publique qui permet à une machine de communiquer en dehors du réseau local.
Elle peut être attribuée manuellement à une machine virtuelle ou obtenue automatiquement. Contrairement à IPv4, il n’est pas forcément nécessaire d’utiliser un serveur DHCP.

Grâce au protocole SLAAC (Stateless Address Autoconfiguration), les machines peuvent configurer automatiquement leur adresse IPv6 à partir du préfixe annoncé par le routeur via les Router Advertisements (RA).

Exemple dans le cas d’une adresse IPv6 fixée manuellement

2001:41d0:fc20:2e20::23/64

Link-Local

Il s’agit d’une adresse IPv6 générée automatiquement sur chaque interface réseau.
Elle permet aux équipements de communiquer uniquement en local et n’est jamais routée sur Internet.
Les adresses Link-Local commencent toujours par le préfixe :
FE80::/10
Elles sont notamment utilisées pour la découverte des voisins (Neighbor Discovery) et pour communiquer avec le routeur, notamment via la passerelle IPv6.

DHCPv6 dans mon environnement

DHCPv6 (Dynamic Host Configuration Protocol for IPv6) est un protocole permettant de fournir des informations de configuration réseau aux équipements IPv6.Dans mon cas, il est utilisé sur l’interface WAN de pfSense. Mon fournisseur d’accès, OVH, utilise DHCPv6 afin de fournir à mon routeur mon préfixe IPv6 (via la délégation de préfixe).

ICMPv6

Avec IPv6, ICMPv6 est essentiel au bon fonctionnement du réseau. Il ne faut donc pas le bloquer globalement, car il est notamment utilisé pour la découverte des voisins, SLAAC et la détection du chemin réseau. En plus de TCP/UDP, il faut donc autoriser les messages ICMPv6 nécessaires, notamment pour le diagnostic avec le ping IPv6.

Structure d’une adresse IPv6 en /64

Prenons l’adresse complète :

2001:41d0:fc20:2e00:0000:0000:0000:0023/64

Une adresse IPv6 en /64 est séparée en deux parties :

2001:41d0:fc20:2e00 | 0000:0000:0000:0023

  • 2001:41d0:fc20:2e00 → correspond au préfixe réseau (les 64 premiers bits).
  • 0000:0000:0000:0023 → correspond à l’identifiant d’interface (les 64 derniers bits).

Toutes les machines appartenant au même réseau IPv6 partagent le même préfixe, mais possèdent un identifiant d’interface différent.

La compression d’une adresse IPv6 avec ::

En IPv6, le symbole :: permet de remplacer une suite de blocs contenant uniquement des zéros afin de simplifier l’écriture d’une adresse.

⚠️ Cette notation ne peut être utilisée qu’une seule fois dans une même adresse IPv6.
Exemple :
2001:41d0:fc20:2e00:0000:0000:0000:0023
devient :
2001:41d0:fc20:2e00::23

Cela ne change pas l’adresse, c’est uniquement une méthode pour la rendre plus lisible.

La pratique

Nous allons maintenant passer à la pratique. Jusqu’à présent, nous avons abordé beaucoup de théorie, ce qui n’est pas très parlant. Je vous propose donc de découvrir concrètement le fonctionnement d’IPv6 dans mon environnement pfSense, à l’aide de captures d’écran et de configurations réelles et concrètes.

Coté OVH

Côté panel OVH, voici ce que donne la configuration IPv6 : le préfixe qui m’a été attribué ainsi que sa taille. Je vais expliquer à quoi cela correspond.

Ici, on voit le bloc IPv6 qui m’a été attribué. On remarque notamment qu’OVH m’a fourni un préfixe en /56.

Pour résumer, le /56 permet de subdiviser mon préfixe en 256 sous-réseaux /64. Dans la capture, les deux chiffres mis en évidence avant :: permettent d’identifier les différents sous-réseaux.
Ce sont eux qui vont servir à définir les différents préfixes /64 de mes VLAN.

Configuration sur PFsense

Ici, nous allons voir ce que cela donne côté pfSense.

interface WAN

Dans le cas d’OVH, la récupération du préfixe IPv6 se fait via DHCPv6. Il est donc nécessaire de configurer pfSense afin qu’il utilise DHCPv6 sur son interface WAN pour récupérer ce préfixe IPv6 grâce au mécanisme de délégation de préfixe (Prefix Delegation).

Ici, je sélectionne bien DHCPv6 dans IPv6 Configuration Type, car c’est ainsi que fonctionne la récupération du préfixe dans mon environnement OVH.

En descendant dans la configuration pfSense, nous allons pouvoir préciser quelques éléments.

Dans cette configuration, pfSense utilise DHCPv6 sur son interface WAN pour récupérer le préfixe IPv6 fourni par OVH.

  • Use IPv4 connectivity as parent interface : permet à pfSense d’utiliser la connectivité IPv4 de l’interface comme interface parente pour effectuer la requête DHCPv6.
  • Only request an IPv6 prefix : pfSense demande uniquement un préfixe IPv6 et non une adresse IPv6 directement sur l’interface WAN.
  • Prefix Delegation size : 56 : indique que pfSense souhaite récupérer un préfixe en /56, qui pourra ensuite être découpé en plusieurs réseaux /64.
  • Send IPv6 prefix hint : indique au fournisseur la taille du préfixe souhaitée. Dans mon cas, j’ai activé cette option lors de mes tests et de mes recherches. La configuration fonctionnant correctement ainsi, je l’ai conservée et je n’ai pas testé son fonctionnement lorsqu’elle est désactivée.

Une fois cette configuration effectuée, il faut configurer une interface LAN ou VLAN.

Configuration IPV6 VLAN20_SERVEUR

Dans mon cas, j’ai récemment refait l’ensemble de mon réseau. Il n’y a donc plus d’interface LAN classique, mais uniquement des VLAN.

Cependant, le fonctionnement d’IPv6 reste exactement le même. Que ce soit sur une interface LAN classique ou sur un VLAN, pfSense récupère le préfixe IPv6 et l’annonce sur le réseau concerné. Les machines obtiennent ensuite automatiquement leur adresse IPv6 grâce à SLAAC.

La seule différence concerne l’organisation du réseau : chaque VLAN représente un réseau IPv6 indépendant, généralement avec son propre préfixe /64.

Ici, on voit que l’interface VLAN20_SERVER est configurée en IPv6 Configuration Type : Track Interface.
Cette option permet à pfSense de récupérer automatiquement le préfixe IPv6
dans la parti Track IPv6 Interface

Le champ IPv6 Prefix ID : 20 permet de sélectionner le sous-réseau IPv6 utilisé par ce VLAN. À noter que le Prefix ID est exprimé en hexadécimal dans pfSense : la valeur 20 correspond donc à 0x20 (soit 32 en décimal).

J’ai volontairement utilisé la valeur 20 afin qu’elle corresponde visuellement au numéro de mon VLAN (VLAN 20). Cela me permet de conserver une convention de nommage simple et cohérente et de faciliter l’administration du réseau.

Grâce à la configuration Track Interface et au Prefix ID 20, pfSense crée automatiquement le sous-réseau IPv6 /64 associé à mon VLAN à partir du préfixe délégué par OVH. Dans mon cas, le préfixe obtenu est 2001:41d0:fc20:2e20::/64.

Après avoir appliqué cette configuration, il est parfois nécessaire de relancer l’interface WAN afin que pfSense renouvelle la demande DHCPv6 et récupère correctement le préfixe délégué.
Une fois le préfixe récupéré sur le WAN, les interfaces LAN/VLAN configurées en IPv6 Track Interface peuvent à leur tour recevoir leur préfixe IPv6 en /64 automatiquement.

Configuration firewall en entrant

Pour rendre mon serveur accessible depuis Internet en IPv6, j’ai créé les règles de pare-feu nécessaires vers son adresse 2001:41d0:fc20:2e20::23. Dans mon cas, j’autorise HTTP (80), HTTPS (443) ainsi que ICMPv6, ce dernier étant nécessaire au bon fonctionnement de plusieurs mécanismes essentiels d’IPv6.

Configuration de l’adresse IPv6 publique 2001:41d0:fc20:2e20::23 sur une VM

Nous allons voir comment attribuer une adresse IPv6 publique fixe à une machine virtuelle.
Pour l’exemple, nous allons utiliser cette VM qui héberge actuellement ce portfolio.
Dans mon cas, toute la configuration se fait dans le fichier :
/etc/network/interfaces

iface ens18 inet6 static
        address 2001:41d0:fc20:2e20::23/64 # Adresse IPv6 publique
        gateway fe80::4461:32ef:f243:310a #Passerelle IPv6 Link-Local

Dans mon environnement, la passerelle IPv6 utilisée par la VM correspond à l’adresse Link-Local (FE80::) de pfSense sur ce VLAN.

Test de connectivité IPv6 vers Internet

Pour vérifier que la VM communique correctement en IPv6, j’effectue un ping vers google.com. La résolution DNS retourne ici une adresse IPv6 et les réponses ICMPv6 confirment que la connectivité IPv6 vers Internet fonctionne.

ping google.com
PING google.com (2a00:1450:4007:809::200e) 56 data bytes
64 bytes from par10s27-in-x0e.1e100.net (2a00:1450:4007:809::200e): icmp_seq=1 ttl=113 time=9.23 ms
64 bytes from par10s27-in-x0e.1e100.net (2a00:1450:4007:809::200e): icmp_seq=2 ttl=113 time=8.81 ms
64 bytes from par10s27-in-x0e.1e100.net (2a00:1450:4007:809::200e): icmp_seq=3 ttl=113 time=8.90 ms

Test depuis l’extérieur

Vérification HTTPS et IPv6

Petite étape à ne pas oublier : pour rendre le service accessible en IPv6 avec votre nom de domaine, il faut ajouter un enregistrement DNS de type AAAA.
Cet enregistrement permet d’associer votre nom de domaine à votre adresse IPv6 publique

Pour valider que mon serveur web répond correctement en IPv4 et en IPv6, j’utilise le service SSL Labs.

Ce test permet de vérifier :

  • la configuration du certificat SSL/TLS ;
  • la disponibilité du service en HTTPS ;
  • la réponse du serveur sur les deux protocoles IP.

On remarque ici que le serveur est bien accessible avec :

  • IPv6 : 2001:41d0:fc20:2e20:0:0:0:23 On remarque que SSL Labs affiche ici l’adresse IPv6 sous sa forme non compressée, sans utiliser la notation ::
  • IPv4 : 109.190.177.205

Le résultat confirme que mon site est bien accessible en Dual Stack IPv4/IPv6. La configuration SSL/TLS obtient également la note A+.

Conclusion

En mettant de côté les idées reçues sur IPv6, on réalise que le sujet n’est finalement pas aussi complexe qu’il peut le paraître.

Dans mon cas, une fois les principes compris, IPv6 s’est même révélé plus propre et plus simple à gérer qu’une architecture IPv4 basée sur du NAT/PAT et des redirections de ports.

Bien évidemment, cette configuration correspond à mon environnement et chaque infrastructure est différente. L’objectif de cet article était surtout de partager une expérience concrète afin de faciliter la compréhension globale d’IPv6.

Retour en haut