Laisser un commentaire

Leçon pratique d’ipv6 pour les sysadmins

L’ipv6, cela fait des années qu’on en parle, et pour l’instant, ça reste encore assez flou. La plupart d’entre nous accédons encore au net avec de bonnes vieilles ipv4. Et on s’aperçoit qu’au final, peu de serveurs web sont configurés en ipv6. Voyons comment mettre cela en place.

Anatomie d’une ipv6

Comme l’indique le titre de cet article, il s’agit ici d’un “cours” pratique. Nous ne rentrerons donc pas dans tous les détails du protocole. Si vous désirez en savoir plus, il existe bien entendu de très bons articles sur le sujet. Par ailleurs, vous pouvez consulter le document de référence Linux ipv6 HOWTO dont il existe une traduction en français.

L’ipv6 est un peu moins lisible que l’ipv4. En effet, là où la v4 est écrite sur 32 bits, la v6 en comporte 128, soit 4 fois plus. En terme d’espace adressable on passe donc de 2^32 bits à 2^128 bits. Je vous laisse faire le calcul…

Évidemment, cette nette augmentation en taille se reflète au niveau de l’écriture des adresses. Là où une ipv4 s’écrivait en base 10 avec quatre mots de trois chiffres, l’ipv6 s’écrit en hexadécimal avec huit mots de quatre chiffres.

On passe donc de quelque chose comme 192.168.3.7 à 2607:5300:0060:47b3:0076:0BF2:0000:0001. Évidemment, l’écriture peut être simplifiée en enlevant les zéros non significatifs (ceux sur la gauche de chaque mot). Ainsi, l’adresse précédente peut s’écrire 2607:5300:60:47b3:76:BF2:0:1 et il est facile de la recomposer dans la mesure où l’on sait que chaque mot fait quatre caractères. En outre, lorsque le mot entier est égal à 0, il est possible de l’omettre, exemple : 2607:5300:60:47b3:76:BF2::1. En revanche cela ne peut être fait que pour des mots nuls consécutifs.

En effet, il est aisé de retrouver l’original de cette adresse :
2607:5300:60:47b3::1 puisqu’elle doit comporter 8 mots : 2607:5300:60:47b3:0:0:0:1.

En revanche, dans un cas comme celui-ci 2607::60:47b3::1, comment pouvez-vous savoir combien de mots nuls se trouvent avant :60: et avant :1 ? Impossible !

Portée de l’adresse

Les adresses qui commencent par FE80: sont des adresses de type link. C’est à dire qu’elles ont vocation à permettre aux équipements connectés sur le même réseau physique de communiquer entre eux. Elles ne doivent pas passer les routeurs. À titre de comparaison, la porté est similaire à celles des adresses MAC sur l’Ethernet.

À l’inverse, les autres adresses ont une porté globale et doivent donc être routées sur tout l’Internet.

Comme en ipv4, une adresse ipv6 est composée de deux parties :

Comme en ipv4 donc, l’adresse possède un masque de réseau définissant la limite entre la partie réseau et la partie machine de l’adresse. De nombreux fournisseurs vous donnerons des /64, ce qui vous laisse avec un nombre très impressionnant d’ip routables sur une machine.

Si nous reprenons notre exemple précédent nous obtenons le préfixe 2607:5300:60:47b3::/64. Les adresses ip de ce réseau vont donc de 2607:5300:60:47b3::1 à 2607:5300:60:47b3:ffff:ffff:ffff:ffff, ce qui constitue tout de même 2^64 soit 18 446 744 073 709 551 616 ip publiques !

Types particuliers

Comme en ipv4, certaines adresses ont des usages particuliers. Petite synthèse dans le tableau suivant :

Addresse IPv6 Description Note
:: non définie Utilisé comme route par défaut et pour les router solicitations. Correspond à 0.0.0.0 de l’IPv4.
::1 Adresse de loopback cf. 127.0.0.1 en IPv4
fe80:: lien local Adresse non routable autoconfigurée. Utilisée sur le LAN, par exemple pour le DHCPv6
fc00:: unique local Addresse utilisée uniquement dans les autonomous system, non routable de manière globale. Cf. RFC 1918, comme les adresses utilisées en NAT.
ff00:: multicast
2xxx:: / 3xxx global unicast Toutes les adresses globales unicast commencent par 2xxx ou 3xxx.

Mise en place sur le serveur

Comme toujours sur ce blog, les exemples concernent les Debian-like. Bien entendu, la démarche est assez semblable sur les autres Linux.

Première étape, vous devez connaître votre préfixe ip et la passerelle par défaut tels que fournis par votre hébergeur ou votre FAI.

Il faut bien entendu au préalable que votre kernel prenne en charge l’ipv6. Tous les kernel récents sont compatibles et ont l’ipv6 activé par défaut. Si votre kernel est une version inférieur à 2.6, vous devriez songer à le mettre à jour.

Avec un kernel compatible et un équipement réseau fonctionnel, vous devez d’ors et déjà posséder une adresse de type lien. Vérifions tout ça avec ip addr, l’équivalent du bon vieux ifconfig qui est aujourd’hui déprécié.

ip -6 addr show dev eth0
4: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qlen 1000
    inet6 fe80::225:90ff:fe7c:fa36/64 scope link
       valid_lft forever preferred_lft forever

Avec quelques options de plus, on spécifie à la commande ip de n’afficher que les infos concernant l’ipv6 de l’interface eth0. Ici, on voit donc bien qu’on a une adresse de type scope link et qui commence par fe80.

Admettons que nous ayons le bloc 2607:5300:60:47b3::/64, et la gateway 2607:5300:60:47b3:ffff:ffff:ffff:ffff nous allons ajouter l’ip 2607:5300:60:47b3::1 à notre serveur.

# il est également possible de le faire avec ifconfig
# mais nous l'avons dit, la commande est dépréciée,
# prenons donc de bonnes habitudes
ip -6 addr add 2607:5300:60:47b3::1/64 dev eth0

# on ajoute maintenant la gateway
ip -6 route add 2607:5300:60:47b3:ffff:ffff:ffff:ffff dev eth0
ip -6 route add default via 2607:5300:60:47b3:ffff:ffff:ffff:ffff

# on confirme que l'ip a bien été ajoutée
ip -6 addr show eth0
3: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qlen 1000
    inet6 2607:5300:60:47b3::1/64 scope global
       valid_lft forever preferred_lft forever
    inet6 fe80::225:90ff:fe7c:fa36/64 scope link
       valid_lft forever preferred_lft forever

# on confirme aussi la gateway
ip -6 route
2001:41d0:8:6fdd::/64 dev eth0  proto kernel  metric 256
2607:5300:60:47b3:ffff:ffff:ffff:ffff dev eth0  metric 1024
fe80::/64 dev eth0  proto kernel  metric 256
default via 2607:5300:60:47b3:ffff:ffff:ffff:ffff dev eth0  metric 1024

Si vous voulez enlever l’ip que vous venez de configurer, vous reprenez les mêmes commandes et remplacez add par del.

En dernier lieu, comme ces commandes ne survivront pas à un redémarrage, il faut s’assurer que notre configuration soit automatiquement restaurée au démarrage de la machine. Pour cela, direction /etc/network/interfaces. On y ajoute un bloc dédié à l’ipv6 :

iface eth0 inet6 static
    address 2607:5300:60:47b3::1
    netmask 64

    post-up /sbin/ip -6 route add 2607:5300:60:47b3:ffff:ffff:ffff:ffff dev eth0
    post-up /sbin/ip -6 route add default via 2607:5300:60:47b3:ffff:ffff:ffff:ffff
    pre-down /sbin/ip -6 route del 2607:5300:60:47b3:ffff:ffff:ffff:ffff dev eth0
    pre-down /sbin/ip -6 route del default via 2607:5300:60:47b3:ffff:ffff:ffff:ffff

Certains hébergeurs, Online.net par exemple, attribuent les ip par DHCP, dans ce cas, la configuration sera un peu différente car il faudra mettre en place un client DHCP compatible ipv6. La doc d’Online explique le processus.

Par ailleurs, pour que l’ipv6 fonctionne correctement, elle a besoin du ping car il remplit un rôle important dans le nouveau protocole ip. Si vous aviez l’habitude de le bloquer en ipv4, il vous faudra ici ouvrir les mannes :

ip6tables -A INPUT -p ipv6-icmp -j ACCEPT
ip6tables -A OUTPUT -p ipv6-icmp -j ACCEPT

Et voilà, vous êtes paré pour le futur !

Commentaires

Rejoignez la discussion !

Vous pouvez utiliser Markdown pour les liens [ancre de lien](url), la mise en *italique* et en **gras**. Enfin pour le code, vous pouvez utiliser la syntaxe `inline` et la syntaxe bloc

```
ceci est un bloc
de code
```