Date de publication du RFC : Septembre 2013
Auteur(s) du RFC : B. Liu, S. Jiang (Huawei Technologies), B. Carpenter (University of Auckland), S. Venaas (Cisco Systems), W. George (Time Warner Cable)
Pour information
Réalisé dans le cadre du groupe de travail IETF 6renum
Première rédaction de cet article le 14 septembre 2013
Si on pouvait facilement renuméroter (changer les adresses IP) d'un réseau, beaucoup de problèmes seraient moins graves. Par exemple, il y aurait moins de demande pour des adresses PI. Mais, comme l'explique bien le RFC 5887, renuméroter, en pratique, est difficile, et les administrateurs réseaux, à juste titre, font tout ce qu'ils peuvent pour l'éviter. Pour essayer de résoudre ce problème, l'IETF a un groupe de travail 6renum, dont voici le troisième RFC. 6renum travaille à faciliter la rénumérotation en IPv6. Ce RFC 7010 est consacré à l'analyse des trous : que manque t-il comme protocole IETF pour faciliter la renumérotation ?
C'est un enjeu important pour l'Internet : sans renumérotation facile, les administrateurs réseaux se tourneront encore plus massivement vers les adresses PI, qui exercent une pression sur la table de routage (RFC 4984). Le RFC 6879, plus pratique, décrivait un certain nombre de scénarios de renumérotation et ce nouveau document, le RFC 7010 va bâtir sur ces scénarios en regardant ce qui gêne leur réalisation (et qui nécessitera un travail à l'IETF). Les machines ayant une adresse IP statique, typiquement les serveurs, sont traitées dans un autre document, le RFC 6866. De même, le cas d'une rénumérotation urgente et non planifiée, par exemple suite à la faillite d'un FAI, n'est pas couvert ici.
Donc, d'abord (section 2), qu'appelle t-on une rénumérotation réussie ? Que voudrait-on comme propriétés ? Une rénumérotation part d'un ancien préfixe et arrive à un nouveau. Pour les moyennes et grandes organisations, on a pu recevoir ce nouveau préfixe par des moyens humains (message électronique, par exemple). Pour les petites, on a pu le recevoir par une délégation, genre DHCPv6-PD (Prefix Delegation, RFC 8415). Dans les deux cas, on voudrait plein de choses :
Comme le savent les lecteurs du RFC 5887, on en est loin...
Et quels sont les protocoles, les outils et les procédures qui peuvent nous aider à s'approcher de ces beaux objectifs (section 3) ? Les protocoles sont les suivants :
Il y a aussi des outils :
Et des procédures :
Mais, en pratique, cela ne suffit pas. La section 5 se penche sur
le premier problème, la configuration des adresses dans les machines
terminales et les routeurs. D'abord, l'interaction entre SLAAC et
DHCP, une source de frustration fréquente pour les administrateurs
réseaux IPv6. En gros, ces deux protocoles permettent de faire la
renumérotation. S'ils sont présents tous les deux sur un réseau, c'est
plus compliqué et il faut bien les coordonner. Le plus simple est
quand même de n'en avoir qu'un seul (ce qui est, heureusement, le cas
le plus courant). Normalement, il existe des
indications dans les messages permettant de coordonner les deux
protocoles (options M et O du RA, cf. RFC 4861, section 4.2). Mais ils sont traités comme indicatifs seulement. Résultat, les différents systèmes
d'exploitation ne les interprètent pas de la même manière. On n'est
donc pas sûr, par exemple, qu'on puisse renuméroter avec les RA des
machines qui avaient été configurées en DHCP
(ManagedFlag
passant de 1 à 0). De même, les RFC 4862 et RFC 3315 ne sont
pas clairs sur ce que doit faire une machine cliente DHCP lorsqu'elle
voit des nouveaux préfixes être annoncés par des RA. Un problème
analogue se pose en sens inverse (transition de DHCP vers SLAAC).
Et pour les routeurs ? Logiquement, tout devrait bien se passer sauf que, contrairement aux machines terminales qui acceptent toutes de changer d'adresse IP en vol, certains routeurs doivent être redémarrés lorsque cela leur arrive.
Comme souvent en renumérotation, on s'épargnerait bien des problèmes en utilisant des noms dans les configurations et pas des adresses IP. Mais le RFC note, à juste titre, que ce n'est pas toujours le cas pour les routeurs.
Une fois machines terminales et routeurs renumérotés, il reste à
mettre à jour des tas de configurations et de bases de données qui
stockent encore les anciennes adresses. C'est l'objet de la section
6. Premier exemple, les zones DNS. La zone peut
être maintenue à la main, avec un éditeur et il
faudra alors faire un rechercher/remplacer. Ou bien on peut utiliser
les mises à jour dynamiques (RFC 3007). Cette
fonction existe depuis longtemps, est mise en œuvre dans plusieurs
logiciels serveurs mais, pour que chaque machine puisse
individuellement faire la mise à jour, il faut un mécanisme
d'autorisation, et gérer une clé dans chaque machine n'est pas
pratique. Il est plus commun que la mise à jour du DNS soit faite par
le serveur DHCP, pour le compte des machines terminales (RFC 4704). Cela marche très bien si la renumérotation est faite
par DHCP. Si on a utilisé SLAAC, il n'existe pas de solution évidente
(aujourd'hui : des réflexions sont en cours, par exemple dans
draft-ietf-dhc-addr-registration
).
Il reste à traiter le cas des adresses IP éparpillées un peu partout, notamment dans des ACL. Il n'existe pas de solution générale pour ce problème. Mais notre RFC recommande que, lorsqu'on utilise des adresses IP dans des configurations, on définisse une variable au début et on l'utilise ensuite, pour limiter la douleur de la renumérotation. Un exemple en shell Unix avec Netfilter, pour un routeur Unix qui transmet vers un serveur HTTP :
# Define the variable WEBSERVER=2001:db8:cafe::1:34a # By default, block everything ip6tables --policy FORWARD DROP # Allow ICMP. We could be more selective. ip6tables --append FORWARD --protocol icmp --destination ${WEBSERVER} --jump ACCEPT # Rate limiting ip6tables --append FORWARD --protocol tcp --destination ${WEBSERVER} --dport 80 --tcp-flags SYN SYN -m hashlimit \ --hashlimit-name Web --hashlimit-above 3/second --hashlimit-mode srcip \ --hashlimit-burst 7 --hashlimit-srcmask 28 --jump DROP # Allow HTTP and HTTPS ip6tables --append FORWARD --protocol tcp --destination ${WEBSERVER} \ --dport 80:443 --jump ACCEPT
Ainsi, le script n'utilise qu'une seule fois l'adresse, au début, et est donc bien plus facile à modifier. Un programme comme ack-grep est très pratique pour trouver tous ces cas où une adresse est stockée dans la configuration :
# ack-grep --all 2001:db8:cafe::1:42 network/interfaces 14: address 2001:db8:cafe::1:42 nsd3/nsd.conf 15: ip-address: 2001:db8:cafe::1:42 ...
Pour simplifier ce problème des adresses IP dispersées un peu partout, notre RFC recommande l'utilisation d'outils de gestion de configuration comme Chef ou Puppet : on change la configuration à un endroit et elle est ensuite poussée vers tous les serveurs. Il existe aussi des outils non-libres, spécifiques à un vendeur particulier, pour assurer cette tâche et le RFC regrette l'absence d'une norme complète (NETCONF ne règle pas tous les cas) et ouverte pour cette question de mise à jour.
Pour que l'opération de migration vers les nouvelles adresses se passe bien, il faut aussi des mécanismes de gestion des événements, notamment de notification (« Un nouveau préfixe est arrivé »). Ces notifications permettraient, par exemple, d'invalider les caches DNS (pour forcer une mise à jour), ou de changer les configurations de filtrage (le RFC 2827 demande qu'on ne laisse pas sortir de son réseau les paquets ayant une adresse IP source autre que celles du réseau ; mettre ce filtrage en œuvre nécessite de connaître le préfixe du réseau local, et d'en changer si nécessaire). Cette notification n'est pas triviale, notamment si on utilise SLAAC (puisque, dans ce cas, aucun serveur central n'est informé du changement d'adresse d'une machine)
Le DNS pose d'ailleurs d'autres questions. En raison du TTL des enregistrements DNS, les nouvelles informations ne peuvent pas être réjuvénées instantanément. Si la rénumérotation du réseau est prévue suffisemment à l'avance, la bonne pratique est d'abaisser ces TTL avant, de faire le changement, puis de remonter les TTL.
Les sections 9 et 10 résument les trous qu'il y a actuellement dans les protocoles TCP/IP, et dont le comblement rendrait la rénumérotation plus facile :
La section 10 se spécialise dans les trous considérés comme insolubles, et dont le groupe 6renum ne s'occupera donc pas :
AAAA
(nom
-> adresse) et PTR
(adresse -> nom) dans le
DNS. Cette synchronisation est d'autant plus insoluble que les zones
« directes » et « inverses » (ip6.arpa
) peuvent
très bien être gérées par des hébergeurs différents.A6
du
RFC 2874. Trop complexe, le
A6
a été peu déployé et a officiellement été
abandonné avec le RFC 6563. L'idée de séparer
le préfixe de l'adresse et son suffixe lors de la résolution DNS reste dans
l'air mais le groupe 6renum n'a pas l'intention de s'y
attaquer.Voilà, nous avons fait le tour des problèmes, il reste à lire la section 11, spécialisée dans les questions de sécurité. Par exemple, si on a des ACL sur les adresses IP, et qu'elles interdisent à certains méchants de se connecter à l'adresse IP d'un serveur, la rénumérotation ne doit pas invalider cette liste noire : la règle doit être mise à jour pour pointer vers la nouvelle adresse IP du serveur.
Mais on peut aussi noter que la configuration automatique, souhaitée par le RFC, amène aussi ses propres risques, comme illustré par l'accident de Cloudflare ou comme un cas rigolo avec Ansible.
Version PDF de cette page (mais vous pouvez aussi imprimer depuis votre navigateur, il y a une feuille de style prévue pour cela)
Source XML de cette page (cette page est distribuée sous les termes de la licence GFDL)