Attribution, traduction et IPv6
Ce que ce chapitre apporte
- Décrire l'échange par lequel une machine obtient une adresse, et ce que le bail lui apporte d'autre.
- Expliquer pourquoi une demande d'adresse ne franchit pas un routeur, et comment y remédier.
- Distinguer les trois formes de traduction d'adresses et dire quand chacune s'impose.
- Expliquer comment une réponse retrouve sa machine quand cent machines partagent une adresse.
- Dire ce que la traduction rend difficile, et pourquoi.
- Lire une adresse IPv6, situer la frontière des 64 bits et appliquer les deux règles d'écriture.
- Décrire comment une machine se configure sans serveur, et ce que le routeur annonce vraiment.
Les deux chapitres précédents ont supposé que chaque machine possédait une adresse correcte, et que cette adresse pouvait circuler jusqu'au bout du monde. Aucune des deux suppositions n'est vraie en pratique. Une machine reçoit son adresse d'un service, et cette adresse est presque toujours privée, donc inutilisable telle quelle hors de son réseau. Ce chapitre traite les deux mécanismes qui comblent l'écart, puis le protocole conçu pour rendre le second inutile.
Obtenir une adresse
Configurer chaque machine à la main ne tient pas au-delà de quelques postes, et produit des doublons dès la première inattention. Un service d'attribution automatique s'en charge, par un échange en quatre temps.
- La machine, qui n'a pas d'adresse, diffuse une demande à tout le réseau. Elle ne peut faire que cela : ne connaissant personne, elle s'adresse à tous.
- Un serveur propose une adresse, avec un masque, une passerelle et des serveurs de noms.
- La machine demande formellement cette proposition. Cette étape existe parce que plusieurs serveurs peuvent avoir répondu, et qu'il faut désigner celui qu'on retient.
- Le serveur confirme, et note l'attribution.
Une adresse n'est pas donnée mais prêtée, pour une durée appelée bail. La machine demande son renouvellement à la moitié du bail écoulé. Si personne ne répond avant la fin, elle abandonne l'adresse.
Le bail explique un comportement déroutant : une machine peut fonctionner parfaitement pendant des heures après la panne du serveur, puis perdre son adresse d'un coup. Ce n'est pas la panne qui se manifeste tard, c'est le bail qui expire.
Une demande d'adresse est une diffusion, et un routeur ne fait pas suivre les diffusions. Un serveur placé dans un autre réseau ne verra donc jamais la demande. La solution ne consiste pas à mettre un serveur par réseau mais à configurer sur le routeur un relais qui transforme la diffusion en un message adressé au serveur, en indiquant au passage de quel réseau elle vient, pour que le serveur sache dans quelle plage puiser.
Le rapprochement avec le chapitre 5 vaut d'être fait : une adresse en 169.254 signale exactement l'échec de cet échange. La machine a diffusé, personne n'a proposé, elle s'est fabriqué une adresse faute de mieux. Chercher alors du côté du relais du routeur est souvent plus rentable que de chercher du côté du serveur.
Traduire les adresses
Une adresse privée ne circule pas sur Internet : aucun routeur d'opérateur ne la fait suivre. Le routeur de sortie remplace donc l'adresse privée par une adresse publique, et c'est cette substitution qu'on appelle traduction d'adresses.
Trois formes coexistent, et elles ne répondent pas au même besoin.
| Forme | Ce qu'elle fait | Quand elle s'impose |
|---|---|---|
| Fixe | Une adresse privée correspond toujours à la même adresse publique | Un serveur qui doit être joignable depuis l'extérieur |
| Par groupe | Une adresse privée reçoit une adresse publique prise dans un lot | Un nombre de machines simultanées inférieur à la taille du lot |
| Par ports | Toutes les machines partagent une seule adresse publique, distinguées par le numéro de port | Le cas ordinaire, de la maison à l'entreprise |
La troisième forme est celle qui a permis à IPv4 de survivre, et c'est aussi celle qui pose la question intéressante : si cent machines sortent sous la même adresse publique, comment la réponse retrouve-t-elle la bonne ?
à l'intérieur
192.168.1.10:51000
PC1
vu de l'extérieur
203.0.113.7:51000
vers 93.184.216.34:443
traduitentrée créée : c'est le couple adresse et port qui distingue cette machine.
Table de traduction, après le flux 1
- 2 machines internes passent par 1 adresse publique, ce que seul le numéro de port rend possible.
- 1 flux a vu son port de départ remplacé : deux machines avaient choisi le même, et il fallait bien les distinguer.
- 1 paquet venu de l'extérieur tombe : aucune entrée ne lui correspond. Ce n'est pas une décision de sécurité, c'est une absence d'information.
- À cet instant, la table compte 1 entrée : elle est ce qui rend le retour possible, et elle s'efface lorsque les conversations se terminent.
Le deuxième flux est le cœur du sujet. Les deux machines ont choisi 51000 comme port de départ, ce qui n'a rien d'improbable. Puisque l'adresse publique est la même, garder aussi le même port rendrait les deux conversations indistinguables au retour. Le routeur en change donc un, et le port devient la véritable clé.
Le troisième flux vérifie le mécanisme : la réponse arrive sur 203.0.113.7:40000, le routeur lit sa table, y trouve 192.168.1.11:51000, remet le paquet à PC2 en restaurant l'adresse et le port d'origine. Sans cette entrée, il n'aurait eu aucun moyen de choisir.
Le quatrième flux montre la conséquence. Un paquet arrive de l'extérieur sur un port qu'aucune conversation n'a ouvert : la table ne contient rien, le routeur n'a aucune machine interne à qui le remettre, et le paquet tombe.
Ce rejet n'est pas une décision de sécurité, c'est une absence d'information. Le résultat ressemble à celui d'un pare-feu, ce qui fait souvent conclure que la traduction d'adresses protège. Elle ne protège pas : elle ne filtre rien, ne journalise rien, n'applique aucune règle, et laisse passer sans discuter tout ce qu'une machine interne a demandé, y compris ce qu'elle n'aurait pas dû demander.
Quand le groupe est trop petit
La traduction par groupe montre bien pourquoi la traduction par ports l'a supplantée.
à l'intérieur
192.168.1.10:51000
PC1
vu de l'extérieur
203.0.113.20:51000
vers 93.184.216.34:443
traduitentrée créée, adresse pour adresse.
Table de traduction, après le flux 1
- 2 machines internes passent par 2 adresses publiques.
- 1 machine ne sort pas du tout, faute d'adresse publique disponible.
- À cet instant, la table compte 1 entrée : elle est ce qui rend le retour possible, et elle s'efface lorsque les conversations se terminent.
Ici, chaque machine monopolise une adresse publique entière pour une seule conversation. Le lot s'épuise au troisième poste. La traduction par ports résout le même besoin avec une seule adresse, parce qu'elle découpe cette adresse en dizaines de milliers de ports.
Un serveur, à l'inverse, a besoin d'une correspondance fixe : il doit être joignable sans qu'aucune conversation ait été ouverte de l'intérieur, ce que seule cette forme permet.
Ce que la traduction complique
Le procédé fonctionne, il est universel, et il a un coût qu'il faut connaître.
Deux machines ne peuvent plus se joindre directement. Chacune est derrière son propre routeur, et aucune des deux ne peut ouvrir la conversation vers l'autre. Toute application entre pairs doit donc passer par un serveur intermédiaire ou employer des contournements.
L'origine d'une connexion devient floue. Un journal de serveur qui note 203.0.113.7 ne désigne pas une machine mais un site entier. Retrouver le poste exige de croiser avec la table du routeur, à l'instant précis.
Le routeur devient un point de mémoire. La table est ce qui rend le retour possible ; s'il redémarre, toutes les conversations en cours sont rompues, alors qu'un routeur ordinaire peut redémarrer sans que rien ne se remarque.
IPv6
IPv6 ne corrige pas un défaut d'IPv4 : il en supprime la cause. Le problème n'a jamais été la traduction d'adresses, mais le manque d'adresses qui l'a rendue nécessaire.
Ce que contient une adresse
Une adresse IPv6 tient sur 128 bits, écrits en huit groupes de quatre chiffres hexadécimaux. Ces 128 bits ne se découpent pas comme les 32 bits d'IPv4, et c'est le renversement le plus important du sujet.
une adresse IPv4, à la même échelle
la même adresse en IPv6, 128 bits
préfixe de routage global : attribué au site, et c'est lui que les routeurs d'Internet suivent.
sous-réseau : choisi par le site, un numéro par réseau local.
identifiant d'interface : désigne une carte sur son lien, et occupe la moitié de l'adresse.
- 64 des 128 bits, soit la moitié exacte de l'adresse, ne servent qu'à désigner une carte sur son lien. Cette frontière ne se calcule pas : elle est posée, là où le masque IPv4 se plaçait où l'on voulait.
- Un site en /48 taille 65 536 réseaux locaux, chacun de 18 446 744 073 709 551 616 adresses.
- Un seul de ces réseaux locaux contient 4 294 967 296 fois l'espace IPv4 tout entier. C'est pourquoi la question de la pénurie ne se reposera pas, et pourquoi la traduction d'adresses n'a plus de raison d'être.
Trois choses se lisent sur la première vue, et aucune ne se devine sur une adresse écrite en ligne.
La frontière ne bouge pas. Les 64 derniers bits désignent toujours l'interface. Là où tout le chapitre 5 consistait à savoir où placer le masque, la question ne se pose plus : la coupure est posée par convention, une fois pour toutes.
La moitié de l'adresse ne sert qu'à désigner une carte. C'est ce qui paraît absurde tant qu'on raisonne en IPv4, où l'on compte les adresses une par une. Un seul réseau local IPv6 contient plusieurs milliards de fois l'espace IPv4 tout entier, et personne ne cherchera jamais à le remplir.
Le site reçoit un préfixe, pas une adresse. Un /48 laisse 16 bits pour numéroter les réseaux locaux, soit 65 536 réseaux, ce qui règle d'avance la question du découpage que le chapitre 5 traitait à l'économie.
Un plan d'adressage IPv6 ne cherche pas à économiser. Il cherche à être lisible. Numéroter les réseaux locaux par bâtiment, par étage ou par service coûte exactement le même nombre d'adresses que de les numéroter à la suite, et se relit des années plus tard. C'est l'inverse exact de l'arbitrage du chapitre 5.
Comment on l'écrit
La seconde vue de la figure applique les deux règles l'une après l'autre. Les zéros de tête de chaque groupe s'omettent, puis une seule suite de groupes nuls se remplace par ::. Ni l'une ni l'autre ne change l'adresse : elles ne changent que son écriture.
La règle du :: unique se retient d'ordinaire comme une interdiction arbitraire. Elle cesse de l'être dès qu'on développe une écriture qui en contient deux : la figure énumère alors les adresses différentes qu'elle pourrait désigner, et rien dans l'écriture ne permet de choisir entre elles. La règle n'est pas une convention de style, c'est ce qui rend la notation lisible.
À longueur égale, c'est la première suite qui est abrégée. Une adresse comportant deux suites de deux groupes nuls n'a qu'une écriture correcte, celle qui abrège la suite de gauche. C'est un détail sans conséquence à la lecture, et une source de comparaisons de chaînes qui échouent quand un programme normalise mal.
Un en-tête plus grand, et plus simple
L'adresse a quadruplé de taille, donc l'en-tête aussi. On s'attendrait à un en-tête plus lourd à traiter ; c'est le contraire qui s'est produit.
- Le paquet remis au lien pèse 540 o pour une MTU de 1500 o. La MTU borne le paquet, pas la trame : les 18 octets de la couche liaison s'ajoutent par-dessus.
- La charge utile pourrait aller jusqu'à 1460 o sans dépasser la MTU. Au-delà, il faut fragmenter, et c'est la cause classique des liaisons où tout marche sauf les gros transferts.
- Le paquet remis au lien pèse 560 o pour une MTU de 1500 o. La MTU borne le paquet, pas la trame : les 18 octets de la couche liaison s'ajoutent par-dessus.
- La charge utile pourrait aller jusqu'à 1440 o sans dépasser la MTU. Au-delà, il faut fragmenter, et c'est la cause classique des liaisons où tout marche sauf les gros transferts.
Comparer les deux figures champ par champ est plus parlant qu'une liste. L'en-tête IPv4 porte dix champs dans 20 octets, dont 8 seulement d'adresses. L'en-tête IPv6 porte six champs dans 40 octets, dont 32 d'adresses : les quatre cinquièmes de l'en-tête ne sont que la source et la destination.
Trois champs ont disparu, et chacun pour une raison qui vaut d'être connue.
L'identification et les drapeaux de fragmentation ne sont plus là parce qu'un routeur IPv6 ne fragmente plus : c'est à l'émetteur de découvrir la taille acceptable et de s'y tenir. Un routeur a donc moins de travail par paquet.
La somme de contrôle a disparu parce qu'elle faisait double emploi. La trame en dessous porte déjà un contrôle d'erreur, et le transport au-dessus aussi. La recalculer à chaque saut, puisque la durée de vie change, coûtait cher pour ne rien détecter que les autres ne détectaient déjà.
Se configurer sans serveur
En IPv4, une machine sans adresse diffuse une demande et attend qu'un serveur lui en attribue une. En IPv6, elle peut se la fabriquer, à partir d'un préfixe qu'un routeur annonce.
La différence de rôle est le point à retenir. Le routeur annonce un préfixe ; il ne tient aucune liste, ne réserve rien, et ne saura jamais quelles adresses les machines se sont données. C'est la machine qui compose la sienne, en collant le préfixe reçu à un identifiant d'interface qu'elle choisit.
Deux conséquences pratiques. La machine obtient sa passerelle en même temps que son préfixe, puisque c'est le routeur lui-même qui a répondu : il n'y a rien de plus à configurer. Et l'étape de vérification n'est pas une formalité : une adresse déjà prise sur le lien est détectée avant d'être employée, ce qui supprime la classe entière des conflits d'adresses.
Un serveur d'attribution reste possible, et reste souvent nécessaire. L'autoconfiguration donne une adresse et une passerelle, mais elle ne dit pas quels serveurs de noms employer, ni ne tient de registre de qui a quoi. Les deux mécanismes coexistent donc, l'un pour l'adresse, l'autre pour le reste.
Ce qui change encore
Plus de diffusion générale. IPv6 remplace la diffusion par des envois à des groupes d'abonnés. La sollicitation de la figure précédente ne dérange que les routeurs, et pas les cent postes du réseau, ce qui allège sensiblement un lien chargé.
Un protocole de découverte du voisinage remplace le mécanisme de résolution d'adresses locales d'IPv4, avec un rôle plus large : trouver les voisins, trouver les routeurs, détecter les adresses en double. Les trois messages de la figure lui appartiennent tous.
Les deux protocoles cohabitent, ils ne se remplacent pas. La méthode courante est la double pile : chaque machine porte une adresse de chaque famille et emploie celle qui convient. Deux autres approches existent, l'encapsulation d'un protocole dans l'autre pour traverser un réseau qui ne connaît qu'une famille, et la traduction entre les deux, plus fragile parce qu'elle doit récrire les paquets.
Exercices type
Exercice 1 : un poste obtient bien une adresse, un autre reste en 169.254, tous deux sur le même commutateur. Que chercher en premier ?
Afficher la solution
Le fait qu'un poste réussisse est l'information principale : le serveur répond, le relais fonctionne, le chemin existe. Le problème est donc local au second poste.
Trois pistes, dans cet ordre. Le lien lui-même, câble et voyant de port, car une diffusion qui ne part pas ne reçoit pas de réponse. Le port du commutateur, s'il est désactivé ou restreint. Enfin, l'épuisement du lot d'adresses du serveur, qui donnerait le même symptôme mais toucherait tous les nouveaux venus, pas un seul.
Exercice 2 : deux postes sortent vers le même site avec le même port de départ. Que fait le routeur, et qu'aurait-il fait s'il avait gardé les deux ports ?
Afficher la solution
Il change le port de l'un des deux et note l'association dans sa table.
S'il avait gardé les deux ports identiques, les deux conversations seraient devenues indiscernables : même adresse publique, même port, même destination. À l'arrivée de la réponse, le routeur aurait eu deux entrées possibles et aucun moyen de choisir.
C'est ce qui montre où est la véritable clé. Sous une adresse publique unique, ce n'est pas l'adresse qui identifie une machine, c'est le port choisi à la sortie.
Exercice 3 : un service interne doit devenir accessible depuis Internet. La traduction par ports suffit-elle ?
Afficher la solution
Non. La traduction par ports ne crée d'entrée que sur un flux sortant. Un serveur, par définition, reçoit sans avoir rien demandé : aucune entrée n'existe, et le paquet tombe.
Il faut une correspondance déclarée d'avance, soit une correspondance fixe entre l'adresse privée du serveur et une adresse publique, soit une redirection de port qui associe un port de l'adresse publique à une machine interne précise.
Cette déclaration est une décision d'exposition, et elle mérite d'être traitée comme telle : elle ouvre un chemin permanent depuis Internet vers une machine du réseau interne.
Exercice 4 : un routeur de sortie redémarre. Les postes gardent leur adresse mais tous les téléchargements en cours échouent. Pourquoi ?
Afficher la solution
Parce que la table de traduction était en mémoire, et qu'elle est partie avec le redémarrage.
Les adresses des postes ne sont pas en cause : leur bail est plus long que l'interruption, et rien ne les a invalidées. Mais chaque conversation en cours reposait sur une entrée du routeur, et sans elle, les paquets de retour arrivent sur l'adresse publique sans destination interne possible. Ils tombent.
C'est une différence importante avec un routeur qui ne fait que router : celui-là est sans mémoire, et son redémarrage ne rompt rien de ce qui était en cours.
Exercice 5 : un poste porte l'adresse fe80::204:61ff:fe9d:f156 et aucune autre. Il joint ses voisins du même lien, mais rien au-delà. Pourquoi ?
Afficher la solution
Cette adresse commence par fe80, c'est-à-dire qu'elle est limitée au lien : une machine s'en fabrique toujours une, sans avoir besoin de personne, et elle suffit à parler aux voisins directs. Aucun routeur ne la fait suivre.
Ce qui manque est donc l'adresse globale, et avec elle le préfixe qui aurait dû l'accompagner. Le poste n'a reçu aucune annonce de routeur.
Trois pistes, dans cet ordre. Le routeur du lien annonce-t-il un préfixe, ou cette fonction est-elle simplement désactivée sur l'interface. Le lien lui-même, puisque les annonces arrivent par le réseau comme le reste. Et le filtrage, car un équipement qui bloque les messages de découverte du voisinage produit exactement ce symptôme.
Le rapprochement avec IPv4 est utile : fe80 joue ici le rôle que 169.254 jouait là-bas, à ceci près qu'en IPv6 elle est normale et permanente, et coexiste avec l'adresse globale au lieu de la remplacer.
1.Pourquoi une demande d'adresse ne franchit-elle pas un routeur ?
2.Que se passe-t-il à la fin d'un bail non renouvelé ?
3.Cent machines sortent sous une seule adresse publique. Qu'est-ce qui les distingue au retour ?
4.Un paquet non sollicité arrive de l'extérieur. Que fait un routeur qui traduit par ports ?
5.Quelle forme de traduction convient à un serveur joignable depuis Internet ?
6.Que remplace la diffusion générale en IPv6 ?
7.Combien de suites de zéros peut-on abréger par :: dans une adresse IPv6 ?
8.Où passe la coupure entre réseau et interface dans une adresse IPv6 ?
9.En autoconfiguration, que fait le routeur ?
10.Pourquoi l'en-tête IPv6 est-il deux fois plus grand et pourtant plus simple à traiter ?
La méthode
- Lire une adresse en 169.254 comme un échec de l'échange, et regarder le lien avant le serveur.
- Chercher le relais du routeur dès que le serveur d'attribution est dans un autre réseau.
- Se souvenir que le bail retarde les symptômes d'une panne de serveur.
- Regarder le port, pas l'adresse, pour suivre une conversation traduite.
- Ne jamais compter sur la traduction comme protection : c'est un pare-feu qu'il faut, et il se configure.
- Déclarer explicitement toute exposition d'un service interne, et la traiter comme une décision.
- Lire le début d'une adresse IPv6 avant tout :
fe80dit que la machine n'a jamais reçu d'annonce de routeur. - Chercher l'annonce du routeur, et non un serveur d'attribution, quand une machine IPv6 n'a pas d'adresse globale.
Synthèse
- Une adresse s'obtient par un échange en quatre temps et n'est que prêtée, pour la durée d'un bail.
- La demande est une diffusion : un serveur situé ailleurs exige un relais sur le routeur.
- Trois formes de traduction : fixe pour un serveur, par groupe quand le lot suffit, par ports partout ailleurs.
- Sous une adresse publique unique, c'est le port qui identifie une machine, et la table qui rend le retour possible.
- Un paquet entrant sans entrée correspondante tombe, faute d'information et non par sécurité.
- La traduction complique les échanges entre pairs, l'attribution des connexions, et rend le routeur porteur d'un état.
- IPv6 supprime la cause du problème : un espace d'adressage sans commune mesure.
- La coupure d'une adresse IPv6 est fixe au 64e bit : la moitié de l'adresse ne désigne qu'une carte, et le masque ne se cherche plus.
- Les deux règles d'écriture ne changent que la notation, et une seule abréviation est permise, sans quoi l'adresse désignerait plusieurs machines.
- L'en-tête double de taille et perd trois champs : plus de fragmentation par les routeurs, plus de somme de contrôle à recalculer.
- En autoconfiguration, le routeur annonce un préfixe et n'attribue rien ; la machine compose son adresse et vérifie qu'elle est libre.