Allez, je vous embête encore avec IPv6 :

http://www.bortzmeyer.org/7136.html

----------------------------

Auteur(s) du RFC: B. Carpenter (Univ. of Auckland), S. Jiang (Huawei 
Technologies)

Chemin des normes

----------------------------


Les adresses IPv6 sont souvent composées en utilisant un truc nommé 
« "interface identifiers" » (identifiant d'interface réseau). Ces 
identifiants peuvent être formés, par exemple, en utilisant les 
adresses MAC, en utilisant des bits ayant un sens particulier dans les 
normes IEEE. Résultat, dans le passé, certains ont attribué à des bits 
de l'identifiant d'interface une signification qu'ils n'avaient pas. Ce 
nouveau RFC clarifie la question : les identifiants d'interface doivent 
être considérés comme *opaques* et il ne faut pas tirer de conclusion 
du fait que tel ou tel bit est mis.

Un exemple typique de construction d'adresse IPv6 est donné dans la 
section 2.5 du RFC 4291. L'adresse IPv6 de 128 bits est formée en 
concaténant un préfixe avec un "interface identifier". Ce dernier est 
censé être unique sur le lien où la machine est connectée. Cet objectif 
peut être atteint en prenant l'adresse MAC de la machine et en la 
transformant en utilisant le format "Modified EUI-64". Dans ce format, 
le bit U (pour "universal") est inversé, 1 signifiant que l'identifiant 
EUI-64 est unique mondialement, 0 qu'il ne l'est pas (ainsi, les 
adresses fabriquées manuellement comme 2001:db8:33::1 ont un 
identifiant d'interface où le bit U est à zéro). Un autre bit est 
spécial, le G, qui indique s'il s'agit d'une adresse de groupe ou de 
machine individuelle. Ces deux bits *perdent* leur signification dès 
qu'ils sont mis dans une adresse IPv6, c'est le point important de ce 
RFC.

Un exemple ? Si la machine a l'adresse MAC b8:27:eb:ba:90:94, son 
identifiant d'interface va être ba27:ebff:feba:9094 (suivant le 
tutoriel sur le format EUI-48 
<http://standards.ieee.org/develop/regauth/tut/eui48.pdf>, on ajoute 
ff:fe au milieu, l'adresse Ethernet ne faisant que 48 bits, et on 
inverse le bit U, transformant le b8 en ba).

Comme indiqué, il y a bien d'autres façons de fabriquer un identifiant 
d'interface (notre nouveau RFC 7136 utilise le sigle « IID » qui 
n'apparait pas dans le RFC 4291 original). Si celle utilisant une 
adresse MAC est la plus souvent présentée dans les tutoriels IPv6, elle 
n'est pas la seule et on a des identifiants d'interface formés à partir 
d'un processus cryptographique (RFC 3972 ou RFC 5535), générés 
aléatoirement et utilisés temporairement, pour protéger la vie privée 
(RFC 4941), ou fabriqués à partir des adresses IPv4 (RFC 5214). Sans 
compter la méthode manuelle de choisir l'identifiant d'interface à 
volonté, en en faisant un nombre significatif (::53 pour un serveur 
DNS) ou rigolo (::dead:beef). Et de nouvelles méthodes apparaissent de 
temps en temps. Pour chacune de ces méthodes, la norme stipule la 
valeur que doivent prendre les bits U et G. Par exemple, le RFC 3972 
les mets à zéro tous les deux et le RFC 4941 (section 3.2) met U à zéro 
et ne dit rien pour G. Les identifiants formés à partir de ces méthodes 
ont donc des valeurs très variables pour ces deux bits. En fait, 
l'identifiant d'interface ne fait même pas forcément 64 bits, comme 
illustré par le RFC 6164, qui le réduit à un seul bit pour les liaisons 
point à point entre deux routeurs !

Bref, l'affirmation du RFC 4291 (section 2.5.1) comme quoi le bit U 
signifie réellement que l'adresse est unique ou pas n'est *plus* vraie. 
Et, même si on n'avait gardé qu'une seule méthode de création des 
identifiants d'interface, celle fondée sur l'adresse MAC, les exemples 
n'ont pas manqué de constructeurs livrant plusieurs cartes Ethernet 
avec la même adresse (et c'est encore plus vrai sur les machines 
virtuelles). Simon Castaing m'a fourni une bonne liste :
* Chez Asus 
<http://support-org.asus.com/faq/asus-faq.aspx?type=6&no=03E7011E-0ACD-A
C2C-3248-0F1E8DD5425A&SLanguage=en-us>,
* Chez Homeseer <http://board.homeseer.com/showthread.php?p=987050>,
* Chez Archos <http://forum.archosfans.com/viewtopic.php?f=47&t=32132>,
* Chez D-link 
<http://community.spiceworks.com/topic/278156-d-link-dap-2553-aps-with-d
uplicate-mac-addresses>,
* Chez Cisco <http://www.cisco.com/en/US/ts/fn/misc/7.html>,
* Et chez d'autres... <http://www.dslreports.com/faq/11873>
On ne peut donc pas espérer que les identifiants d'interface soient 
mondialement uniques. *On ne peut pas compter sur le bit U.*

Même des protocoles qui, au début, voulaient pouvoir compter sur 
l'unicité de l'identifiant d'interface ont fait marche arrière. Par 
exemple ILNP (RFC 6741) prévoit que les 64 derniers bits de l'adresse 
soient uniques pour un localisateur donné. Mais il a quand même un 
système de détection de duplication, car utiliser EUI-64 pour ces 64 
derniers bits ne suffit pas, comme on l'a vu.

Ah, et puis on a beaucoup parlé du bit U et nettement moins du bit G. 
Les adresses IPv6 formées à partir de l'adresse Ethernet ne devraient 
pas avoir le bit G à 1 (on n'utilise pas les adresses de groupe) mais 
cela ne veut pas dire que ce bit ait une signification particulière, 
dans une adresse IPv6. Comme pour le bit U, une fois l'adresse 
fabriquée, on ne peut plus l'analyser. Si on sait, par un moyen ou un 
autre, qu'une adresse IPv6 a été formée à partir d'une adresse MAC, on 
peut recalculer l'adresse MAC, ce qui peut avoir des avantages 
opérationnels, lors du déboguage d'un réseau. Mais, si on ne le sait 
pas, il vaut mieux s'abstenir : ce n'est pas parce que l'identifiant 
d'interface a le bit U à 1 et le bit G à 0 qu'il a forcément été 
engendré à partir d'une adresse MAC.

Parfois, le mécanisme de génération d'identifiants d'interface par une 
adresse MAC est présenté comme garantissant l'unicité, sans autre 
effort. Comme on l'a vu, ce n'est pas le cas, même si tout le monde 
utilisait ce mécanisme. C'est pour cela qu'IPv6 a un système de 
détection des duplications d'adresses, le DAD ("Duplicate Address 
Detection", RFC 4862). Comme ce système est obligatoire, on n'a pas 
besoin de trouver des méthodes de génération d'adresse qui assurent 
l'unicité : il suffit de laisser le DAD trouver les collisions et, dans 
ce cas, de réessayer. Par exemple, la section 3.3 du RFC 4941 dit qu'en 
cas de collision, on refait tourner l'algorithme (de génération 
aléatoire de l'identifiant) et on obtient donc un nouvel identifiant 
aléatoire.

Les sections 3 et 5 du RFC sont la partie normative de ce document : 
les bits U et G peuvent être utilisés librement par les méthodes de 
génération des identifiants d'interface (et donc des adresses IPv6) et, 
lorsqu'on lit une adresse IPv6 sans connaître le mécanisme de 
génération, il ne faut pas croire qu'on peut déduire quelque chose de 
la valeur de ces deux bits. Dans certains cas (identifiants temporaires 
aléatoires du RFC 4941), c'est même un facteur de sécurité (donner le 
moins d'information possible, cf. section 6).

Cela nécessite de modifier le RFC 4291 : la régle comme quoi les 
identifiants d'interface (à part ceux commençant par trois bits mis à 
zéro) doivent être formés à partir d'une adresse MAC est officiellement 
retirée, et l'allusion aux bénéfices du bit U pour détecter un 
identifiant d'interface mondialement unique également. Comme le note 
notre RFC, cela ne devrait gêner aucune implémentation, cette réforme 
alignant simplement la norme sur la pratique constatée.

_______________________________________________
G6 -- Association Francophone pour la promotion d'IPv6 (http://www.g6.asso.fr)
Liste IPv6tech IPv6tech@g6.asso.fr
Info : http://mail.g6.asso.fr/mailman/listinfo/ipv6tech

Répondre à