Protocole de découverte de voisins IPv6 (NDP) : comment les appareils se trouvent entre eux
Plongée approfondie dans NDP, le protocole qui remplace ARP dans IPv6. Découvrez la sollicitation de routeur, la sollicitation de voisin et le fonctionnement de la résolution d'adresse.
NDP remplace bien plus qu'ARP#
Dans IPv4, la résolution d'adresse utilise ARP, un protocole de couche 2 distinct. La découverte de routeur utilise ICMP Router Discovery ou DHCP. Les messages de redirection utilisent ICMP. La détection d'adresses dupliquées n'existe pas du tout.
IPv6 consolide toutes ces fonctions dans le protocole de découverte de voisins. NDP gère :
- La résolution d'adresse (travail d'ARP)
- La découverte de routeur (trouver les passerelles par défaut)
- La découverte de préfixe (apprendre les préfixes réseau pour l'autoconfiguration)
- La découverte de paramètres (MTU, limite de saut)
- L'autoconfiguration d'adresse (SLAAC)
- La détection d'adresses dupliquées (prévenir les conflits)
- L'accessibilité des voisins (mon voisin est-il toujours là ?)
- La détermination du prochain saut (quel routeur dois-je utiliser ?)
- Les messages de redirection (de meilleures routes existent)
NDP fonctionne entièrement sur ICMPv6, en utilisant cinq types de messages (133-137). Ce n'est pas optionnel. Bloquez NDP et IPv6 cesse de fonctionner.
TL;DR - Résumé rapide
Points clés :
- NDP consolide ARP, découverte de routeur et autoconfiguration en un seul protocole fonctionnant sur ICMPv6
- Cinq types de messages (133-137) gèrent tout, de la résolution d'adresse aux annonces de routeur
- Sécurité : tous les messages NDP nécessitent Hop Limit 255 pour empêcher les attaques hors lien
Aller à : Router Advertisement pour les détails SLAAC, Résolution d'adresse en action pour des exemples pratiques, ou Dépannage pour les problèmes courants.
Les cinq types de messages NDP#
Tous les messages NDP sont des paquets ICMPv6 avec des numéros de type spécifiques. Comprendre ces cinq messages signifie comprendre comment les réseaux IPv6 fonctionnent au niveau fondamental.
| Type | Nom | Envoyé par | Objectif | Destination |
|---|---|---|---|---|
| 133 | Router Solicitation (RS) | Hôtes | Demander des informations de routeur | ff02::2 (tous les routeurs) |
| 134 | Router Advertisement (RA) | Routeurs | Annoncer la présence et la config | ff02::1 (tous les nœuds) ou unicast |
| 135 | Neighbor Solicitation (NS) | N'importe quel nœud | Résolution d'adresse, accessibilité | Multicast solicited-node ou unicast |
| 136 | Neighbor Advertisement (NA) | N'importe quel nœud | Réponse à NS | Unicast ou ff02::1 |
| 137 | Redirect | Routeurs | Un meilleur prochain saut existe | Unicast (expéditeur original) |
Chaque message NDP a une exigence de sécurité commune : la limite de saut doit être de 255. Cela empêche les attaques hors lien car les routeurs décrémentent la limite de saut. Les paquets provenant d'attaquants distants arrivent avec une limite de saut < 255 et sont supprimés.
Router Solicitation (Type 133)#
Les hôtes envoient des sollicitations de routeur lorsqu'ils veulent que les routeurs s'annoncent immédiatement au lieu d'attendre la prochaine annonce de routeur planifiée.
Structure ICMPv6 :
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Type | Code | Checksum |
| (133) | (0) | |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Reserved |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Options ...
+-+-+-+-+-+-+-+-+-+-+-+-Champs :
- Type : 133
- Code : 0
- Reserved : 32 bits, doit être zéro
- Options : Source Link-Layer Address (optionnel, inclure si l'adresse source n'est pas ::)
Quand envoyé :
- L'interface se lève
- L'hôte démarre
- La pile IPv6 s'initialise
- L'hôte a besoin de configuration rapidement
Adresse source :
- Adresse link-local (si configurée)
- :: (non spécifiée, si pas encore d'adresse)
Destination : ff02::2 (adresse multicast tous les routeurs)
Limite de saut : 255 (requis)
Exemple de paquet :
En-tête IPv6:
Source: fe80::a4b2:c3d4:e5f6:7890
Destination: ff02::2
Next Header: 58 (ICMPv6)
Hop Limit: 255
ICMPv6:
Type: 133 (Router Solicitation)
Code: 0
Options:
Source Link-Layer Address: 00:1a:2b:3c:4d:5eLimitation de débit :
Les hôtes ne doivent pas envoyer de sollicitations de routeur trop fréquemment. Le RFC 4861 recommande un maximum d'une fois toutes les 3 secondes. Cela empêche d'inonder les routeurs pendant l'instabilité du réseau.
Pourquoi c'est important :
Sans RS, les hôtes attendraient les annonces de routeur périodiques (envoyées toutes les quelques minutes). RS permet aux hôtes d'obtenir une configuration en secondes au lieu de minutes, accélérant l'initialisation du réseau.
Router Advertisement (Type 134)#
Les routeurs envoient des annonces de routeur pour annoncer leur présence, publier les préfixes réseau et fournir des paramètres de configuration. C'est le fondement de l'autoconfiguration d'adresse sans état (SLAAC).
Structure ICMPv6 :
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Type | Code | Checksum |
| (134) | (0) | |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Cur Hop Limit |M|O|H|Prf|Resvd| Router Lifetime |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Reachable Time |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Retrans Timer |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Options ...
+-+-+-+-+-+-+-+-+-+-+-+-Champs :
Cur Hop Limit (8 bits) : Valeur recommandée pour le champ Hop Limit dans les paquets sortants. Typiquement 64. Les hôtes copient cela dans le champ Hop Limit de leur en-tête IPv6.
Drapeaux (8 bits) :
- M (Managed Address Configuration) : Utiliser DHCPv6 pour les adresses
- O (Other Configuration) : Utiliser DHCPv6 pour d'autres configurations (DNS, NTP, etc.)
- H (Home Agent) : Le routeur est un agent domestique IPv6 mobile (rarement utilisé)
- Prf (Router Preference) : Préférence 2 bits (00=moyen, 01=élevé, 11=faible)
- Reserved : 3 bits
Router Lifetime (16 bits) : Combien de temps (en secondes) utiliser ce routeur comme passerelle par défaut. 0 signifie « pas un routeur par défaut ». Maximum 9000 secondes (2,5 heures).
Reachable Time (32 bits) : Combien de temps (en millisecondes) considérer un voisin accessible après avoir reçu une confirmation d'accessibilité. 0 signifie non spécifié (utiliser la valeur par défaut ou précédemment reçue).
Retrans Timer (32 bits) : Temps entre les retransmissions de sollicitations de voisin (en millisecondes). Utilisé pour la résolution d'adresse et la détection d'inaccessibilité de voisin.
Options communes :
Source Link-Layer Address (Type 1) : Adresse MAC du routeur. Permet aux hôtes de sauter la sollicitation de voisin pour le routeur.
MTU (Type 5) : MTU recommandé pour le lien. Typiquement 1500.
Prefix Information (Type 3) : Préfixes réseau pour l'autoconfiguration d'adresse. C'est l'option critique pour SLAAC.
RDNSS (Type 25) : Adresses de serveur DNS récursif. RFC 8106.
DNSSL (Type 31) : Liste de recherche DNS. RFC 8106.
Quand envoyé :
- Périodiquement (toutes les 200-600 secondes, typiquement 200)
- En réponse à une sollicitation de routeur
- Quand la configuration du routeur change
Source : Adresse link-local du routeur (fe80::/10)
Destination :
- ff02::1 (multicast tous les nœuds) pour les annonces périodiques
- Unicast vers l'hôte sollicitant lors de la réponse à RS
Limite de saut : 255 (requis)
Exemple de paquet :
En-tête IPv6:
Source: fe80::1
Destination: ff02::1
Next Header: 58 (ICMPv6)
Hop Limit: 255
ICMPv6:
Type: 134 (Router Advertisement)
Code: 0
Cur Hop Limit: 64
Flags: M=0, O=0 (SLAAC uniquement)
Router Lifetime: 1800 secondes (30 minutes)
Reachable Time: 30000 ms
Retrans Timer: 1000 ms
Options:
Source Link-Layer Address: 00:11:22:33:44:55
MTU: 1500
Prefix Information:
Prefix: 2001:db8:1234:5678::/64
Valid Lifetime: 86400 (24 heures)
Preferred Lifetime: 14400 (4 heures)
Flags: L=1 (on-link), A=1 (autonome/SLAAC)
RDNSS:
Lifetime: 3600
Addresses: 2001:4860:4860::8888, 2001:4860:4860::8844Combinaisons de drapeaux :
| M | O | Comportement |
|---|---|---|
| 0 | 0 | SLAAC uniquement, pas de DHCPv6 (le plus commun) |
| 0 | 1 | SLAAC pour les adresses, DHCPv6 pour DNS/NTP/etc. |
| 1 | 0 | DHCPv6 pour les adresses (inhabituel, rarement utilisé) |
| 1 | 1 | DHCPv6 pour tout (réseaux d'entreprise) |
Option Prefix Information :
Cette option est ce qui rend SLAAC possible. Elle indique aux hôtes quel préfixe réseau utiliser lors de l'autoconfiguration des adresses.
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Type | Length | Prefix Length |L|A|R|Reserved1|
| (3) | (4) | | | | | |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Valid Lifetime |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Preferred Lifetime |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Reserved2 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
+ +
| |
+ Prefix +
| |
+ +
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+Champs :
- Prefix Length : Habituellement 64 pour SLAAC
- Drapeau L : On-link (le préfixe est sur le lien local)
- Drapeau A : Autonome (utiliser pour SLAAC)
- Drapeau R : Adresse de routeur (le préfixe contient l'ID d'interface du routeur)
- Valid Lifetime : Combien de temps les adresses sont valides (typiquement 86400 = 24 heures)
- Preferred Lifetime : Combien de temps utiliser les adresses pour de nouvelles connexions (typiquement 14400 = 4 heures)
- Prefix : Le préfixe réseau réel (par exemple, 2001:db8:1234:5678::)
Quand A=1, les hôtes génèrent des adresses en combinant le préfixe avec un identifiant d'interface :
Préfixe de RA : 2001:db8:1234:5678::/64
ID d'interface : a4b2:c3d4:e5f6:7890 (dérivé de MAC ou aléatoire)
Adresse résultante : 2001:db8:1234:5678:a4b2:c3d4:e5f6:7890Les annonces de routeur sont critiques
Bloquez ICMPv6 type 134 et SLAAC cesse de fonctionner. Les hôtes n'auront que des adresses link-local (fe80::/10) sans connectivité globale. C'est l'une des mauvaises configurations IPv6 les plus courantes : des pare-feu qui bloquent tous les ICMPv6 sans comprendre quels types sont essentiels.
Neighbor Solicitation (Type 135)#
La sollicitation de voisin est le remplacement d'ARP par IPv6. Elle résout les adresses IPv6 en adresses de couche liaison (MAC) et vérifie que les voisins sont toujours accessibles.
Structure ICMPv6 :
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Type | Code | Checksum |
| (135) | (0) | |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Reserved |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
+ +
| |
+ Target Address +
| |
+ +
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Options ...
+-+-+-+-+-+-+-+-+-+-+-+-Champs :
- Type : 135
- Code : 0
- Reserved : 32 bits, doit être zéro
- Target Address : Adresse IPv6 interrogée
- Options : Source Link-Layer Address (incluse sauf si la source est ::)
Trois cas d'utilisation :
1. Résolution d'adresse (remplacement ARP)#
L'hôte A doit envoyer un paquet à l'hôte B sur le même lien mais ne connaît pas l'adresse MAC de B.
Processus :
- A vérifie son cache de voisins, pas d'entrée pour B
- A envoie NS à l'adresse multicast solicited-node de B
- B reçoit NS et répond avec NA contenant son MAC
- A met en cache le mappage et envoie le paquet original
Exemple :
# L'hôte A veut envoyer à 2001:db8::10
En-tête IPv6:
Source: 2001:db8::1
Destination: ff02::1:ff00:10 (multicast solicited-node)
Hop Limit: 255
ICMPv6:
Type: 135 (Neighbor Solicitation)
Target Address: 2001:db8::10
Options:
Source Link-Layer Address: 00:1a:2b:3c:4d:5eCalcul d'adresse multicast solicited-node :
IPv6 utilise le multicast solicited-node au lieu de la diffusion pour l'efficacité. Seuls les hôtes avec des adresses similaires écoutent chaque groupe solicited-node.
Formule : ff02::1:ff + derniers 24 bits de l'adresse cible
Exemples :
2001:db8::10 -> ff02::1:ff00:10
2001:db8::a4b2:c3d4:e5f6:7890 -> ff02::1:ff:f6:7890
fe80::1 -> ff02::1:ff00:1Cela réduit le traitement inutile. Dans IPv4, les diffusions ARP atteignent chaque hôte sur le réseau. Dans IPv6, seuls les hôtes dont les adresses se terminent par les mêmes 24 bits rejoignent le groupe multicast et reçoivent le NS.
2. Détection d'inaccessibilité de voisin (NUD)#
Vérifier qu'un voisin précédemment accessible est toujours accessible.
Processus :
- L'hôte n'a pas reçu de trafic du voisin récemment
- L'hôte envoie NS (unicast) au voisin
- Si NA reçu, le voisin est accessible
- Si pas de réponse après plusieurs tentatives, le voisin est considéré inaccessible
Exemple :
En-tête IPv6:
Source: 2001:db8::1
Destination: 2001:db8::10 (unicast vers le voisin)
Hop Limit: 255
ICMPv6:
Type: 135 (Neighbor Solicitation)
Target Address: 2001:db8::10
Options:
Source Link-Layer Address: 00:1a:2b:3c:4d:5eNUD s'exécute automatiquement en arrière-plan. Lorsque les hôtes envoient du trafic, ils suivent si les voisins répondent. Si un voisin devient silencieux, NUD vérifie l'accessibilité avant de le déclarer mort.
3. Détection d'adresses dupliquées (DAD)#
Avant d'utiliser une adresse IPv6, les hôtes effectuent DAD pour s'assurer qu'aucun autre nœud ne l'utilise. Cela empêche les conflits d'adresses dans SLAAC.
Processus :
- L'hôte génère une adresse provisoire (via SLAAC, DHCPv6 ou configuration manuelle)
- L'hôte envoie NS avec la source :: et la cible = adresse provisoire
- Si quelqu'un répond avec NA, l'adresse est déjà utilisée (conflit)
- Si pas de réponse après expiration, l'adresse est unique et peut être utilisée
Exemple :
# L'hôte veut utiliser 2001:db8::a4b2:c3d4:e5f6:7890
# Envoie d'abord DAD NS
En-tête IPv6:
Source: :: (adresse non spécifiée, l'hôte n'a pas encore d'adresse)
Destination: ff02::1:ff:f6:7890 (multicast solicited-node)
Hop Limit: 255
ICMPv6:
Type: 135 (Neighbor Solicitation)
Target Address: 2001:db8::a4b2:c3d4:e5f6:7890
Options: (aucune, la source est ::)Si un autre hôte utilise cette adresse, il envoie une annonce de voisin. L'hôte demandeur détecte le conflit et doit choisir une adresse différente.
Délai DAD : Typiquement 1 seconde. L'hôte attend ce temps pour une réponse. Si silence, l'adresse est supposée unique.
Problème de sécurité : DAD n'a pas d'authentification. Un attaquant peut répondre à chaque demande DAD, empêchant les hôtes de configurer des adresses. C'est ce qu'on appelle une attaque DAD DoS. Les solutions incluent SEND (Secure Neighbor Discovery) ou RA Guard, mais l'adoption est limitée.
Neighbor Advertisement (Type 136)#
Envoyé en réponse à une sollicitation de voisin ou non sollicité pour annoncer des changements d'adresse/couche liaison.
Structure ICMPv6 :
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Type | Code | Checksum |
| (136) | (0) | |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|R|S|O| Reserved |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
+ +
| |
+ Target Address +
| |
+ +
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Options ...
+-+-+-+-+-+-+-+-+-+-+-+-Champs :
Drapeaux :
- R (Router) : L'expéditeur est un routeur
- S (Solicited) : L'annonce est une réponse à NS
- O (Override) : Remplacer l'entrée de cache existante
Target Address : Adresse pour laquelle cette annonce est envoyée
Options : Target Link-Layer Address (adresse MAC)
Quand envoyé :
- Réponse à une sollicitation de voisin (S=1)
- Annonce non sollicitée de changement d'adresse (S=0)
- NA gratuite pour mettre à jour les voisins après un changement d'adresse de couche liaison
Destination :
- Unicast vers le nœud sollicitant (lors de la réponse à NS)
- ff02::1 (tous les nœuds) pour les annonces non sollicitées
Limite de saut : 255 (requis)
Exemple de réponse à NS :
En-tête IPv6:
Source: 2001:db8::10
Destination: 2001:db8::1 (unicast vers le demandeur)
Hop Limit: 255
ICMPv6:
Type: 136 (Neighbor Advertisement)
Flags: R=0, S=1 (réponse sollicitée), O=1 (override)
Target Address: 2001:db8::10
Options:
Target Link-Layer Address: 00:aa:bb:cc:dd:eeSignifications des drapeaux :
S=1 : C'est une réponse à votre NS. Mettez à jour votre cache.
S=0 : Annonce non sollicitée. J'ai changé quelque chose.
O=1 : Remplacez votre entrée de cache existante avec cette information.
O=0 : Mettez à jour le cache uniquement si aucune entrée n'existe.
Exemple de NA non sollicitée :
L'hôte change son adresse MAC (rare, mais arrive avec les machines virtuelles ou la reconfiguration d'interface). Il envoie une NA non sollicitée pour mettre à jour les voisins :
En-tête IPv6:
Source: 2001:db8::10
Destination: ff02::1 (tous les nœuds)
Hop Limit: 255
ICMPv6:
Type: 136 (Neighbor Advertisement)
Flags: R=0, S=0 (non sollicitée), O=1 (override)
Target Address: 2001:db8::10
Options:
Target Link-Layer Address: 00:ff:ee:dd:cc:bb (nouvelle MAC)Tous les voisins reçoivent cela et mettent à jour leurs caches.
Redirect (Type 137)#
Les routeurs envoient des messages de redirection pour informer les hôtes qu'un meilleur routeur de premier saut existe pour une destination spécifique.
Structure ICMPv6 :
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Type | Code | Checksum |
| (137) | (0) | |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Reserved |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
+ +
| |
+ Target Address +
| |
+ +
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
+ +
| |
+ Destination Address +
| |
+ +
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Options ...
+-+-+-+-+-+-+-+-+-+-+-+-Champs :
- Type : 137
- Code : 0
- Target Address : Meilleur routeur de prochain saut (ou destination si on-link)
- Destination Address : Destination qui devrait utiliser la meilleure route
- Options : Target Link-Layer Address, Redirected Header (portion du paquet original)
Quand envoyé :
Le routeur R1 reçoit un paquet de l'hôte A destiné à l'hôte B. R1 sait que le routeur R2 (sur le même lien que A) est un meilleur prochain saut pour B. R1 transmet le paquet à R2 ET envoie une redirection à A lui indiquant d'utiliser R2 directement à l'avenir.
Exemple de scénario :
Topologie réseau :
Hôte A : 2001:db8:1::10
Routeur R1 : 2001:db8:1::1 (passerelle par défaut pour A)
Routeur R2 : 2001:db8:1::2 (meilleure route vers 2001:db8:2::/64)
Destination B : 2001:db8:2::20
Flux :
1. A envoie un paquet à B via R1 (passerelle par défaut)
2. R1 voit que R2 est un meilleur prochain saut pour 2001:db8:2::/64
3. R1 transmet le paquet à R2
4. R1 envoie une redirection à A :
Target Address : 2001:db8:1::2 (R2)
Destination Address : 2001:db8:2::20 (B)
5. A met à jour la table de routage : utiliser R2 pour 2001:db8:2::/64
6. Les paquets futurs de A vers B vont directement à R2Message de redirection de R1 à A :
En-tête IPv6:
Source: fe80::1 (link-local de R1)
Destination: 2001:db8:1::10 (Hôte A)
Hop Limit: 255
ICMPv6:
Type: 137 (Redirect)
Target Address: fe80::2 (R2, meilleur prochain saut)
Destination Address: 2001:db8:2::20 (B, destination à atteindre via R2)
Options:
Target Link-Layer Address: 00:11:22:33:44:55 (MAC de R2)
Redirected Header: (en-tête du paquet original qui a déclenché la redirection)Considérations de sécurité :
Les messages de redirection peuvent être abusés. Un attaquant sur le lien local pourrait envoyer des redirections malveillantes pour :
- Router le trafic via la machine de l'attaquant (man-in-the-middle)
- Créer un trou noir pour le trafic en redirigeant vers un routeur inexistant
- Créer des boucles de routage
Protections :
- SEND (Secure Neighbor Discovery) authentifie les messages de redirection
- De nombreux hôtes ignorent les redirections des routeurs non-passerelle-par-défaut
- Certains réseaux soucieux de la sécurité désactivent entièrement le traitement des redirections
- Les redirections doivent provenir du routeur de premier saut actuel (vérifié par les hôtes)
Devriez-vous autoriser les redirections ?
Réseaux domestiques/petits : Sûr. Optimise le routage lorsque plusieurs routeurs existent.
Réseaux d'entreprise : Souvent désactivé. Les tables de routage contrôlées et les risques de sécurité potentiels l'emportent sur les avantages.
Centres de données : Généralement désactivé. Le routage statique ou les protocoles dynamiques (BGP, OSPF) gèrent les routes.
Résolution d'adresse en action#
Traçons le processus complet de l'hôte A envoyant un paquet à l'hôte B sur le même lien.
État initial :
- Hôte A : 2001:db8::1 (MAC : aa:aa:aa:aa:aa:aa)
- Hôte B : 2001:db8::10 (MAC : bb:bb:bb:bb:bb:bb)
- Le cache de voisins de A est vide
Étape 1 : L'application initie la connexion
# Sur l'hôte A
ping6 2001:db8::10Étape 2 : Vérifier le cache de voisins
# A vérifie le cache de voisins
ip -6 neigh show 2001:db8::10
# (vide, pas d'entrée)Étape 3 : Envoyer une sollicitation de voisin
A envoie NS à l'adresse multicast solicited-node :
En-tête IPv6:
Source: 2001:db8::1
Destination: ff02::1:ff00:10 (solicited-node pour 2001:db8::10)
Hop Limit: 255
En-tête Ethernet:
Source MAC: aa:aa:aa:aa:aa:aa
Dest MAC: 33:33:ff:00:00:10 (MAC multicast pour ff02::1:ff00:10)
ICMPv6:
Type: 135 (Neighbor Solicitation)
Target Address: 2001:db8::10
Options:
Source Link-Layer Address: aa:aa:aa:aa:aa:aaÉtape 4 : B reçoit NS
L'hôte B écoute ff02::1:ff00:10 (parce que son adresse se termine par :10). Il reçoit le NS et le traite.
Étape 5 : B envoie une annonce de voisin
En-tête IPv6:
Source: 2001:db8::10
Destination: 2001:db8::1 (unicast vers A)
Hop Limit: 255
En-tête Ethernet:
Source MAC: bb:bb:bb:bb:bb:bb
Dest MAC: aa:aa:aa:aa:aa:aa
ICMPv6:
Type: 136 (Neighbor Advertisement)
Flags: R=0, S=1 (sollicitée), O=1 (override)
Target Address: 2001:db8::10
Options:
Target Link-Layer Address: bb:bb:bb:bb:bb:bbÉtape 6 : A met à jour le cache de voisins
# Le cache de voisins de A a maintenant une entrée
ip -6 neigh show 2001:db8::10
# 2001:db8::10 dev eth0 lladdr bb:bb:bb:bb:bb:bb REACHABLEÉtape 7 : A envoie le paquet original
Maintenant que A connaît le MAC de B, il envoie le paquet ping :
En-tête IPv6:
Source: 2001:db8::1
Destination: 2001:db8::10
En-tête Ethernet:
Source MAC: aa:aa:aa:aa:aa:aa
Dest MAC: bb:bb:bb:bb:bb:bb (appris du NA)
ICMPv6:
Type: 128 (Echo Request)Temps total : Millisecondes. Le processus est invisible pour les applications.
États du cache de voisins#
Les entrées du cache de voisins passent par plusieurs états pendant que NUD suit l'accessibilité.
| État | Signification | Action suivante |
|---|---|---|
| INCOMPLETE | NS envoyé, attente de NA | Expiration ou réception de NA |
| REACHABLE | NA reçu récemment, confirmé accessible | Envoyer du trafic ou expiration |
| STALE | Entrée ancienne, pas confirmée récemment | Envoyer du trafic (déclenche la sonde) |
| DELAY | Trafic envoyé à une entrée périmée, attente | L'expiration déclenche la sonde |
| PROBE | Envoi de NS pour vérifier l'accessibilité | Recevoir NA ou expiration |
| FAILED | Pas de réponse aux sondes | Supprimer l'entrée |
Transitions d'état :
INCOMPLETE --NA reçu--> REACHABLE
REACHABLE --expiration--> STALE
STALE --trafic envoyé--> DELAY
DELAY --expiration--> PROBE
PROBE --NA reçu--> REACHABLE
PROBE --expiration--> FAILEDVérifier le cache de voisins (Linux) :
ip -6 neigh show
# Exemple de sortie :
# 2001:db8::1 dev eth0 lladdr aa:aa:aa:aa:aa:aa REACHABLE
# 2001:db8::10 dev eth0 lladdr bb:bb:bb:bb:bb:bb STALE
# fe80::1 dev eth0 lladdr cc:cc:cc:cc:cc:cc DELAYTemporisateurs :
- Expiration REACHABLE : 30 secondes (configurable, du temps accessible RA)
- Expiration DELAY : 5 secondes avant la transition vers PROBE
- Intervalle de retransmission : 1 seconde (configurable, du temporisateur de retransmission RA)
- MAX_MULTICAST_SOLICIT : 3 tentatives avant de déclarer FAILED
Ceux-ci garantissent que les voisins morts sont détectés rapidement tout en minimisant le trafic NUD inutile.
SLAAC : autoconfiguration d'adresse#
La combinaison des annonces de routeur avec la détection d'adresses dupliquées crée l'autoconfiguration d'adresse sans état. Les hôtes se configurent eux-mêmes sans serveurs DHCP.
Processus SLAAC complet :
Étape 1 : L'interface se lève
L'hôte active IPv6 sur l'interface eth0.
Étape 2 : Générer une adresse link-local
fe80:: + identifiant d'interface
fe80::a4b2:c3d4:e5f6:7890 (si utilisation d'IID dérivé de MAC)
fe80::1234:5678:9abc:def0 (si utilisation d'IID aléatoire)Étape 3 : Effectuer DAD sur link-local
Envoyer NS avec la source :: pour vérifier que l'adresse fe80:: est unique.
Étape 4 : Envoyer une sollicitation de routeur
En-tête IPv6:
Source: fe80::a4b2:c3d4:e5f6:7890
Destination: ff02::2
Hop Limit: 255
ICMPv6:
Type: 133 (Router Solicitation)Étape 5 : Recevoir une annonce de routeur
ICMPv6:
Type: 134 (Router Advertisement)
Flags: M=0, O=0 (SLAAC)
Prefix Information:
Prefix: 2001:db8:1234:5678::/64
Flags: A=1 (autonome)
Valid Lifetime: 86400
Preferred Lifetime: 14400Étape 6 : Générer une adresse globale
Préfixe : 2001:db8:1234:5678::/64
IID : a4b2:c3d4:e5f6:7890
Résultat : 2001:db8:1234:5678:a4b2:c3d4:e5f6:7890Étape 7 : Effectuer DAD sur l'adresse globale
Envoyer NS pour vérifier que 2001:db8:1234:5678:a4b2:c3d4:e5f6:7890 est unique.
Étape 8 : Configurer l'adresse
ip -6 addr show eth0
# Sortie :
# inet6 2001:db8:1234:5678:a4b2:c3d4:e5f6:7890/64 scope global dynamic
# inet6 fe80::a4b2:c3d4:e5f6:7890/64 scope linkÉtape 9 : Définir la route par défaut
Utiliser l'adresse link-local du routeur comme passerelle par défaut :
ip -6 route show
# Sortie :
# default via fe80::1 dev eth0 metric 1024
# 2001:db8:1234:5678::/64 dev eth0 proto kernel metric 256Temps total : Quelques secondes.
Extensions de confidentialité (RFC 4941) :
Les IID dérivés de MAC sont traçables sur les réseaux. Les extensions de confidentialité génèrent des IID aléatoires qui changent périodiquement.
Original : 2001:db8:1234:5678:a4b2:c3d4:e5f6:7890 (statique)
Confidentialité : 2001:db8:1234:5678:1a2b:3c4d:5e6f:7a8b (change quotidiennement)La plupart des systèmes d'exploitation modernes activent les extensions de confidentialité par défaut pour les connexions sortantes tout en conservant l'adresse stable pour les connexions entrantes.
Considérations de sécurité#
NDP a des vulnérabilités car il a été conçu en supposant des réseaux locaux de confiance. Les attaquants sur le même lien peuvent :
Annonces de routeur malveillantes#
L'attaquant envoie de fausses RA avec :
- Mauvais préfixe (trou noir pour le trafic ou routage via l'attaquant)
- Durées de vie courtes (forcer le retraitement fréquent des RA)
- Drapeau M=1 (forcer DHCPv6 vers le serveur de l'attaquant)
Impact : Contrôle total sur la configuration de l'hôte.
Atténuation :
- RA Guard : Fonctionnalité de commutateur qui bloque les RA des ports non-routeur
- SEND (Secure Neighbor Discovery) : Authentification cryptographique (complexe, rarement déployée)
- Préférence de routeur : Utiliser des valeurs de préférence élevées sur les routeurs légitimes
Usurpation d'annonces de voisin#
L'attaquant envoie de faux NA prétendant être un autre hôte.
Impact : Attaques man-in-the-middle, interception de trafic.
Atténuation :
- SEND : Authentifie les NA
- Sécurité des ports : Les commutateurs appliquent les liaisons d'adresses MAC
- Surveillance : Détecter les adresses MAC dupliquées
DAD DoS#
L'attaquant répond à chaque demande DAD, empêchant la configuration d'adresse.
Impact : Les hôtes ne peuvent pas obtenir d'adresses, pas de connectivité.
Atténuation :
- SEND : Authentifie les messages DAD
- Limitation de débit : Limiter les NA d'une seule source
- Adresses statiques : Contourner complètement SLAAC (pas évolutif)
Attaques de redirection#
L'attaquant envoie de fausses redirections routant le trafic via l'attaquant.
Impact : Man-in-the-middle, interception de trafic.
Atténuation :
- Désactiver les redirections : De nombreux systèmes d'exploitation permettent de désactiver le traitement des redirections
- SEND : Authentifie les redirections
- Vérifier la source : Les hôtes doivent vérifier que les redirections proviennent du routeur de premier saut actuel
Réalité : La plupart des réseaux n'utilisent pas SEND en raison de la complexité. RA Guard sur les commutateurs est la défense pratique pour les réseaux d'entreprise.
Dépannage des problèmes NDP#
L'hôte n'a pas d'adresse globale#
Symptômes :
- Seulement des adresses fe80::
- Peut ping link-local, pas global
- Pas de route par défaut
Diagnostic :
# Vérifier les annonces de routeur
sudo tcpdump -i eth0 -vv 'icmp6 && ip6[40] == 134'
# Vérifier l'acceptation de RA
sysctl net.ipv6.conf.eth0.accept_ra
# Devrait être 1 ou 2 pour les hôtes
# Envoyer manuellement RS
rdisc6 eth0Causes courantes :
- Pas de routeur sur le lien
- Pare-feu bloquant le type 134
- accept_ra désactivé
- Transfert IPv6 activé (désactive le traitement RA)
Correction : Activer le routeur, autoriser ICMPv6 type 134, définir accept_ra=1.
Cache de voisins toujours FAILED#
Symptômes :
- Ne peut pas atteindre les voisins
- NS envoyé mais pas de NA reçu
- Cache de voisins affiche FAILED
Diagnostic :
# Surveiller l'échange NS/NA
sudo tcpdump -i eth0 -vv 'icmp6 && (ip6[40] == 135 || ip6[40] == 136)'
# Vérifier le cache de voisins
ip -6 neigh show
# NS manuel (outil Linux ndisc6)
ndisc6 2001:db8::10 eth0Causes courantes :
- Pare-feu bloquant les types 135/136
- IPv6 désactivé sur l'hôte cible
- Commutateur filtrant le multicast
- Mauvais lien (cible sur un sous-réseau différent)
Correction : Autoriser NDP à travers les pare-feu, vérifier qu'IPv6 est activé sur la cible.
Échecs DAD#
Symptômes :
- L'adresse affiche « dadfailed »
- L'interface ne peut pas configurer l'adresse
- Les journaux du noyau montrent des conflits DAD
Diagnostic :
# Vérifier l'état de l'adresse
ip -6 addr show eth0
# Exemple de sortie avec échec DAD :
# inet6 2001:db8::10/64 scope global tentative dadfailed
# Vérifier le duplicata
ping6 -c 1 2001:db8::10Causes courantes :
- Un autre hôte utilise la même adresse
- Attaquant usurpant NA (DAD DoS)
- Machines virtuelles avec des adresses MAC clonées
Correction : Changer l'adresse, enquêter sur les hôtes dupliqués, vérifier la configuration VM.
Exemples pratiques avec des outils#
Surveillance de NDP avec tcpdump#
# Tout le trafic NDP
sudo tcpdump -i eth0 -vv 'icmp6 && ip6[40] >= 133 && ip6[40] <= 137'
# Annonces de routeur uniquement
sudo tcpdump -i eth0 -vv 'icmp6 && ip6[40] == 134'
# Résolution d'adresse (NS/NA)
sudo tcpdump -i eth0 -vv 'icmp6 && (ip6[40] == 135 || ip6[40] == 136)'
# Filtrer par adresse cible
sudo tcpdump -i eth0 -vv 'icmp6 && ip6[40] == 135' | grep '2001:db8::10'Gestion manuelle du cache de voisins#
# Afficher tous les voisins
ip -6 neigh show
# Afficher un voisin spécifique
ip -6 neigh show 2001:db8::10
# Supprimer l'entrée (forcer la re-résolution)
sudo ip -6 neigh del 2001:db8::10 dev eth0
# Ajouter une entrée statique
sudo ip -6 neigh add 2001:db8::10 lladdr aa:bb:cc:dd:ee:ff dev eth0Test de SLAAC#
# Vider les adresses
sudo ip -6 addr flush dev eth0
# Réactiver IPv6
sudo sysctl -w net.ipv6.conf.eth0.disable_ipv6=0
# Surveiller l'autoconfiguration
ip -6 addr show eth0
ip -6 route showArticles connexes#
- ICMPv6 expliqué - NDP fonctionne sur ICMPv6. Comprendre le protocole sous-jacent.
- Types d'adresses IPv6 - Découvrez link-local, multicast solicited-node et autres types d'adresses utilisés par NDP.
- Sécurité IPv6 - Sécurisez NDP contre les attaques tout en permettant les fonctionnalités essentielles.
Testez NDP en action
Utilisez notre outil Ping pour déclencher la résolution d'adresse et Traceroute pour voir comment les hôtes découvrent les routeurs de prochain saut.
Questions fréquemment posées#
Pourquoi NDP utilise-t-il le multicast au lieu de la diffusion comme ARP ?
Le multicast est plus efficace. Les diffusions ARP atteignent chaque hôte sur le réseau, tous doivent traiter la trame même s'ils ne sont pas la cible. NDP utilise des adresses multicast solicited-node calculées à partir de l'adresse IPv6 de la cible. Seuls les hôtes avec des adresses correspondantes rejoignent ce groupe multicast et reçoivent le paquet. Les hôtes filtrent les multicasts non correspondants dans le matériel (NIC), réduisant la charge CPU. Sur les grands réseaux avec des milliers d'hôtes, cela fait une différence de performance significative.
Puis-je désactiver NDP comme je peux désactiver ARP ?
Non. NDP est obligatoire pour le fonctionnement d'IPv6. Il gère la résolution d'adresse, la découverte de routeur et l'autoconfiguration. Désactivez NDP et IPv6 cesse de fonctionner entièrement. Contrairement à IPv4 où vous pouvez utiliser des entrées ARP statiques, IPv6 nécessite NDP pour les annonces de routeur (qui fournissent les passerelles par défaut et les préfixes). Même avec des voisins statiques, vous n'auriez aucun moyen d'apprendre les routeurs ou d'autoconfigurer les adresses.
Comment la détection d'adresses dupliquées empêche-t-elle les conflits ?
Avant d'utiliser une adresse, les hôtes envoient une sollicitation de voisin avec l'adresse source :: (non spécifiée) et la cible définie sur l'adresse qu'ils veulent utiliser. Si un autre hôte utilise déjà cette adresse, il répond avec une annonce de voisin. L'hôte demandeur voit la réponse, détecte le conflit et doit choisir une adresse différente. Si aucune réponse n'arrive dans ~1 seconde, l'adresse est supposée unique. DAD s'exécute pour les adresses link-local et globales.
Que sont les adresses multicast solicited-node ?
Les adresses multicast solicited-node sont dérivées des 24 derniers bits d'une adresse IPv6 en utilisant la formule ff02::1:ff:XX:XXXX. Chaque adresse IPv6 rejoint automatiquement son groupe multicast solicited-node correspondant. Lors de la résolution d'adresse, l'expéditeur envoie NS à l'adresse solicited-node au lieu de la diffusion. Seuls les hôtes dont les adresses se terminent par les mêmes 24 bits le reçoivent. Cela réduit le traitement inutile par rapport à l'ARP basé sur la diffusion.
Pourquoi les paquets NDP doivent-ils avoir une limite de saut de 255 ?
Sécurité. Le NDP légitime provient toujours du lien local et définit la limite de saut à 255. Les routeurs décrémentent la limite de saut lors du transfert, donc les paquets d'attaquants distants arrivent avec une limite de saut < 255. En rejetant les paquets NDP avec une limite de saut != 255, les hôtes se protègent contre les attaquants hors lien envoyant de fausses annonces de routeur, annonces de voisin ou redirections. Cette simple vérification empêche de nombreuses attaques distantes sans nécessiter d'authentification complexe.
Devrais-je déployer SEND (Secure Neighbor Discovery) ?
Probablement pas. SEND fournit une authentification cryptographique pour NDP en utilisant la cryptographie à clé publique, empêchant les attaques d'usurpation. En théorie, c'est excellent. En pratique, c'est complexe, nécessite une infrastructure PKI, a un support OS médiocre et ajoute de la latence aux opérations sensibles au temps comme la résolution d'adresse. La plupart des réseaux utilisent des atténuations plus simples : RA Guard sur les commutateurs (bloque les RA des ports non-routeur), surveillance des RA malveillantes et sécurité physique/couche liaison. SEND convient aux environnements de haute sécurité prêts à investir dans l'infrastructure et la complexité.