Table des matières
Implémentation de l'IPv6 sur les machines virtuelles
L'ajout de l'IPv6 permet aux machines virtuelles, au contraire de la NAT, d'être accessibles directement sur Internet.
Son implémentation au sein de l'infrastructure libvirt s'est faite de manière empirique et peut ne pas être optimisée, mais fonctionne correctement.
Adresses IPv6 attribuées sur les hôtes
| Interface | Hôte Maine | Hôte Coon |
|---|---|---|
enp0s31f6 (WAN) | 2a01:4f8:10b:c41::/64 | 2a01:4f8:10b:c42::/64 |
virbr0 1) | 2a01:4f8:10b:c41::1:4/64 | 2a01:4f8:10b:c42::1:5/64 |
Attribution des adresses IPv6
Chaque VM a une adresse IPv6 unique et constante. Elle est basée sur l'adresse IPv4 que prend la VM automatiquement 2). En temps normal, la communication entre les machines et le routeur de Hetzner fait qu'en configuration automatique, les machines s'attribuent d'elles mêmes cette adresse IP pour un temps donné, et renouvellent elles mêmes ce bail lorsque le routeur vient appliquer ses protocoles de découverte des routes.
Malheureusement, le fait que nous ayons deux interfaces (enp0s31f6 et TAP) fait que cette communication ne passe pas.
Deux adresses IPv6 sont attribuées chacune venant du /64 des deux hosts.
Pour palier au manque d'IPv6 failover de Hetzner, comme cela tout est déjà configuré sur les VM en cas de bascule, il n'y a que le DNS à modifier. Les VM sont donc en configuration statique de ce type :
allow-hotplug ens8
iface ens8 inet6 static
address 2a01:4f8:10b:c42::57/128
gateway fe80::fc54:ff:fec3:b9c7
post-up ip -6 address add 2a01:4f8:10b:c41::57/128 dev ens8
Étant donné que l'interface virbr0 des hôtes est configurée pour du NAT, une seconde interface TAP est déployée via libvirt pour ne gérer que l'IPv6 ouvert sur Internet, nommée par exemple vm-ipv6-mail.
Chaque VM possède également une seconde carte réseau branchée sur cette interface TAP (ens8).
L'IPv6 est désactivé sur l'interface virbr0 et ens3 de chaque VM via la configuration suivante :
- /etc/sysctl.d/98-no-ipv6-ens3.conf
net.ipv6.conf.ens3.disable_ipv6=1
Routage
Il y a deux routages à effectuer : indiquer aux hôtes où envoyer les paquets venant du WAN à destination des VM et indiquer aux hôtes de faire passer le trafic entre les deux /64 de Maine et Coon via l'interface réseau locale entre les deux serveurs.
Le premier routage est effectué par des règles de ce type, ajoutées sur chaque hôte pour toutes les VM qu'il héberge, ajoutées via le hook qemu de libvirt :
2a01:4f8:10b:c41::57 via fe80::5054:ff:fec3:b9c7 dev vm-ipv6-mail metric 1024 pref medium
Cela indique que l'adresse IP est accessible dans l'interface vm-ipv6-mail.
Elle est poussée par la commande suivante :
/sbin/ip route add 2a01:4f8:10b:c41::57/128 via fe80::5054:ff:fec3:b9c7 dev vm-ipv6-mail
Le second routage est effectué par une route indiquant sur l'hôte opposé que l'adresse IPv6 est accessible via l'adresse link-local de l'interface virbr0 associée à cette interface, par exemple sur Maine :
2a01:4f8:10b:c41::57 via fe80::5054:ff:fe3c:686 dev virbr0 metric 1024 pref medium
Elle est poussée via cette commande, inscrite dans le script hook qemu de libvirt de l'hôte qui n'héberge pas la VM :
/sbin/ip route add 2a01:4f8:10b:c41::57/128 via fe80::5054:ff:fe3c:686 dev virbr0
ToDo
Faire en sorte d'avoir de l'IPv6 fonctionnel lorsque l'on bascule les VM d'un hôte à l'autre, dans le cas d'une indisponibilité longue durée d'un des hôtes.
