L'IPV6 sur un hyperviseur Libvirtd qemu KVM

J'ai mis du temps à comprendre la subtilité. Voici un récapitulatif.

Objectifs

Un hyperviseur:

  • Debian 12 dans mon cas, mais que ce soit Ubuntu, CentOS, ça ne change rien.
  • Sur un serveur dédié, une seule IPV4 publique, mais un bloc /64 entier d'IPV6. Le fournisseur n'autorise qu'une adresse mac par carte réseau. C'est une protection qu'on peut comprendre, mais qui est bien gênante dans le cas des machines virtuelles.
  • Solution Libvirtd qemu KVM, dnsmasq, firewalld.

En IPV4, On va simplement NATer les ports 80 et 443 vers la VM reverse proxy, les ports 25, 143,995 vers la VM de messagerie, le port 25565 vers la VM Minecraft etc....

En IPV6 , une IPV6 publique provenant du range du serveur dédié, sera donnée à chaque machine virtuelle qui a besoin d'être exposée (Pas le serveur MariaDB, ni le PHP-FPM etc...)

Dans la suite, on imagine que le range IPV6 dont vous disposez est 2607:5300:adce:f2cd::/64

IPV6 de l'hôte

Première étape, configurez votre hôte pour qu'il prenne l'IPV6 2607:5300:adce:f2cd::1 et non plus 2607:5300:adce:f2cd:: Je vous laisse faire, car en fonction de l'utilisation d'ANSIBLE, de votre OS, systemd-network ou bien network manager, la méthode sera différente. Dans le cas du'un serveur OVH, c'est expliqué là.

NAT des ports IPV4

Pour le NAT IPV4 des ports de l’hôte vers les VMS, la documentation Libvirtd conseille d'utiliser ce script Python. Suivez simplement les instructions du README pour l'installation. Je n'ai fait que le reverse proxy, le reste est en cours de migration, mon fichier /etc/libvirt/hooks/hooks.json ne contient pour le moment que:

{
    "reverse": {
        "interface": "virbr0", 
        "private_ip": "192.168.100.12",
        "port_map": {"tcp": [80, 443]}
    }
}

Ceci permet de NAT-er les ports 80 et 443 de l'hôte vers l'IP privée 192.168.100.12 (qui correspond au reverse proxy) Lisez la documentation dans le dépôt Github pour avoir d'autres exemples.

Router les IPV6 des machines virtuelles.

Éditez votre réseau virtuel. Commande "virsh net-list" puis "virsh net-edit <nom-du-reseau>"

Ça doit ressembler à ça:

<network>
  <name>nat_network</name>
  <forward mode="route"/>
  <bridge name="virbr0" stp="on" delay="0"/>
  <mac address="XX:XX:XX:XX:XX"/>
  <domain name="nat_network"/>
  <ip address="192.168.100.1" netmask="255.255.255.0">
    <dhcp>
      <range start="192.168.100.128" end="192.168.100.254"/>
    </dhcp>
  </ip>
  <ip family="ipv6" address="2607:5300:adce:f2cd::2" prefix="96">
  </ip>
</network>

Redémarrez le serveur pour que ce soit pris en compte. (Yep, j'ai la flegme de chercher la commande virsh pour le faire proprement)

Résumé du XML précédent:l:

  • mode "route" ce qui n'empêche pas de faire du NAT IPV4, et ça j'ai mis longtemps avant de le comprendre. Les flux IPV6 seront routés. le switch (OVH dans mon cas) verra l'adresse MAC de l'hôte, c'est OK.
  • La passerelle de vos VMS sera la carte virtuelle virbr0 (ne personnalisez pas son nom, ça déconnera sinon) , IPV4 192.168.100.1, IPV6: 2607:5300:adce:f2cd::2 avec un /96 (partie du bloc de /64 IPs)
  • Du DHCP en IPV4, juste que c'est pratique quand on créé des Vms sans fichier preseed

Paramétrage du réseau d'une machine virtuelle exposée:

Voici mon exemple de fichier /etc/network/interfaces pour le reverse proxy:

# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

source /etc/network/interfaces.d/*

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
allow-hotplug ens2
iface ens2 inet static
	address 192.168.100.12/24
	gateway 192.168.100.1
	# dns-* options are implemented by the resolvconf package, if installed
	dns-nameservers 192.168.100.1
	dns-search lan2

iface ens2 inet6 static
	address 2607:5300:adce:f2cd::3
	netmask 64
	gateway 2607:5300:adce:f2cd::2

Au niveau des DNS?

web2(.tinad.fr) a deux enregistrements

  • type A qui correspond à l'IPV4 publique du serveur dédié
  • type AAAA qui correspond à l'IPV6 de la VM reverse proxy, dans notre exemple: 2607:5300:adce:f2cd::3

Ce blog, blog-du-grouik(.tinad.fr) a un CNAME vers web2.tinad.fr. Idem pour les autres sites hébergées ici.

Page top