James Bottomley’s random Pages

L’une des expériences récentes de la Conférence Linux Plumbers m’a convaincu que si vous voulez faire partie d’une véritable interaction audio / vidéo peer-to-peer basée sur le WebRTC open source, vous avez besoin d’une adresse Internet qui ne soit pas derrière un NAT. En réalité, le protocole fonctionne toujours tant que vous pouvez contacter un serveur stun pour vous dire quelle est votre adresse externe et éventuellement un serveur turn pour proxy les paquets si les deux points de terminaison sont NATed mais tout cela demande du temps comme ceux d’entre vous qui se sont plaints du test echo trouvé. La solution à tout cela est de se connecter sur IPv6 qui dispose d’un espace d’adressage suffisamment grand pour prendre en charge chaque périphérique de la planète ayant sa propre adresse. Toutes les distributions Linux modernes prennent en charge IPv6 dès la sortie de la boîte, il est donc probable que vous l’ayez accidentellement utilisé sans jamais le remarquer, ce qui est l’une des beautés de l’autoconfiguration IPv6 (elle est censée fonctionner).

Cependant, j’ai récemment déménagé et j’ai donc perdu ma connexion Internet par fibre optique au câble, mais un câble avec une adresse IPv6, donc c’est mon histoire de faire fonctionner tout cela. Si vous ne vous souciez pas vraiment des bases du protocole, vous pouvez passer au comment. Ce guide est également axé sur une configuration « à double pile » (qui a des adresses IPv6 et IPv4). Des configurations IPv6 pures sont possibles, mais comme certaines parties d’Internet sont toujours IPv4 uniquement, elles ne sont pas complètes sauf si vous configurez un pont d’encapsulation IPv4.

Les bases d’IPv6

IPv6 est un protocole mature depuis longtemps maintenant, donc j’ai supposé à tort qu’il y aurait une charge de bons HOWTOs à ce sujet. Cependant, après avoir lu 20 descriptions différentes du fonctionnement de l’espace d’adressage IPv6 128 bits et pas grand-chose d’autre, j’ai abandonné au désespoir et lu les RFC à la place. Je suppose que vous avez lu au moins un de ces HOWTOS, donc je n’ai pas besoin d’entrer dans les préfixes d’adresses IPv6, les suffixes, les ID d’interface ou les sous-réseaux, donc je commencerai là où se terminent la plupart des HOWTOs.

Comment fonctionne IPv6?

En IPv4, il existe un protocole appelé dynamic host configuration protocol (DHCP), donc tant que vous pouvez trouver un serveur DHCP, vous pouvez obtenir toutes les informations dont vous avez besoin pour vous connecter (adresse locale, routeur, serveur DNS, serveur de temps, etc.). Cependant, ce service doit être configuré par quelqu’un et IPv6 est conçu pour configurer un réseau sans lui.

La première hypothèse de l’AutoConfiguration d’adresse sans état IPv6 (SLAAC) est qu’elle se trouve sur un sous-réseau /64 (Donc chaque sous-réseau en IPv6 contient 1010 fois plus d’adresses que l’ensemble de l’Internet IPv4). Cela signifie que, puisque la plupart des sous-réseaux réels contiennent < 100 systèmes, ils peuvent simplement choisir une adresse aléatoire et il est très peu probable qu’ils entrent en conflit avec les systèmes existants. En fait, il existe trois façons actuelles de choisir une adresse dans le /64:

  1. EUI-64 (RFC 4291) basé sur l’adresse MAC qui est essentiellement le MAC avec un bit retourné et ff: fe placé au milieu.
  2. Privé stable (RFC 7217) qui génère à partir d’un hachage basé sur une clé statique, une interface, un préfixe et un compteur (le compteur est incrémenté en cas de conflit). Ceux-ci sont préférés à ceux de l’EUI-64 qui donnent toute configuration associée à l’adresse MAC (comme le type de carte réseau dont vous disposez)
  3. Adresses d’extension de confidentialité (RFC 4941) qui sont très similaires aux adresses privées stables sauf qu’elles changent avec le temps en utilisant le mécanisme de dépréciation des adresses IPv6 et sont destinées aux systèmes clients qui souhaitent préserver l’anonymat.

Le problème suivant sous Linux est de savoir qui configure l’interface ? La pile IPv6 du noyau est en fait conçue pour le faire, et le fera sauf indication contraire, mais la plupart des contrôleurs de réseau modernes (comme NetworkManager) sont des monstres de contrôle et désactivent la configuration automatique du noyau afin qu’ils puissent le faire eux-mêmes. Ils utilisent également par défaut un adressage privé stable en utilisant un secret statique maintenu dans le système de fichiers (/var/lib/NetworkManager/secret_key).

La prochaine chose à comprendre à propos des adresses IPv6 est qu’elles sont divisées en étendues, la plus importante étant les adresses locales de lien (non routables) qui ont traditionnellement toujours le préfixe fe80::/64. L’adresse locale de liaison est d’abord configurée à l’aide de l’une des méthodes ci-dessus, puis utilisée pour sonder le réseau.

Multidiffusion et découverte voisine

Contrairement à IPv4, IPv6 n’a pas de capacité de diffusion, donc toute la découverte est effectuée par multidiffusion. Les nœuds arrivant sur le réseau s’abonnent à des adresses de multidiffusion particulières, via des paquets spéciaux interceptés par le commutateur, et ne recevront aucune multidiffusion à laquelle ils ne sont pas abonnés. Classiquement, toutes les adresses de multidiffusion locales de liaison ont le préfixe ff02::/64 (pour les autres types d’adresse de multidiffusion, voir RFC 4291). Tous les nœuds s’abonnent à l’adresse de multidiffusion « tous les nœuds » ff02::1 et doivent également s’abonner à leur propre adresse de multidiffusion de nœud sollicitée à ff02::1:ffXX:XXXX où les 24 derniers bits correspondent aux 24 bits les plus bas de l’adresse IPv6 du nœud. Ce dernier est d’éviter les perturbations qui se produisaient auparavant en IPv4 à partir de diffusions ARP, car vous pouvez désormais cibler un sous-ensemble spécifique de nœuds pour la résolution d’adresses.

Le protocole de résolution d’adresses IPV6 est appelé Sollicitation voisine (NS), décrit dans la RFC 4861 et il est utilisé avec le SLAAC décrit dans la RFC 4862, et se fait en envoyant une multidiffusion à l’adresse de sollicitation voisine du nœud que vous souhaitez découvrir contenant l’adresse IPv6 complète que vous souhaitez connaître, un nœud avec l’adresse correspondante répond avec son adresse de couche de liaison (MAC) dans un paquet de publicité voisine (NA).

Une fois qu’un nœud a choisi son adresse locale de lien, il envoie d’abord un paquet NS à l’adresse choisie pour voir si quelqu’un répond et si personne ne le fait, il suppose qu’il est CORRECT de le conserver sinon il suit le protocole d’évitement de collision associé à sa forme particulière d’adresse. Une fois qu’il a trouvé une adresse unique, le nœud configure cette adresse locale de lien et recherche un routeur. Notez que si un réseau IPv6 n’est pas présent, la découverte s’arrête ici, c’est pourquoi la plupart des interfaces réseau affichent toujours une adresse IPv6 locale de liaison.

Découverte du routeur

Une fois que le nœud a sa propre adresse locale de liaison unique, il l’utilise pour envoyer des paquets de sollicitation du routeur (RS) à l’adresse de multidiffusion « tous les routeurs  » ff02::2. Chaque routeur sur le réseau répond par un paquet d’annonce de routeur (RA) qui décrit (entre autres) la durée de vie du routeur, le MTU réseau, un ensemble d’un ou plusieurs préfixes dont le routeur est responsable, l’adresse de liaison du routeur et un ensemble d’indicateurs d’options comprenant l’indicateur M (Géré) et O (Autre Configuration) et éventuellement un ensemble de serveurs DNS.

Chaque préfixe annoncé contient le préfixe et la longueur du préfixe, un ensemble d’indicateurs comprenant A (configuration autonome) et L (lien local) et un ensemble de durées de vie. Les préfixes locaux de lien vous indiquent quels préfixes globaux les utilisateurs du réseau local (il peut y en avoir plusieurs) et si vous êtes autorisé à faire SLAAC sur le préfixe global (si l’indicateur A est clair, vous devez demander au routeur une adresse en utilisant DHCPv6). Si le routeur a une durée de vie non nulle, vous pouvez supposer qu’il s’agit d’un routeur par défaut pour le sous-réseau.

Maintenant que le nœud a découvert un ou plusieurs routeurs, il peut configurer sa propre adresse globale (notez que chaque nœud routable IPv6 a au moins deux adresses : une liaison locale et une globale). Comment cela dépend des indicateurs de routeur et de préfixe

Configuration d’adresse globale

La première chose qu’un nœud doit savoir est d’utiliser SLAAC pour l’adresse globale ou DHCPv6. Ceci est entièrement déterminé par l’indicateur A de n’importe quel préfixe local de lien dans le paquet RA. Si A est défini, le nœud peut utiliser SLAAC et si A est clair, le nœud doit utiliser DHCPv6 pour obtenir une adresse. Si A est défini et aussi l’indicateur M (Géré), le nœud peut utiliser SLAAC ou DHCPv6 (ou les deux) pour obtenir une adresse et si l’indicateur M est clair, mais que l’indicateur O (Autre configuration) est présent, le nœud doit utiliser SLAAC mais peut utiliser DHCPv6 pour obtenir d’autres informations sur le réseau (généralement DNS).

Une fois que le nœud a une adresse globale, il faut maintenant une route par défaut. Il forme la liste de routage par défaut à partir des paquets RA qui ont une durée de vie de routeur non nulle. Tous ceux-ci sont configurés en tant que routes par défaut vers leur adresse locale de liaison avec le nombre de sauts spécifié par RA. Enfin, le nœud peut ajouter des routes de préfixe spécifiques à partir de paquets RA avec des durées de vie nulles du routeur mais des préfixes locaux non liés.

DHCPv6 est un protocole de configuration assez complexe (voir RFC 8415) mais il ne peut spécifier ni la longueur du préfixe (ce qui signifie que toutes les adresses obtenues sont configurées en tant que /128) ni les routes (celles-ci doivent être obtenues à partir de paquets RA). Cela conduit à une subtilité de sélection d’adresses sortantes en ce sens que la plus spécifique est toujours préférée, donc si vous configurez à la fois par SLAAC et DHCPv6, l’adresse SLAAC sera ajoutée en tant que /64 et l’adresse DHCPv6 en tant que /128, ce qui signifie que votre adresse IP sortante sera toujours la DHCPv6 (bien que si une entité externe connaît votre adresse SLAAC, elle pourra toujours vous joindre dessus).

Le Comment: Configuration de votre propre routeur domestique

L’une des choses que vous pensez de ce qui précède est que l’IPv6 se configure toujours automatiquement et, bien qu’il soit vrai que si vous branchez simplement votre ordinateur portable sur le port Ethernet d’un modem câble, il se configurera automatiquement, la plupart des gens ont une configuration domestique plus complexe impliquant un routeur, qui nécessite un coaxage spécial avant de fonctionner. Cela signifie que vous devez obtenir des fonctionnalités supplémentaires de votre FAI en utilisant des requêtes DHCPv6 spéciales.

Cette section est écrite de mon propre point de vue: J’ai un réseau IPv4 assez complexe qui a un réseau wifi complètement ouvert mais limité en bande passante (aux clients non fiables), et plusieurs réseaux internes protégés (un pour mon laboratoire, un pour mes téléphones et un pour les caméras vidéo domestiques), j’ai donc besoin d’au moins 4 sous-réseaux pour donner à chaque appareil de ma maison une adresse IPv6. J’utilise également OpenWRT comme distribution de routeur, donc toutes les informations de configuration IPv6 lui sont très spécifiques (bien qu’il soit à noter que des choses comme NetworkManager peuvent également faire tout cela si vous êtes prêt à creuser dans la documentation).

Délégation de préfixe

Puisque DHCPv6 ne distribue qu’une adresse /128, cela ne suffit pas car c’est l’adresse IP du routeur lui-même. Afin de devenir un routeur, vous devez demander la délégation d’une partie de l’espace d’adressage IPv6 via l’option d’Association d’identité pour la suppression de préfixe (IA_PD) de DHCPv6. Une fois cela fait, l’adresse IP du routeur sera supposée par le fournisseur d’accès Internet être la route de tous les préfixes délégués. La subtilité ici est que si vous voulez plus d’un sous-réseau, vous devez le demander spécifiquement (le client doit spécifier la longueur exacte du préfixe qu’il recherche) et comme c’est une longueur de préfixe, et que votre sous-réseau par défaut doit être /64, si vous demandez une longueur de préfixe de 64, vous n’avez qu’un seul sous-réseau. Si vous demandez 63, vous en avez 2 et ainsi de suite. Le problème est de savoir comment savez-vous combien de sous-réseaux le FAI est prêt à vous donner? Malheureusement, il n’y a aucun moyen de le trouver (j’ai dû faire une recherche sur Internet pour découvrir que mon FAI, Comcast, était prêt à déléguer une longueur de préfixe de 60, ce qui signifie 16 sous-réseaux). Si la recherche ne vous indique pas combien votre FAI est prêt à déléguer, vous pouvez essayer de commencer à 48 et de passer à 64 par incréments de 1 pour voir quelle est la plus grande délégation avec laquelle vous pouvez vous en tirer (il y a eu des rapports de FAI vous verrouillant à votre première longueur de préfixe délégué, alors ne commencez pas à 64). La dernière subtilité est que le préfixe que vous êtes délégué peut ne pas être le même préfixe que l’adresse obtenue par votre routeur (ma configuration comcast actuelle a mon routeur à 2001: 558: 600a:… mais mon préfixe délégué est 2601: 600: 8280: 66d0:/ 60). Remarque vous pouvez exécuter odhcp6c manuellement avec l’option -P si vous devez sonder votre FAI pour savoir quelle taille de préfixe vous pouvez obtenir.

Configuration du routeur pour la délégation de préfixe

En termes OpenWRT, la configuration WAN DHCP (v6) du routeur est contrôlée par /etc/default/network. Vous aurez déjà une interface WAN (probablement appelée « wan ») pour DHCPv4, il vous suffit donc d’ajouter une interface « wan6 » supplémentaire pour obtenir un IPv6 supplémentaire et devenir une double pile. Dans ma configuration, cela ressemble à

config interface 'wan6' option ifname '@wan' option proto 'dhcpv6' option reqprefix 60

La légère bizarrerie est l’ifname: @wan indique simplement à la configuration d’utiliser le même ifname que l’interface ‘wan’. Le nommer de cette façon est essentiel si votre wan est un pont, mais c’est de toute façon une bonne pratique. L’autre option ‘reqprefix’ indique à DHCPv6 de demander une délégation de préfixe /60.

Distribuer des Préfixes délégués

Cela s’avère remarquablement simple. Tout d’abord, vous devez attribuer un préfixe délégué à chacune de vos autres interfaces sur le routeur, mais vous pouvez le faire sans ajouter une nouvelle interface OpenWRT pour chacune d’elles. Mon réseau IPv4 interne a toutes les adresses statiques, vous ajoutez donc trois directives à chacune des interfaces:

config interface 'lan' ... interface designation (bridge for me) option proto 'static' ... ipv4 addresses option ip6assign '64' option ip6hint '1' option ip6ifaceid '::ff'

ip6assign ‘N’ signifie que vous êtes un réseau / N (donc c’est toujours / 64 pour moi) et ip6hint ‘N’ signifie utiliser N comme identifiant de sous-réseau et ip6ifaceid ‘S’ signifie utiliser S comme suffixe IPv6 (Par défaut ::1 donc si cela vous convient, omettez cette directive). Donc, étant donné que j’ai un préfixe 2601: 600: 8280: 66d0::/60, l’adresse globale de cette interface sera 2601: 600: 8280: 66d1:: ff. Maintenant, le test acid, si vous avez bien compris, cette adresse globale devrait pouvoir être pingée de n’importe où sur Internet IPv6 (si ce n’est pas le cas, c’est probablement un problème de pare-feu, voir ci-dessous).

La publicité en tant que routeur

Le simple fait d’obtenir un préfixe délégué sur une interface de routeur locale est insuffisant. Maintenant, vous devez faire en sorte que votre routeur réponde aux sollicitations de routeur sur ff02::2 et éventuellement faire DHCPv6. Malheureusement, OpenWRT dispose de deux mécanismes pour ce faire, généralement tous deux installés : odhcpd et dnsmasq. Ce que j’ai trouvé, c’est qu’aucune de mes directives dans /etc/config/dhcp ne prendrait effet jusqu’à ce que je désactive complètement odhcpd

/etc/init.d/odhcpd stop/etc/init.d/odhcpd disable

et comme j’utilise largement dnsmasq ailleurs (split DNS pour les réseaux internes / externes), cela me convenait bien. Je vais décrire d’une part les options dont vous avez besoin dans dnsmasq et d’autre part comment vous pouvez y parvenir en utilisant des entrées dans le fichier OpenWRT/etc/config/dhcp (je trouve cela utile car il est toujours sage de vérifier ce qu’OpenWRT a mis dans le fichier /var/etc/dnsmasq.fichier conf).

La première option dnsmasq dont vous avez besoin est ‘enable-ra’ qui est un paramètre global demandant à dnsmasq de gérer les publicités de routeur. Le paramètre suivant dont vous avez besoin est le « ra-param » par interface qui spécifie les paramètres de publicité du routeur global et doit apparaître une fois pour chaque interface sur laquelle vous souhaitez faire de la publicité. Enfin l’option ‘dhcp-range’ permet une configuration plus détaillée du type d’indicateurs RA et en option DHCPv6.

SLAAC ou DHCPv6 (ou les deux)

À bien des égards, c’est une question de choix personnel. Si vous autorisez SLAAC, les hôtes qui souhaitent utiliser des adresses d’extension de confidentialité (comme les téléphones Android) peuvent le faire, ce qui est une bonne chose. Si vous autorisez également la sélection d’adresses DHCPv6, vous aurez une liste d’adresses attribuées aux hôtes et dnsmasq fera la résolution DNS pour eux (bien qu’il puisse faire le DNS pour les adresses SLAAC à condition qu’il en soit informé). Une balise spéciale ‘constructeur’ existe pour l’option ‘dhcp-range’ qui lui indique de construire l’adresse fournie (pour RA ou DHCPv6) à partir du préfixe global IPv6 de l’interface spécifiée, ce qui explique comment vous transmettez nos adresses de préfixe déléguées. Les modes pour ‘dhcp-range’ sont ‘ra-only’ pour interdire entièrement DHCPv6, ‘slaac’ pour autoriser la sélection d’adresses DHCPv6 et ‘ra-stateless’ pour interdire la sélection d’adresses DHCPv6 mais autoriser d’autres informations de configuration DHCPv6.

Basé sur des essais et erreurs (et enfin en examinant le script dans /etc/init.d/dnsmasq) les options OpenWRT requises pour obtenir les options dnsmasq ci-dessus sont

config dhcp lan option interface lan option start 100 option limit 150 option leasetime 1h option dhcpv6 'server' option ra_management '1' option ra 'server'

avec ‘ra_management’ comme option clé avec ‘0’ signifiant SLAAC avec les options DHCPv6, ‘1’ signifiant SLAAC avec DHCPv6 complet, ‘2’ signifiant DHCPv6 uniquement et ‘3’ signifiant SLAAC uniquement. Une autre bizarrerie d’OpenWRT est qu’il ne semble pas y avoir de moyen de définir la plage de location: elle est toujours par défaut statique uniquement ou ::1000 à ::ffff.

Configuration du pare-feu

L’une des choses qui fait trébucher les gens est le fait que Linux dispose de deux pare-feu complètement distincts : un pour IPv4 et un pour IPv6. Si vous avez déjà écrit des règles personnalisées pour eux, il y a de fortes chances que vous l’ayez fait dans le pare-feu OpenWRT/etc/.fichier utilisateur et vous avez utilisé la commande iptables, ce qui signifie que vous n’avez ajouté que les règles au pare-feu IPv4. Pour ajouter la même règle pour IPv6, vous devez la dupliquer à l’aide de la commande ip6tables. Un autre problème important, si vous utilisez un suivi de connexion pour la détection des coups de port comme je le suis, est que le suivi de connexion Linux a des difficultés avec la multidiffusion IPv6, de sorte que les paquets qui sortent en multidiffusion mais reviennent en monodiffusion (comme la plupart des protocoles de découverte) obtiennent le mauvais état de conntrack. Pour résoudre ce problème, j’ai finalement dû avoir une règle d’ENTRÉE acceptant simplement tous les ICMPv6 et DHCPv6 (ports udp 546 et 547). Les autres considérations du pare-feu sont que maintenant tout le monde a sa propre adresse IP, il n’est pas nécessaire de NAT (OpenWRT peut être persuadé de s’en occuper automatiquement, mais si vous dupliquez les règles IPv4 manuellement, ne dupliquez pas les règles NAT). La dernière est probablement plus applicable à moi: mon interface wifi est conçue pour être une extension de l’internet local et toutes les machines qui s’y connectent devraient pouvoir se protéger car elles migreront vers des environnements hostiles tels que le wifi aéroportuaire, donc je fais une exposition complète des appareils connectés au wifi à l’Internet général pour tous les ports, y compris les sondes de port. Pour mes périphériques internes, j’ai une règle CONNEXE et ÉTABLIE pour m’assurer qu’ils ne sont pas sondés car ils ne sont pas conçus pour migrer hors du réseau interne.

Maintenant les problèmes avec OpenWRT: puisque vous voulez NAT sur IPv4 mais pas sur IPv6, vous devez avoir deux zones wan distinctes pour elles: si vous essayez de les combiner (comme je l’ai fait pour la première fois), OpenWRT ajoutera une règle INVALIDE IPv6–ctstate qui empêchera la découverte des voisins de fonctionner en raison des problèmes de conntrack avec la multidiffusion IPv6, donc mes zones wan sont (eh bien, c’est un mensonge car mon pare-feu est maintenant fabriqué à la main, mais c’est ce que j’ai vérifié avant de mettre en place le pare-feu fabriqué à la main):

config zone option name 'wan' option network 'wan' option masq '1' ...config zone option name 'wan6' option network 'wan6' ...

Et les règles de routage pour la zone lan (entièrement accessible) sont les suivantes :

config forwarding option src 'lan' option dest 'wan'config forwarding option src 'lan' option dest 'wan6'config forwarding option src 'wan6' option dest 'lan'

: Obtenir la connexion IPv6 des clients

Maintenant que votre routeur est configuré, tout devrait fonctionner. Si c’était le cas, l’interface wifi de votre ordinateur portable devrait maintenant avoir une adresse IPv6 globale

ip -6 address show dev wlan0

Si cela revient vide, vous devez activer IPv6 sur votre distribution. S’il n’a qu’une adresse locale de lien (fe80::prefix), IPv6 est activé mais votre routeur ne fait pas de publicité (problèmes de pare-feu suspects avec les paquets de découverte ou une mauvaise configuration de dnsmasq). Si vous voyez une adresse globale, vous avez terminé. Maintenant, vous devriez pouvoir aller à https://testv6.com et obtenir un score de 10/10.

La dernière pièce du puzzle est de préférer votre nouvelle connexion IPv6 lorsque DNS offre un choix d’adresses IPv4 ou IPv6. Tous les clients Linux modernes devraient préférer IPv6 lorsqu’il est disponible s’ils sont connectés à un réseau à double pile, alors essayez if si vous ping, disons, www.google.com et voir une adresse IPv6 vous avez terminé. Sinon, vous devez entrer dans le monde trouble de l’étiquetage des adresses IPv6 (RFC 6724) et gai.conf.

Conclusion

L’ajout d’IPv6 à la configuration IPv4 existante n’est actuellement pas une simple opération plug-in et go. Cependant, à condition de comprendre une poignée de différences entre les deux protocoles, ce n’est pas non plus un problème insurmontable. J’ai également passé sous silence de nombreux problèmes que vous pourriez rencontrer avec votre FAI. Certaines personnes ont signalé que leurs FAI ne distribuent qu’une seule adresse IPv6 sans délégation de préfixe, auquel cas je pense que trouver un nouveau FAI serait le plus sage. D’autres signalent que le FAI ne déléguera qu’un préfixe / 64, donc votre choix ici est soit d’exécuter un seul sous-réseau (probablement suffisant pour beaucoup de réseaux domestiques), soit un sous-réseau supérieur à / 64 et d’interdire SLAAC, ce qui n’est certainement pas une configuration recommandée. Cependant, à condition que votre FAI soit raisonnable, cet article de blog devrait au moins vous aider à démarrer.

Write a Comment

Votre adresse e-mail ne sera pas publiée.