Le paquet Router Advertisement joue un rôle très important dans IPv6, il permet aux hôtes sur un même segment réseau de configurer leur route par défaut automatiquement, il est également à l’origine de l’autoconfiguration, ou, le cas échéant, il informe l’hôte qu’un service DHCPv6 est disponible pour obtenir diverses informations dont l’adresse IPv6.
Ce paquet ICMPv6 de type 134 est défini dans la RFC 4861 et de manière plus détaillée (pour les flags) dans la RFC 5175.
De quoi est constitué le paquet RA ?
Comment fonctionne-t-il et à quoi sert-il ?
Je vais tenter d’éclaircir ces points dans la suite du billet.
Petits rappels de base
Tout d’abord rappelons qu’en IPv6, les réseaux ont pour simple propriété un préfixe, voilà comment cela se présente :
2001:db8:dead:cafe::/64
/64 signifie que ce sont les 64 bits de poids fort qui désignent le réseau, 2001:db8:dead:cafe:: est la première adresse disponible, en mettant les 64 bits de poids faible à 1, on obtient donc la dernière adresse, qui est naturellement 2001:db8:dead:cafe:ffff:ffff:ffff:ffff
Un exemple d’adresse unicast globale dans ce réseau : 2001:db8:dead:cafe:20c:deff:fe13:dead
Partie réseau – Partie identifiant d’interface
Considérons que l’identifiant d’interface (bits désignant un hôte sur le réseau) est déjà défini lors du processus de création de l’adresse lien-local (link-local), malheureusement je n’ai pour l’instant guère de temps pour écrire un billet dessus, vous pouvez consulter en attendant la page protocole de découverte des voisins sur le livre de l’association g6.
Structure du paquet RA
ICMPv6 :
Type : 134 (Router Advertisement) / Code : 0 / Checksum : somme de contrôle / Cur hop limit : n (recommande aux hôtes d’utiliser cette valeur en champs IPv6 Hop Limit)
Flags :
- M Managed Address Configuration Flag : 0 (n’utilise pas DHCPv6 pour la construction d’adresse, autoconfiguration possible), 1 (l’obtention d’adresse doit se faire par DHCPv6), RFC 4861.
- O Other Configuration Flag : 0 (aucune information à prendre sur DHCPv6), 1 (des informations complémentaires sont à récupérer via DHCPv6), RFC 4861.
- H Mobile IPv6 Home Agent Flag : 0 (Ce routeur n’est pas un agent mère, valeur par défaut), 1 (Ce routeur est un agent mère), utilisé pour la mobilité IPv6, RFC 3775.
- Prf (2bits) Router selection preferences : Valeur de préférence du routeur par défaut, valeurs possibles : 00 (medium, valeur par défaut), 01 (high), 11 (low), 10 (réservé, traité comme 00 si utilisé), RFC 4191.
- P Neighbor discovery Proxy Flag : Flag défini dans la RFC 4389, mais aucune information supplémentaire pour l’instant, doit être fixé à 0.
- R (reservé) : Doit être fixé à 0
Router lifetime : Durée de vie (en secondes, relatif au moment où le paquet est reçu) du routeur dans la table de routage des hôtes, valeur entre 0 et 9000 secondes, avec 0 en valeur, le routeur n’est pas considéré comme routeur par défaut.
Reachable time : Durée recommandée (en millisecondes) pour laquelle les hôtes peuvent conserver une association adresse MAC / adresse IPv6 (Neighbor Discovery Protocol) en cache, si la valeur est fixée à 0, la durée est non spécifiée et l’hôte se charge lui-même de fixer cette valeur. (Personnellement, j’ai toujours vu ce paramètre à 0).
Retrans timer : Durée recommandée (en millisecondes) pour laquelle les hôtes doivent espacer les Neighbor Solicitation en cas de non réponse (Neighbor Advertisement) à un paquet précédemment envoyé. (J’ai également toujours vu ce paramètre à 0).
ICMPv6 Options (options ICMPv6 généralement présentes dans les RA) :
Prefix Information (Type : 3)
Prefix length : Nombre de bits de poids fort désignant le préfixe.
Flags :
- L On-link flag : Indique si toutes les adresses associées au préfixe sont sur le même lien (liaison), 1 si c’est le cas (les hôtes se contactent directement, c’est le cas généralement), 0 sinon (les hôtes envoient d’abord les paquets au routeur, si les deux hôtes sont bien sur le même lien physique, le routeur envoie à l’émetteur un paquet Redirect).
- A Autonomous address-configuration : Indique si le préfixe annoncé peut être utilisé pour construire une adresse, 1 si c’est le cas (autoconfiguration), 0 sinon.
Valid Lifetime : Durée (en secondes) durant laquelle une adresse de ce préfixe est considérée comme valide.
Preferred Lifetime : Durée (en secondes) durant laquelle une adresse de ce préfixe est considérée comme préférée. Valeur entre 0 et 0xffffffff (considéré comme durée infinie).
NB: Une adresse dans un état Préférée est forcément Valide, mais quand la durée de l’état préférée est écoulée, aucune connexion ne peut être initiée depuis cette adresse, seules les connexions déjà existantes seront maintenues, et ce jusqu’à l’écoulement de la durée de validité.
Recursive DNS Server (Type : 25) L’emploi de cette option ICMPv6 reste peu répandu à ce jour (ajout relativement récent : RFC 6106), néanmoins présent sur les Freebox.
Recursive DNS Servers : Indique l’IPv6 du serveur DNS à utiliser par défaut. À noter que ce champs peut être répété, on peut ainsi indiquer plusieurs serveurs DNS (1 minimum).
Lifetime : Indique la durée (en secondes) de validité des adresses de serveurs DNS données par le champ précédent. Sa valeur doit être comprise entre la durée séparant deux émissions de RA et 0xffffffff (considéré alors comme durée infinie).
MTU (Type : 5)
MTU : MTU (en octets) recommandée pour le lien. (doit être supérieur ou égal à 1280 octets, qui est le MTU minimum en IPv6).
Source link-layer address (Type : 1)
Link-layer address : Adresse MAC source (MAC du routeur dans ce cas).
Il est à noter que certaines options ICMPv6 ne sont pas forcément présentes dans les paquets RA, de même, il peut y avoir d’autres options que je n’ai pas mentionnées.
Fonctionnement
Les RA sont émis périodiquement par un routeur, ils peuvent également être émis suite à un hôte ayant envoyé un paquet Router Soliciation.
Ils sont émis avec pour adresse source, l’adresse lien-local (link-local) du routeur, et généralement avec une adresse de destination ff02::1, ff pour multicast, 02 car sur le segment réseau actuel, 1 pour tous les hôtes, donc ici, tous les hôtes du segment réseau actuel (également appelé lien) recevront ce RA, dès lors, les hôtes se chargent d’interpréter les données composant la trame.
NB : Windows 7 accepte par défaut les RA, les systèmes sous GNU/Linux l’acceptent généralement par défaut, dans le cas contraire, il suffit de mettre remplacer le 0 contenu dans /proc/sys/net/ipv6/conf/$IF/accept_ra par 1, pour effectuer ce changement de manière permanante, il faut ajouter dans /etc/sysctl.conf :
net.ipv6.conf.$IF.accept_ra = 1
Remplacez bien entendu $IF par votre interface (vous pouvez également utiliser all et default).
Si vous souhaitez une configuration manuelle, un 0 suffira, il entraînera le refus de tout RA reçu.
Le RA est émis périodiquement pour une raison simple, les données sont valides pour une durée (tout ce qui contient lifetime) définie, lorsqu’un hôte reçoit un nouveau paquet RA, il interprète et utilise la valeur reçue dans ce nouveau RA pour remplacer l’ancienne, voici un exemple simple à comprendre :
root@deb-test:/home/bashy# ip -6 ro 2001:db8:dead:bed::/64 dev eth0 proto kernel metric 256 expires 86210sec \ mtu 1500 advmss 1420 hoplimit 0 fe80::/64 dev eth0 proto kernel metric 256 mtu 1500 advmss 1420 hoplimit 0 default via fe80::cafe dev eth0 proto kernel metric 1024 expires 1610sec \ mtu 1500 advmss 1420 hoplimit 64 root@deb-test:/home/bashy# rdisc eth0 > /dev/null && ip -6 ro 2001:db8:dead:bed::/64 dev eth0 proto kernel metric 256 expires 86398sec \ mtu 1500 advmss 1420 hoplimit 0 fe80::/64 dev eth0 proto kernel metric 256 mtu 1500 advmss 1420 hoplimit 0 default via fe80::cafe dev eth0 proto kernel metric 1024 expires 1798sec \ mtu 1500 advmss 1420 hoplimit 64
On remarque qu’après avoir reçu un RA (ici sollicité par l’envoie d’un paquet Router Solicitation), la machine réinitialise le compteur à la valeur reçue, à noter qu’à chaque RA, nous sommes libre de changer la valeur définie, ce n’est pas forcément la même que dans le paquet émis précédemment.
De même, émettre un RA avec un Router Lifetime à 0 annule sa présence dans la table de routage des hôtes.
Avec plusieurs passerelles sur le lien, on pourrait imaginer jouer avec tous ces paramètres selon le besoin (répartition de charge, haute-disponibilité, etc…).
Cela ouvre évidemment la porte à une attaque de type déni de service (DoS) ou une attaque Rogue RA qui permet à un hôte de se faire passer pour une passerelle par défaut, j’effectuerai une démonstration de cette attaque dans un billet ultérieur 🙂 .
Exemple
Pour finir, voici un petit schéma de paquet RA servant à l’autoconfiguration des hôtes sur un réseau :
PS: À ce jour, le paquet RA est le seul moyen de configurer la route par défaut des hôtes de manière automatique, DHCPv6 ne présente pas cette option.
Ping : .:[ d4 n3wS ]:. » SLAAC Attack : le MITM fastoche
Où est-ce que je tombe en révisant le contrôle de demain en MMIP!?