De retour en IPv6 !🔗
Introduction
A l'occasion de mon déménagement temporaire, je me suis rappelé d'une entrée sur ma TODO list: basculer vers IPv6. Cette bascule n'est, pour moi, pas une simple activation sur une machine mais comporte une nouvelle phase d'acquisition de connaissances. C'est essentiellement ce travail de recherche sur le fonctionnement d'IPv6 qui a retardé mon basculement. Néanmoins, je considère que c'est important de bien comprendre le fonctionnement de ce nouveau protocole, car les changements qu'il induit ne sont pas forcément anodins.
J'ai néanmoins eu de très bonnes surprises: c'est à la portée de tout administrateur système. Je vous propose donc de nous plonger dans une série d'explications sur les principes d'IPv6 avant de voir en pratique comment mettre en place une installation "à la maison" fonctionnelle.
Ma source d'information est le livre "IPv6 Théorie et Pratique" de l'association G6. Si son contenu n'est pas forcément bien organisé (on ne sait pas toujours ce qui relève de la nouvelle édition ou de l'ancienne), le contenu a une approche pragmatique et reste plutôt clair.
Avant de commencer: IPv4 et CIDR
Avant de se lancer dans le travail d'acquisition de connaissances, il est essentiel que vous soyez calé avec la notion de CIDR d'IPv4. IPv6 en reprend les principes et cette notation est très pratique pour écrire des réseaux ou des adresses. Si vous ne maîtrisez pas ce concept, je vous conseille de faire un tour sur Wikipedia ou bien le site du zéro.
IPv6, qu'est-ce-qui change ?
Le changement, c'est maintenant !
On pourrait croire qu'IPv6, c'est juste des adresses plus longues juste pour éviter la pénurie d'adresses IP. Néanmoins, dire cela reviendrait à nier tout ce qui gravite autour du protocole IP. Par exemple, la modification d'IP a forcément des conséquences sur le routage. De même, qu'en est-il de ARP, de DHCP, d'ICMP, de la gestion des sous-réseaux, etc. ? Eh oui, IP ce n'est pas juste l'affectation des adresses.
Si je tente de faire la synthèse des changements, voici ce que j'ai pu trouver:
- Effectivement les adresses changent, elles sont plus longues…
- …mais en fait, elles ne sont pas organisées de la même manière.
- le contenu du paquet IP change
- il y a des conséquences sur le routage
- comme on change le protocole, autant ajouter des fonctionnalités…
- … c'est le cas pour l'ajout des protocoles de découvertes des voisins,
- … ou sur la manière de gérer les couches inférieures (ARP passe à la trappe)
- … forcément ICMP est modifié et sert à d'autres choses qu'auparavant
- … il y a, enfin, de nouveaux types d'adresses avec des utilisations différentes (lien-local, ULA).
- Pour terminer, comme on vit encore dans un monde où IPv4 est majoritaire, il existe encore des mécanismes de double-pile et de tunnels.
Voilà ce sur quoi nous devons nous pencher avant d'entreprendre, dans le concret, une migration vers IPv6 sans douleur et en toute compréhension.
Le point sur les adresses
Pour faire simple, avant on avait une adresse sur 32 bits, maintenant, c'est 128 ! Pour écrire une adresse IPv6, on utilise une autre forme de représentation. Elle est décrite dans la RFC 5952. Voici un exemple d'adresse IPv6:
2001:0def:0008:0000:caaa:0000:0000:dc10
Voici les règles d'écriture:
- D'abord, tout est hexadécimal.
- Ensuite, on utilise le caractère : pour la séparation. On a donc 8 mots de 16 bits pour décrire une adresse IPv6.
- Comme cette notation est longue à écrire (et donc prompte à l'erreur de saisie), on utilise des abréviations…
- … Ainsi, tous les zéros non significatifs peuvent être supprimés. Ensuite, si un mot est nul (4 zéros), on peut le remplacer par un :.
- Enfin, lorsqu'on a une suite de plusieurs mots nuls, on peut les remplacer par :: mais une seule fois par adresse.
- Pour terminer, il est recommandé d'écrire les lettres en minuscules.
Si on applique le tout à notre adresse initiale, on obtient:
- IP non réduite: 2001:0def:0008:0000:caaa:0000:0000:dc10
- On supprime les zéros non significatifs: 2001:def:8:0:caaa:0:0:dc10
- On remplace les mots nuls par des caractères: 2001:def:8:0:caaa:0:0:dc10
- On gère les suites de mots nuls (utilisation de :: une seule fois): 2001:def:8:0:caaa::dc10
Ok ! on sait maintenant écrire une adresse IPv6 dans les règles de l'art.
Ce qui change dans l'adressage
Plusieurs types d'adresses
D'abord, il y a maintenant plusieurs types d'adresses:
- Les adresses unicast (même principe que pour IPv4): elles identifient une machine sur un réseau public. C'est comme avant…
- Les adresses multicast (idem qu'IPv4): elles identifient un groupe de machines qui recevront les mêmes paquets.
- Les adresses anycast: ce sont des adresses multicast ou un seul membre du groupe récupère le paquet. Un truc idéal pour la répartition de charge.
- Les adresses lien-local: elles sont utilisées pour toutes les interfaces reliées entre elles par un seul routeur (une sorte de réseau local). Elles ne sortent pas sur Internet.
- Les adresses uniques locales (ULA): des adresses non routées sur Internet mais qui peuvent être reliées par plusieurs routeurs (une sorte de WAN ou de MAN).
Préfixes connus des adresses
Ensuite, la manière dont sont formées les adresses changent. Avant, on parlait de réseaux avec une notation CIDR. Maintenant, les adresses sont composées de plusieurs parties selon leur type. Et comme il a plusieurs types, on plusieurs répartitions. Voici comment l'intégralité de l'adressage IPv6 est découpé:
Préfixe IPv6 | Allocation |
---|---|
0000::/8 | Réservé pour la transition et loopback |
0100::/8 | Réservé |
0200::/7 | Réservé (ex NSAP) |
0400::/6 | Réservé (ex IPX) |
0800::/5 | Réservé |
1000::/4 | Réservé |
2000::/3 | Unicast Global |
4000::/3 | Réservé |
6000::/3 | Réservé |
8000::/3 | Réservé |
A000::/3 | Réservé |
C000::/3 | Réservé |
E000::/4 | Réservé |
F000::/5 | Réservé |
F800::/6 | Réservé |
FC00::/7 | Unique Local Unicast (ULA) |
FE00::/9 | Réservé |
FE80::/10 | Lien-local |
FEC0::/10 | Réservé |
FF00::/8 | Multicast |
La première chose à voir, c'est que le découpage est prudent: la majorité est constitués de blocs importants (/3 donc 125 bits de libre) qui sont réservés pour plus tard. Selon les FAI, l'attribution d'une adresse IPv6 avec un préfixe en /64 (dans l'adressage global, ça implique une liberté totale sur la partie IID, comme on le verra plus tard) ou en /48, où on a 65535 sous-réseaux possibles. Rien que sur la partie IID, on dispose de 64 bits où on fait (presque ce qu'on veut): on dispose rien qu'avec cette possibilité de beaucoup plus que le nombre d'adresses IPv4. Ca fait comme si chaque utilisateur pouvait disposer d'un Internet rien qu'à lui avec plus de 4 milliards d'adresses !!! On a de la marge…
Ensuite, on peut observer que tout l'adressage public est dans le bloc 2000::/3 soit de 2000:: à 3FFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF ! voilà pourquoi votre adresse IPv6 publique a des chances de commencer par 2 ! On retrouve des préfixes pour les adresses ULA et les adresses lien-local. Ca signifie que toute adresse de ce type commencera par FC00: ou FE80: Idem pour le multicast qui reçoit un morceau spécifique. Ainsi, si vous utilisez une adresse lien-local à la maison ou au bureau, elle utilisera le même préfixe et répondra aux mêmes règles de fabrication que nous allons voir tout de suite.
Fabrication des adresses IP
Nous allons voir comment sont structurées les différents types d'adresses:
Unicast public
Champs | Préfixe | Sous-réseau | Identifiant d'interface |
---|---|---|---|
Nb Bits | 48 bits | 16 bits | 64 bits |
Lien-local
Champs | Préfixe (fe80) | bits à zéro | Identifiant d'interface |
---|---|---|---|
Nb Bits | 10 bits | 54 bits | 64 bits |
ULA
Champs | Préfixe (fd) | Valeur aléatoire | Sous-réseau | Identifiant d'interface |
---|---|---|---|---|
Nb Bits | 8 bits | 40 bits | 16 bits | 64 bits |
On voit des similitudes:
- L'identifiant d'interface est toujours sur 64 bits
- Si on est dans un sous-réseau, on a 16 bits pour le préciser
- En règle générale, le préfixe fait 64 bits et on ajoute des valeurs (zéro ou aléatoirement) pour faire en sorte que ça tienne sur 64 bits.
Ainsi, un FAI qui vous attribue une adresse IP publique vous offre en fait un bloc /64: vous faites ce que vous voulez de la partie identifiant d'interface.
En ce qui concerne le multicast, les règles changent un peu et nous débordons de notre cadre simple.
Fabrication des identifiants d'interface
Les 64 bits qui vous reste vous offre plus d'adresses possibles à gérer que toutes les adresses IPv4 réunies ! Ca fait tout drôle quand même ! L'identifiant d'interface est géré de 3 manières différentes:
- soit manuellement. Vous décidez que sur cette interface, l'identifiant, c'est 2 (soit 0000:0000:0000:0002) ou bien une autre suite de codes hexa (genre 10cd:0bad:cafe:dada).
- soit de manière aléatoire: l'adresse est un nombre entre 1 et 2 puissance 64.
- soit dérivée de l'adresse MAC de l'équipement (qui fait 48 bits): on reconnaît cette dernière au fait qu'il y a la chaîne FFFE dedans. Elle sert à faire le complément de l'adresse MAC (il manque 16 bits pour faire 64).
Cette construction est identique suivant les modes (unicast, lien-local,ULA). Elle pose un problème uniquement lorsqu'elle est dérivée de l'adresse MAC: celle-ci ne change jamais. Si cette adresse est exposée sur Internet, on a accès direct à une référence fixe qui identifie votre machine ! C'est bien plus intrusif que du NAT et à un niveau de couche réseau bien plus faible qu'avec des techniques comme celle des cookies. Mais il existe des parades: utiliser simplement l'attribution aléatoire.
Gestion d'une interface réseau
Enfin, pour terminer sur les nouveautés, il faut retenir que comme les adresses IP sont abondantes, on peut se permettre plus de choses. En l'occurrence: une interface réseau dispose de plusieurs adresses IPv6 ! C'est un grand changement ! Ainsi, on peut affecter plusieurs IP unicast publiques, une adresse IP lien-local à une même carte réseau. Si vous faîtes un ifconfig sur une machine en IPv6, vous verrez au moins deux adresses:
- l'adresse lien-locale qui est une adresse unique dans le préfixe FF80::/64
- l'adresse unicast globale (publique) qui utilise le préfixe attribué par le routeur (donc le FAI).
Affectation des adresses IP
IPv6 dispose d'un mécanisme d'affectation des adresses IP très particulier. Il n'y a plus forcément besoin de DHCP… grâce à un nouveau protocole nommé NDP (Neighbour discovery protocol). Je ne vais pas vous détailler le comportement de ce protocole dans le détail. Sachez qu'il utilise ICMPv6 pour toutes les opérations et que celui-ci offre de nouvelles options par rapport à ICMPv4.
Un des rôles important de NDP est la découverte des voisins. Lorsqu'une interface désire communiquer avec une autre, elle utilise non pas la technique du broadcast d'IPv4. A la place, elle envoie des paquets ICMPv6 à l'adresse multicast dédiée au groupe des interfaces qui partagent le même lien et qui est ff00::1. Le routeur s'occupe de transmettre les données au groupe et les interfaces concernées répondent en ICMPv6 avec leur adresse IPv6. Cela permet de mettre à jour la table de routage de la machine qui recherche des voisins. Le tout est complètement intégré et cette recherche est transparente. Par exemple, si vous vous amusez à pinguer (en v6) un hôte que vous n'avez pas encore contacté, vous verrez des trames ICMPv6 d'annonce et de recherche avant de récupérer les messages traditionnels d'echo (le ping).
Ensuite, NDP donne plus d'importance au rôle du routeur. Il joue un rôle nouveau: il parle aux stations dans le protocole ICMPv6. Ainsi, le routeur peut annoncer des adresses à d'autres interfaces et il participe pleinement à l'autoconfiguration des interfaces IPv6. Lorsqu'une interface désire faire son auto-configuration IP, un dialogue s'instaure avec le routeur et ce-dernier permet de déterminer une adresse IP globale, de calculer la route et le routeur par défaut. C'est une nouveauté appréciable car, théoriquement, il n'y a plus besoin de DHCP et il y a moins de protocoles (on utilise ICMP et ARP passe à la trappe). Ce mode de configuration s'appelle une autoconfiguration sans état. Tout se fait automatiquement et suit des règles préétablies.
Enfin, NDP permet aux interfaces de trouver quel est leur routeur par défaut et également de calculer les meilleurs routes vers les autres interfaces. On parle d'indication de redirection interne ou externe. C'est d'ailleurs le seul mode de renseignement des informations de routage: en IPv4, ces données passaient par DHCP (gateway/broadcast). Avec IPv6, c'est par NDP (donc ICMPv6).
Je n'entre pas dans les détails de NDP. Si vous voulez en savoir plus sur son fonctionnement, vous pouvez lire cette page du livre de l'association G6. Elle est très claire et contient de bons exemples.
IPv6 dans la pratique
Etat des lieux
Ok ! Maintenant, nous avons assez de matière pour mettre les mains dans le cambouis. Je traiterai donc de la mise en place d'IPv6 sous GNU/Linux Debian. Même si les documents de RFC autour d'IPv6 sont plus récents que ceux d'IPv4 et que certains points du protocole sont encore à l'état de brouillons, la mise en place de la pile IPv6 au sein du noyau Linux est très avancée et ce, depuis de nombreuses années puisque c'est dès la version 2.4 du noyau qu'un support primaire d'IPV6 a fait son entrée. Au moment de la rédaction de cet article (2012), nous sommes en version 3.2, c'est dire à quel point IPv6 est géré depuis longtemps.
Activation d'ipv6
Néanmoins, pour des raisons pratiques, il est probable qu'en 2012, la gestion d'IPv6 ait été désactivée pour plusieurs raisons. D'abord, à une époque, il y avait quelques bugs dans la gestion d'IPv6 (cf celui qui m'a touché au travail). Pour toutes ces questions et parce qu'IPv6 n'était pas déployé, il était beaucoup plus simple de le désactiver complètement. Voyons comment le remettre en route.
En terme de diagnostic, je vous conseille d'utiliser tout simplement ifconfig. Si vous n'avez pas trace d'une adresse ipv6 (inet6), vous pouvez être sûr que le problème se situe au niveau du noyau. Sous Debian, depuis Squeeze, le noyau n'a plus de module IPv6: la pile est directement intégrée au noyau (normal, c'est un truc dont on a un besoin courant). Plus besoin de désactiver le module relatif à ipv6 avec modprobe sauf pour certaines machines. Par exemple, le noyau armel pour la plateforme orion (le truc du Sheevaplug) fait bien apparaître un module ipv6.ko. Sur cette machine, vous aurez besoin de faire un tour dans le fichier /etc/modprobe.d/blacklist pour voir si ce module est blacklisté, ce qui empêche son chargement.
Dans les autres cas, il est possible que l'alias de la famille de protocole ipv6 (net-pf-10) soit redirigé vers off, ce qui désactive cette famille de protocole. Un petit tour du côté du fichier /etc/modprobe.d/aliases.conf devrait vous mettre sur la piste.
Si ces éléments sont correctement configurés, il reste la possibilité de désactiver la gestion d'ipv6 en l'indiquant au noyau par sysctl. Vérifiez la valeur du paramètre net.ipv6.conf.all.disable_ipv6
: sysctl net.ipv6.conf.all.disable_ipv6
retourne 0 lorsque IPv6 est activé. Pour rendre ce paramétrage définitif, vérifiez si cette variable est renseignée au niveau des fichiers du répertoire /etc/sysctl.d/ ou dans /etc/sysctl.conf
Les adresses lien-local sont déjà là
Voilà, votre noyau sait gérer l'IPv6 que vous venez de rendre actif (si ce n'est déjà fait par défaut). Dès maintenant, vous avez en fait un réseau IPv6 local (si si, je vous jure).
Le moyen le plus simple est de faire un ifconfig sur votre machine.
# ifconfig lo Link encap:Boucle locale inet adr:127.0.0.1 Masque:255.0.0.0 adr inet6: ::1/128 Scope:Hôte UP LOOPBACK RUNNING MTU:16436 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 lg file transmission:0 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B) wlan0 Link encap:Ethernet HWaddr 00:24:43:16:56:da inet adr:192.168.0.11 Bcast:192.168.0.255 Masque:255.255.255.0 adr inet6: fe80::224:43ff:fe16:56da/64 Scope:Lien UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:1036 errors:0 dropped:0 overruns:0 frame:0 TX packets:929 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 lg file transmission:1000 RX bytes:860185 (840.0 KiB) TX bytes:121538 (118.6 KiB)
Si Ipv6 est géré, vous devriez disposer d'une adresse lien-local. Hé oui, même si vous n'êtes pas connecté, la pile IPv6 attribue une adresse lien-local à chaque interface réseau activée, y compris l'interface loopback. Après tout, les adresses lien-local, ça sert à ça ! Dans notre exemple, on voit que l'interface lo (loopback) dispose d'une adresse ipv6 grâce à la ligne:
adr inet6: ::1/128 Scope:Hôte
L'interface wlan0 dispose de l'adresse IP lien-local: fe80::222:43ff:fe16:56da qu'on reconnaît par son préfixe (fe80). On peut également constater que son identifiant d'interface est fabriqué à partir de l'adresse MAC:
IPv6: fe80::0224:43ff:fe16:56da MAC: 00:24:43:16:56:da
En effet, on remarque juste que la chaîne FFFE est insérée dans l'adresse MAC conformément au protocole de création des adresses lien-local.
A ce stade, vous êtes connectés en IPv6 ! Si vous avez une autre machine sur le même segment réseau (le même lien), vous pouvez repérer son adresse IPv6 et la pinguer directement avec ping6 et ça fonctionnera !! Attention, lorsqu'on utilise IPv6 avec des adresses lien-local, il faut préciser celle qui est utilisée et par quelle interface: il est en effet possible d'utiliser plusieurs interfaces qui ont une adresse lien-local (pour une machine qui aurait plusieurs interfaces réseau). Dans ce cas, il est indispensable de préciser le lien.
$ ping6 -I wlan0 fe80::250:43ff:fe01:458e PING fe80::250:43ff:fe01:458e(fe80::250:43ff:fe01:458e) from fe80::222:43ff:fe16:56da wlan0: 56 data bytes 64 bytes from fe80::250:43ff:fe01:458e: icmp_seq=1 ttl=64 time=12.4 ms 64 bytes from fe80::250:43ff:fe01:458e: icmp_seq=2 ttl=64 time=0.986 ms 64 bytes from fe80::250:43ff:fe01:458e: icmp_seq=3 ttl=64 time=0.986 ms
Mise en fonctionnement du routeur IPv6
Maintenant, vous pouvez simplement activer la fonction IPv6 de votre routeur (le vôtre ou celui de votre machinbox). Je n'entre pas dans les détails de cette tâche: si c'est votre propre routeur que vous administrez tout seul comme un grand, c'est forcément complexe à décrire. Pour Mme Michu, elle se rend dans l'interface de configuration de sa machinbox et elle coche la bonne case suivi d'un redémarrage (ou pas selon la machinbox) et zou, c'est parti !
Au bout de quelques secondes ou minutes suivant l'état de la connexion et du routeur, c'est réglé: vous êtes reliés sur Internet IPv6… Effectivement vous n'avez rien eu à faire d'autre: pas de configuration sur votre machine autre que celle liée à IPv4, ni même de redémarrage.
Ne me croyez pas sur parole, vérifiez par vous même avec ifconfig:
wlan0 Link encap:Ethernet HWaddr 00:22:43:16:56:da inet adr:192.168.0.11 Bcast:192.168.0.255 Masque:255.255.255.0 adr inet6: 2a01:e35:8a57:24e0:222:43ff:fe16:56da/64 Scope:Global adr inet6: fe80::222:43ff:fe16:56da/64 Scope:Lien UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:1102 errors:0 dropped:0 overruns:0 frame:0 TX packets:995 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 lg file transmission:1000 RX bytes:888298 (867.4 KiB) TX bytes:132987 (129.8 KiB)
On voit que l'interface wlan0 s'est configurée toute seule (comme une grande elle aussi) en suivant les instructions du routeur. Une nouvelle adresse a été ajoutée à l'interface réseau (wlan0 dans notre exemple). C'est finalement pas mal ce petit protocole NDP ! Pas besoin de DHCP, de relancer l'interface réseau ou la machine, tout se fait en tâche de fond… Vous avez maintenant une véritable IPv6 native (2a01:e35:8a57:24e0:222:43ff:fe16:56da). Vous pouvez d'ailleurs récupérer votre préfixe (mon FAI propose des /64 comme l'indique ifconfig): le mien est 2a01:e35:8a57:24e0:/64.
Pour vérifier que vous avez du trafic vers des adresses IPv6, vous pouvez utiliser Wireshark et naviguer sur des sites web connus. Si vous disposez de tcpdump, un simple tcpdump -i wlan0 -n
vous permettra de voir le trafic (ici celui lié à une simple recherche sur Google):
12:40:11.177961 IP6 2a01:e35:8a57:24e0:1505:88c3:bc0d:5e24.51463 > 2a00:1450:8006::66.443: Flags [.], ack 199494, win 4396, options [nop,nop,TS val 711869 ecr 657239580], length 0 12:40:11.179959 IP6 2a00:1450:8006::66.443 > 2a01:e35:8a57:24e0:1505:88c3:bc0d:5e24.51463: Flags [P.], seq 199494:199636, ack 3415, win 210, options [nop,nop,TS val 657239580 ecr 711845], length 142 12:40:11.180044 IP6 2a01:e35:8a57:24e0:1505:88c3:bc0d:5e24.51463 > 2a00:1450:8006::66.443: Flags [.], ack 199636, win 4396, options [nop,nop,TS val 711870 ecr 657239580], length 0 12:40:11.198115 IP6 2a00:1450:8006::66.443 > 2a01:e35:8a57:24e0:1505:88c3:bc0d:5e24.51463: Flags [.], seq 199636:200844, ack 3415, win 210, options [nop,nop,TS val 657239580 ecr 711845], length 1208 12:40:11.198199 IP6 2a01:e35:8a57:24e0:1505:88c3:bc0d:5e24.51463 > 2a00:1450:8006::66.443: Flags [.], ack 200844, win 4396, options [nop,nop,TS val 711874 ecr 657239580], length 0 12:40:11.200199 IP6 2a00:1450:8006::66.443 > 2a01:e35:8a57:24e0:1505:88c3:bc0d:5e24.51463: Flags [P.], seq 200844:200986, ack 3415, win 210, options [nop,nop,TS val 657239580 ecr 711845], length 142 12:40:11.200292 IP6 2a01:e35:8a57:24e0:1505:88c3:bc0d:5e24.51463 > 2a00:1450:8006::66.443: Flags [.], ack 200986, win 4396, options [nop,nop,TS val 711875 ecr 657239580], length 0 12:40:11.203625 IP6 2a00:1450:8006::66.443 > 2a01:e35:8a57:24e0:1505:88c3:bc0d:5e24.51463: Flags [.], seq 200986:202194, ack 3415, win 210, options [nop,nop,TS val 657239580 ecr 711845], length 1208
Configuration des stations "clientes"
Ok, c'est bien, IPv6 est dans votre maison et ça poutre des ours. De mon côté, j'ai noté une amélioration sensible du trafic vers certains sites web (Youtube pour ne pas le cite) lorsqu'on passe par IPv6 mais je n'ai pas fait de mesure fiable. C'est du ressenti et on ne peut pas s'y fier. Mais, même si vous avez l'essentiel, à savoir une connexion à Internet en IPv6, il reste quelques problèmes à gérer !
Le premier sur lequel je ne m'étalerai pas est celui de la sécurité d'une manière générale (on pourrait écrire tout un bouquin dessus). Si avant vous accédiez à Internet par un réseau NATé, ce n'est plus le cas en Ipv6. Après tout, c'est ce qu'on veut: communiquer en unicast de point à point sans s'embêter à gérer trop d'intermédiaires (le NAT en est un). Adieu les protocoles de contournement de NAT (STUN par exemple) ! Mais bonjour les problèmes de connexion directe. En effet, un routeur NAT a l'intérêt que même si vous ne mettez pas en place de pare-feu sur vos machines, le trafic qui vient de l'extérieur est incapable de vous atteindre directement (par contre il peut le faire indirectement: vous êtes bien connecté à Internet, ça sort donc ça rentre aussi). C'est une sécurité, certes primaire, mais qui a l'avantage de ne pas coûter cher en connaissance sur le sujet. Madame Michu se trouve donc dans l'obligation, avec IPv6, de gérer sa connexion à Internet en prenant soin de mettre en place un pare-feu sur sa machine alors qu'avant, elle courait un risque minime à ne pas le faire. Il faut donc qu'elle se pose de bonnes questions sur ce sujet et qu'elle active certaines sécurités qu'elle ne faisait pas avant. Ce travail dépasse le cadre de cet article déjà touffu.
Le deuxième point essentiel c'est que par défaut sous GNU/Linux, l'identifiant d'interface (le truc que vous gérez dans votre /64) est établi en fonction de l'adresse MAC de l'interface. Comme cette dernière ne change jamais, vous êtes donc directement tracé par votre adresse et ce sans cookies et autres mesures détournées pour suivre les individus.
Je vous rassure, on peut remédier à ce problème en quelques lignes de fichier de configuration. Comme c'est le noyau qui gère la pile ipv6, on utilisera l'outil dédié sysctl qui permet de gérer les paramètres noyau après son démarrage. Il vous suffit d'ajouter un fichier dont le nom se termine en .conf (anonymous_ipv6.conf dans mon cas) , de le placer dans le répertoire /etc/sysctl.d et dont le contenu sera le suivant
# Anonymous IPv6 parameters: net.ipv6.conf.wlan0.use_tempaddr = 2 net.ipv6.conf.eth0.use_tempaddr = 2 net.ipv6.conf.all.use_tempaddr = 2 net.ipv6.conf.default.use_tempaddr = 2 net.ipv6.conf.wlan0.temp_prefered_lft = 11000 net.ipv6.conf.eth0.temp_prefered_lft = 11000 net.ipv6.conf.all.temp_prefered_lft = 11000 net.ipv6.conf.default.temp_prefered_lft = 11000
On voit que le premier paramètre type de paramètre commence par net.ipv6.conf.xxx.use_tempaddr. Sa valeur indique au noyau comment gérer les adresses IP dont l'identifiant d'interface est généré aléatoirement:
- 0 indique de ne pas générer d'adresse aléatoire,
- 1 de générer une adresse aléatoire sur l'interface tout en continuant à utiliser de préférence celle qui est générée par la méthode MAC (la non anonyme donc)
- 2 indique de générer une adresse aléatoire et de l'utiliser pour le trafic sortant.
Si j'ai ajouté plusieurs lignes avec ce paramètre (une par interface), c'est que je me suis rendu compte que les paramètres net.ipv6.conf.all ou net.ipv6.conf.default n'agissent pas lors du lancement des interfaces réseaux: si vous ne renseignez que ces deux lignes, les interfaces réseaux seront encore établies selon la méthode non anonyme.
Enfin, j'ai ajouté également le paramètre temp_prefered_lft qui permet de réduire la vie d'une IP aléatoire à 11000 secondes soit 3h d'utilisation alors qu'en temps normal, la valeur indique 24h.
Avec cette configuration sur chacune de vos stations directement connectées à Internet IPv6, vous ne devriez plus être aussi facilement identifiable. Certains dans le fond de la salle feront justement remarquer qu'on s'en fout parce de toute manière, vu que le préfixe indique un client du FAI, on est quand même identifié. Ils auront raison mais je dirai que la situation n'est pas différente avec celle du NAT IPv4 où on dispose d'une seule IP fixe pour tout un foyer. De plus, avec la génération d'adresses aléatoires, un intermédiaire s'amusant à tracer toutes les connexions simplement sur le critère de l'adresse aurait du mal à distinguer un seul individu avec une seule machine d'une organisation avec plus de personnes et plusieurs machines (mis à part les utilisations instantanées).
Configuration des adresses fixes
Un dernier point à régler concerne les IP fixes. Ok, vous avez des milliards d'adresses IP publiques dans votre /64 mais si vous hébergez un service à destination du public, il faut bien que les autres connaissent votre adresse. Sur un réseau IPv4 NATé, c'est le FAI qui gère ce problème et c'est à vous de retrouver quelle est votre adresse publique en utilisant différent outils en ligne (voir la documentation de ddclient par exemple). En IPv6, tout est public (à part le lien local) et c'est à vous de définir une adresse fixe et de renseigner ensuite votre DNS avec cette adresse (enregistrement AAAA).
Ce qui est bien avec la notation IPv6, c'est qu'on a le choix dans l'espace des interfaces: 64 bits sont à votre disposition ce qui est large ! Ce qui est aussi amusant avec IPv6, c'est qu'on peut mettre des lettres (ABCDEF) puisqu'on est en hexadécimal. Compte-tenu de ces éléments, j'ai choisi une adresse IPv6 qui, pour sur, sera bien disponible dans ma tête (dans la forme générale): 2a01:e35:8a57:24e0:bad:cafe:bad:caca
!!! Après tout, on fait ce qu'on veut des 64 derniers bits.
Ensuite, il faut indiquer au fichier de configuration de la machine qu'on désire utiliser cette adresse IP. Pour cela, sous GNU/Linux Debian, il suffit de renseigner le traditionnel fichier /etc/network/interfaces en ajoutant les éléments relatifs à Ipv6. Vous aurez besoin au minimum de votre adresse IP fixe et de la taille du préfixe (64 dans mon cas). En temps normal, vous aurez également besoin de connaître l'adresse de la passerelle (la machine qui envoie les paquets à l'extérieur de votre réseau local). J'ai eu de la peine à la trouver chez moi car, ma machinbox (Freebox) fait tout passer par un lien-local !
J'avais du mal à y croire mais visiblement, c'est non seulement possible mais en plus, ça marche plutôt bien. Voici le résultat de la commande ip -6 route list
(qui indique les routes configurées pour IPv6):
2a01:e35:8a57:24e0::/64 dev wlan0 proto kernel metric 256 expires 86322sec fe80::/64 dev wlan0 proto kernel metric 256 default via fe80::207:cbff:fec5:a26c dev wlan0 proto kernel metric 1024 expires 1712sec
La ligne default via indique que la passerelle par défaut est une adresse en lien-local (fe80::).
Donc, pour trouver l'ip non lien-local de la machinbox, j'ai fait au pif: j'ai pris la première adresse de mon préfixe (2a01:e35:8a57:24e0::1) et comme il y avait une réponse à un ping6 et pas sur les autres adresses, c'était la bonne. Les utilisateurs du FAI Free ont donc comme adresse ipv6 de passerelle la première adresse de leur préfixe.
Munis de ces précieux renseignements, il suffit ensuite d'ajouter une clause de configuration dans /etc/network/interfaces comme suit (en plus de celle sur ipv4/inet):
# Support Ipv6 fixe: iface eth0 inet6 static address 2a01:e35:8a57:24e0:bad:cafe:bad:caca netmask 64 gateway 2a01:e35:8a57:24e0::1
Ces paramètres permettent d'affecter l'adresse 2a01:e35:8a57:24e0:bad:cafe:bad:caca à eth0 avec une passerelle sur l'adresse 2a01:e35:8a57:24e0::1.
On le voit, rien de très compliqué et c'est très proche de la configuration classique d'IPv4.
Conclusion
Nous avons pu faire un rapide état des lieux sur la mise en place d'IPv6. Après avoir défini les concepts nouveaux, notamment, ceux de l'adressage et de l'affectation d'adresse, nous avons pu nous frotter à une mise en situation très simple. Ce que j'en retiens c'est que la mise en place d'un réseau IPv6 est d'une simplicité déconcertante pour les utilisations clientes, c'est à dire, le cas typique de madame Michu au fin fond du Cantal. En effet, cette dernière n'a qu'à activer la fonction IPv6 sur son routeur (la machinbox). Sous GNU/Linux, il n'est pas besoin de redémarrer la machine. Dès cette activation, elle dispose d'un accès à Internet différent car il n'est pas NATé. C'est un avantage indéniable et la généralisation d'IPv6 devrait simplifier grandement le travail des développeurs d'applications des couches supérieures qui n'auront plus à gérer les cas de fermeture des réseaux.
On voit que d'un point de vue technique, IPv6 donne un rôle plus important aux administrateurs des routeurs. Ce n'est pas forcément un mal pour certains applications typiques (Mme Michu). Pour d'autres, c'est plus complexe et plus délicat, notamment si on n'a pas la main sur le routeur. De ce côté, l'abondance d'adresses potentiellement gérées par l'utilisateur final (dans un espace en /64) ainsi que le fait qu'une interface puisse avoir plusieurs adresses change beaucoup la pratique de gestion d'un réseau local. Ces changements ont forcément des incidences sur la sécurité déployée sur un réseau connecté à Internet. En effet, dès lors que vous êtes nativement connectés sur Internet IPv6, toutes vos interfaces sont directement exposées de manière publiques sur Internet. D'ailleurs, si vous n'avez pas activé les fonctions "d'anonymisation", on peut même vous suivre à la trace ! Après avoir travaillé sur une configuration aux petits oignons de votre sécurité Ipv4, il vous reste donc à travailler sérieusement sur la sécurité d'IPv6. Par exemple, si vos règle de pare-feu (iptables) ne concernent que des adresses IPv4, votre pare-feu ne protège plus vos équipements (cette affirmation est à nuancer si vous avez respecté la règle simple qui consiste à tout bloquer sauf ce qui est autorisé mais dans ce cas, aucun des exemples sus-cités n'aurait dû fonctionner !!).
Enfin, j'ai constaté une sacré amélioration du débit sur les sites accédés nativement par IPv6 (les plus gros comme google et youtube par exemple). IPv6 est bien plus fluide, sans doute parce que pour l'instant, une bonne partie du trafic continue à passer à travers des réseaux NATés IPv4. Je ne comprend toujours pas pourquoi IPv6 n'est pas plus développé que ça: c'est un vrai plus pour les clients des FAI qui n'auront pas de configuration DHCP à gérer !
Pour terminer cet article, je vous invite à activer votre connexion IPv6 auprès de votre FAI. Nous sommes en 2012 et ça fait près d'un an que tous les préfixes CIDR d'IPv4 ont déjà été attribués. Si votre FAI est prévoyant et compétent, il doit d'ores et déjà vous proposer un accès natif IPv6 avec un bon préfixe (/64 ou /48, il y a de la marge). Sinon, je vous laisse le soin de juger par vous même de ses pratiques et d'aller constater que l'herbe est plus verte ailleurs. Dans tous les cas, n'oubliez pas: 2012, c'est l'année d'IPv6!!!