Aller au contenu

IPv6, autoconfiguration et coexistence

IPv6 (Internet Protocol version 6) n’est pas une option à activer plus tard : il est déjà actif sur la quasi-totalité des systèmes, qui s’attribuent des adresses et écoutent les routeurs sans rien demander à personne. Cette fiche explique comment lire une adresse IPv6, comment une machine se configure, comment IPv6 cohabite avec IPv4 (Internet Protocol version 4), et comment filtrer, journaliser et protéger un protocole que beaucoup de réseaux hébergent sans le savoir.

→ Lire l’explication complète de la marmotte

Une adresse IPv6 compte 128 bits, écrits en huit groupes de 16 bits en hexadécimal, séparés par deux-points. Deux règles abrègent l’écriture : les zéros de tête de chaque groupe se suppriment, et une seule suite de groupes nuls consécutifs se remplace par ::. Ainsi :

2001:0db8:0000:0000:0000:ff00:0042:8329
2001:db8:0:0:0:ff00:42:8329 (zéros de tête supprimés)
2001:db8::ff00:42:8329 (suite de groupes nuls compressée)

Le :: n’apparaît qu’une fois, sinon la longueur de chaque trou deviendrait ambiguë. Le RFC (Request for Comments) 5952 fixe une forme canonique (minuscules, plus longue suite de zéros compressée), mais tous les outils ne la respectent pas : une recherche dans des journaux doit normaliser avant de comparer. Le préfixe 2001:db8::/32 est réservé à la documentation (RFC 3849), d’où sa présence ici.

Comme en IPv4, la notation /n donne la longueur du préfixe réseau. Le découpage usuel est simple : un site reçoit un /48 ou un /56 de son opérateur, chaque sous-réseau est un /64, et les 64 bits restants forment l’identifiant d’interface. Un /48 découpé en /64 donne 65 536 sous-réseaux : il ne s’agit plus d’économiser, mais de structurer.

Chaque adresse a une portée :

TypePréfixePortéeUsage
Lien local (link-local)fe80::/10le lien seulementvoisinage, routeur par défaut, protocoles de contrôle
Unique local (ULA)fc00::/7, en pratique fd00::/8l’organisationadressage interne stable
Globale (GUA)2000::/3Internettrafic routé
Multidiffusionff00::/8variableff02::1 tous les nœuds, ff02::2 tous les routeurs
Bouclage, non spécifiée::1, ::la machinetests, adresse source avant configuration

Toute interface IPv6 active possède une adresse lien local, même sans routeur ; unique seulement sur son lien, elle impose parfois de préciser l’interface : ping fe80::1%eth0. Les adresses unique local (RFC 4193) commencent par fd suivi de 40 bits aléatoires, pour qu’une fusion entre deux organisations ne produise pas de collision.

IPv6 ne connaît plus la diffusion générale (broadcast). Une adresse unicast désigne une interface, une adresse multicast un groupe d’interfaces abonnées, une adresse anycast un service porté par plusieurs interfaces dont la plus proche, au sens du routage, répond. L’anycast n’a pas de préfixe dédié : c’est une adresse unicast annoncée à plusieurs endroits. La résolution d’adresses utilise l’adresse multicast de nœud sollicité ff02::1:ffXX:XXXX, qui reprend les 24 derniers bits de l’adresse cherchée, si bien que seules quelques machines reçoivent la question.

Historiquement, l’identifiant d’interface se fabriquait à partir de l’adresse MAC (Media Access Control) selon la méthode EUI-64 (Extended Unique Identifier) : couper l’adresse en deux, insérer fffe au milieu, inverser le septième bit. La MAC 00:1a:2b:3c:4d:5e donne l’identifiant 021a:2bff:fe3c:4d5e. Le procédé a un défaut gênant : l’identifiant suit la machine d’un réseau à l’autre, ce qui permet de la pister partout. Le RFC 8064 recommande désormais des identifiants stables mais opaques (RFC 7217), différents pour chaque préfixe, et les systèmes y ajoutent des adresses temporaires (RFC 8981) renouvelées régulièrement pour les connexions sortantes. Un fffe au milieu d’un identifiant trahit un équipement configuré à l’ancienne.

Les routeurs IPv6 émettent périodiquement, et à la demande, des annonces de routeur (Router Advertisement, ICMPv6 type 134), dans le cadre de NDP (Neighbor Discovery Protocol, RFC 4861). Une annonce contient le ou les préfixes du lien, la durée de validité du routeur comme passerelle et deux drapeaux, M (managed) et O (other configuration). Avec SLAAC (Stateless Address Autoconfiguration, RFC 4862), l’hôte combine le préfixe annoncé et son identifiant d’interface, vérifie que personne n’utilise déjà l’adresse (détection de doublon), et installe une route par défaut vers l’adresse lien local du routeur. Aucun serveur ne tient de registre : commode, et peu traçable.

DHCPv6 (RFC 8415, UDP 546 côté client et 547 côté serveur) attribue des adresses avec état, ou seulement des options (serveurs DNS, domaine) en mode sans état. Particularité qui surprend : DHCPv6 ne fournit pas de route par défaut, qui vient toujours des annonces de routeur. Android ne prend pas en charge l’attribution d’adresses par DHCPv6 avec état : un réseau qui compte uniquement sur DHCPv6 laisse ces terminaux sans adresse globale. Les serveurs DNS peuvent aussi être annoncés directement dans les annonces de routeur (option RDNSS, RFC 8106).

La configuration statique reste la règle pour routeurs, serveurs et services publiés.

L’en-tête de base fait 40 octets fixes : version, classe de trafic, étiquette de flux, longueur de charge, en-tête suivant, limite de sauts, adresses source et destination. Il n’a plus de somme de contrôle, et les routeurs ne fragmentent plus : seule la source fragmente, et chaque lien doit accepter au moins 1 280 octets. La découverte du MTU (Maximum Transmission Unit) du chemin repose donc sur les messages ICMPv6 « Packet Too Big », qu’un filtrage zélé ne doit surtout pas supprimer.

Les options sont reléguées dans des en-têtes d’extension chaînés : saut par saut, routage, fragment, options de destination, AH (Authentication Header) et ESP (Encapsulating Security Payload). Un équipement doit parcourir toute la chaîne pour trouver le port de destination. Le RFC 7112 impose que toute la chaîne figure dans le premier fragment, le RFC 5095 a supprimé l’en-tête de routage de type 0, qui permettait des rebonds et des amplifications, et le RFC 6980 interdit la fragmentation des messages NDP. En pratique, beaucoup de réseaux d’opérateurs écartent les paquets portant des en-têtes d’extension peu courants (RFC 9098) ; une politique raisonnable consiste à autoriser fragment, AH et ESP lorsqu’ils sont utilisés, et à écarter le reste en le journalisant.

Le dual-stack fait tourner IPv4 et IPv6 côte à côte : chaque machine a des adresses des deux familles, et l’application choisit. Les systèmes préfèrent IPv6 (RFC 6724) et les navigateurs lancent les deux tentatives presque en parallèle (Happy Eyeballs, RFC 8305), ce qui masque une panne IPv6 par un repli silencieux sur IPv4.

Un réseau IPv6-only supprime IPv4 côté clients. Pour joindre les services restés en IPv4, une passerelle NAT64 (RFC 6146) traduit les paquets, et un résolveur DNS64 (RFC 6147) fabrique des réponses AAAA synthétiques en plaçant l’adresse IPv4 dans le préfixe 64:ff9b::/96. La limite tient aux adresses IPv4 littérales, qui ne passent pas par le DNS (Domain Name System) ; le mécanisme 464XLAT (RFC 6877), courant sur les réseaux mobiles, ajoute une traduction locale sur le terminal pour les traiter.

Les tunnels transportent IPv6 dans IPv4 quand le chemin ne le route pas : 6in4 (protocole IP 41) entre deux extrémités configurées, 6rd chez certains opérateurs, et à l’inverse DS-Lite, qui transporte IPv4 dans IPv6. Les mécanismes automatiques 6to4 (dépréciés par le RFC 7526) et Teredo (encapsulation dans UDP port 3544, conçue pour traverser la traduction d’adresses) ont surtout laissé un souvenir : celui d’un trafic IPv6 sortant d’un réseau sous l’apparence d’IPv4 ordinaire, hors de toute politique. Un pare-feu doit bloquer le protocole 41 et Teredo, sauf tunnel explicitement prévu.

Un pare-feu IPv6 suit la même logique qu’en IPv4, refus par défaut et ouvertures documentées, avec une différence : ICMPv6 ne se bloque pas en bloc. Le RFC 4890 décrit les messages indispensables : Packet Too Big, Time Exceeded, Parameter Problem, et les messages NDP sur le lien. Sous Linux, une table nftables de famille inet traite les deux protocoles dans les mêmes règles, ce qui évite d’oublier l’un des deux.

Les journaux doivent enregistrer l’adresse complète, et non une forme tronquée. Comme les adresses temporaires changent, il faut aussi conserver les tables de voisinage des routeurs ou les journaux NDP, seule façon de rattacher après coup une adresse à une adresse MAC, donc à une machine.

N’importe quelle machine d’un segment peut émettre des annonces de routeur. Une seule annonce pirate suffit à devenir passerelle par défaut, voire résolveur DNS, pour tout le segment. La parade est RA Guard (RFC 6105) sur les commutateurs, qui n’accepte les annonces que sur les ports désignés vers les routeurs, complétée par un filtrage équivalent pour DHCPv6. Les implémentations naïves de RA Guard se contournent en cachant l’annonce derrière des en-têtes d’extension ou des fragments (RFC 7113) : il faut vérifier que les commutateurs inspectent toute la chaîne.

Le scénario classique : un serveur expose SSH (Secure Shell) à tout le monde, le pare-feu IPv4 le restreint, et personne n’a écrit de règle IPv6. Le service est publié par la porte de derrière.

AdresseLecture
fe80::21a:2bff:fe3c:4d5elien local, identifiant EUI-64 dérivé de la MAC 00:1a:2b:3c:4d:5e
fd3a:91c2:7e04:10::25unique local, sous-réseau 10, hôte numéroté à la main
2001:db8:4f00:12:8c3e:51ff:a07b:e2d1globale de documentation, identifiant opaque ou temporaire
ff02::1:ff7b:e2d1multicast de nœud sollicité pour l’adresse précédente
64:ff9b::c000:221adresse synthétisée par DNS64 pour l’IPv4 192.0.2.33
$ ip -6 addr show dev eth0
inet6 2001:db8:4f00:12:8c3e:51ff:a07b:e2d1/64 scope global temporary dynamic
inet6 2001:db8:4f00:12:5a1:2b3c:4d5e:6f70/64 scope global dynamic mngtmpaddr
inet6 fe80::5a1:2b3c:4d5e:6f70/64 scope link
$ ip -6 route show default
default via fe80::1 dev eth0 proto ra metric 100 expires 1795sec

Trois adresses, dont une temporaire pour les connexions sortantes, et une route par défaut apprise d’une annonce (proto ra) vers l’adresse lien local du routeur. Sous Windows, route print -6 donne la même information.

Symptôme : un balayage externe déclare le port 22 filtré, mais un collègue s’y connecte depuis chez lui.

ss -ltn | grep ':22' # écoute sur 0.0.0.0:22 et [::]:22
curl -4 -v telnet://srv.example.net:22 # échec, filtré
curl -6 -v telnet://srv.example.net:22 # bannière SSH
nft list ruleset | grep -c 'ip6\|inet' # aucune règle IPv6

Le service écoute dans les deux familles, seul IPv4 est filtré. Correction : une règle dans une table inet commune, puis un test dans les deux familles.

Désactiver IPv6 sans stratégie casse des fonctions qui l’utilisent en interne (certains services Windows, par exemple, et Microsoft recommande de préférer IPv4 plutôt que de désactiver IPv6), tout en laissant souvent des équipements où il reste actif.

Filtrer IPv4 en oubliant IPv6 produit le contournement décrit plus haut, de façon parfaitement reproductible.

Confondre absence de NAT (Network Address Translation) et absence de pare-feu revient à croire qu’une adresse globale expose forcément une machine. Un pare-feu à états qui refuse les connexions entrantes non sollicitées protège autant qu’en IPv4 ; la traduction d’adresses n’a jamais été un filtre, comme le rappelle la fiche NAT, translations et publication.

IPv6-only et dual-stack : dans le premier, les clients n’ont plus d’IPv4 et passent par NAT64 pour les services anciens ; dans le second, les deux protocoles circulent en parallèle et doivent être filtrés tous les deux.

SLAAC et DHCPv6 : SLAAC laisse l’hôte fabriquer son adresse à partir d’une annonce, sans registre central ; DHCPv6 attribue et trace, mais ne donne jamais la route par défaut.

Unique local et privé IPv4 : les ULA ressemblent aux plages du RFC 1918, mais elles sont probabilistiquement uniques, coexistent avec des adresses globales et n’appellent aucune traduction. Ni l’une ni l’autre ne protège rien ; c’est le travail du filtrage, détaillé dans Filtrage, segmentation et NAC, et du plan d’adressage, dont la logique est la même qu’en IPv4, CIDR et plans d’adressage.

Un réseau qui laisse IPv6 actif sans le gérer héberge un second réseau que personne ne regarde : les machines s’y attribuent des adresses seules, les services y répondent, et le filtrage conçu pour IPv4 ne s’y applique pas. Une seule annonce de routeur malveillante suffit alors à faire passer le trafic d’un segment entier par une machine hostile, sans toucher à la moindre règle existante. Les tunnels de transition ajoutent des chemins que le pare-feu voit comme du trafic ordinaire. Et lorsque les journaux n’enregistrent que les adresses IPv4, l’enquête après incident perd la trace précisément des échanges qui ont contourné le contrôle.

Chaque machine connectée à un réseau a besoin d’une adresse. L’ancien système d’adressage, IPv4, quatrième version du protocole Internet, n’a plus assez d’adresses pour tout le monde. IPv6, sa sixième version, utilise des adresses beaucoup plus longues, écrites avec des chiffres et des lettres de a à f, et abrégées en supprimant les suites de zéros. Une adresse IPv6 se compose d’un préfixe, qui désigne le réseau, et d’un identifiant, qui désigne l’interface de la machine. Une machine possède souvent plusieurs adresses selon leur portée : une adresse locale au lien, valable seulement sur le câble ou le réseau sans fil auquel elle est reliée, une adresse locale unique pour l’intérieur de l’organisation, et une adresse globale joignable depuis Internet. Pour obtenir ces adresses, la machine peut écouter les annonces que diffusent les routeurs et fabriquer seule son adresse, interroger un serveur de configuration, ou recevoir une adresse fixée à la main. Pendant la transition, les deux versions fonctionnent souvent en parallèle sur les mêmes machines ; des tunnels transportent IPv6 à l’intérieur d’IPv4, et des passerelles traduisent de l’une à l’autre. Le danger vient de là : si le pare-feu filtre IPv4 mais pas IPv6, un service reste accessible par la seconde voie. Une machine malveillante peut aussi envoyer de fausses annonces de routeur et détourner le trafic.

À lire aussi

Pages voisines

: les deux pages se citent l’une l’autre.