Share with friends and colleagues on social media

Un moyen simple de gérer la configuration et le transfert des ports

QEMU/KVM propose de puissantes fonctionnalités réseau, notamment la possibilité de créer de nombreux types de réseaux pour vos VM. Vous pouvez faire en sorte que celles-ci constituent un réseau isolé, un réseau NAT ou un pont. Ces services intégrés peuvent être configurés via DNS et DHCP (support PXE inclus). Pas besoin, donc, de vous préoccuper d’effectuer la maintenance de ces services séparément, si vous n’avez besoin que des fonctionnalités de base. Tout est aisément éditable, via des commandes fournies par libvirt, comme virt-viewer ou virsh.

Cependant, QEMU/KVM souffre d’un problème récurrent : la gestion des mises à jour. De nombreuses actions, telles que l’ajout d’entrées DNS ou DHCP pour un réseau, ne produiront pas de résultats instantanés, même s’il semble que la manipulation ait fonctionné. Par exemple, si vous modifiez, une entrée pour un hôte DHCP fixe, la modification ne sera pas répercutée jusqu’à ce que vous effectuiez les opérations suivantes :

  1. Effectuer un « net-destroy » sur le réseau
  2. Effectuer un « net-start » sur le réseau
  3. Rattacher l’interface réseau à chaque machine virtuelle qui utilisait votre réseau auparavant (oui, toutes les interfaces sont détachées… mais ne sont pas rattachées tant que vous n’avez pas redémarré la machine virtuelle)

Il y a aussi le problème du transfert de port. Comment faire pour exposer au monde extérieur un port qui connecte directement à cette machine virtuelle spécifique ? Pour cela, vous avez besoin d’un ensemble de règles iptables, qui doivent être ajoutées dynamiquement via un script de raccordement.

La documentation officielle de libvirtd évoque ces problèmes et propose deux exemples de scripts de raccordement (https://wiki.libvirt.org/page/Networking#Applying_modifications_to_the_network). Cependant, cette approche est trop générique et utilise trop de valeurs codées en dur. Par exemple, elle inclut le rattachement des interfaces à TOUTES LES VM, même celles qui n’utilisent pas le réseau que vous modifiez. En outre, les deux exemples ne s’intègrent pas bien l’un à l’autre.

La solution est de les réécrire avec les objectifs suivants :

  1. Configurer facilement le transfert de port
  2. Faciliter et accélérer le processus de rafraîchissement de la configuration réseau
  3. Ne modifier que les VM / interfaces affectées

Les scripts résultants sont disponibles sur ce repository Github

Ajouter facilement des transferts de port

  1. Copiez et renommez le fichier « qemu-hook-script » en « /etc/libvirt/hooks/qemu ». Veuillez noter qu’il s’agit d’un fichier appelé « qemu », et non d’un répertoire.
  2. Modifiez le fichier pour ajouter vos règles de transfert. Ajouter une redirection de port est aussi simple que d’ajouter une ligne comme celle-ci :
addForward <VM NAME> <external port> <internal IP> <internal port>

Par exemple, pour rediriger les connexions entrantes sur le port 20022 vers une adresse interne de 192.168.101.200 sur le port 22, à chaque démarrage de la machine virtuelle nommée « caasp-admin », vous écrirez :

addForward caasp-admin 20022 192.168.101.200 22
  1. Définissez-le comme exécutable, sinon QEMU/KVM n’appellera pas le script de raccordement :
chmod +x /etc/libvirt/hooks/qemu

Au prochain démarrage des ordinateurs virtuels répertoriés, les transferts de port seront définis correctement.

Rafraîchir facilement les configurations réseau

  1. Copiez le script « kvm-network-restart » sur votre chemin (je recommande /usr/sbin).
  2. Le rendre exécutable :
chmod +x /usr/sbin/kvm-network-restart

C’est tout. Chaque fois que vous modifiez un attribut sur un réseau, par exemple via « virsh net-edit », vous pouvez désormais rendre les modifications disponibles en exécutant « kvm-network-restart <nom du réseau> ».

Par exemple, supposons que vous souhaitiez réserver une adresse IP pour une machine virtuelle spécifique et l’ajouter au DNS sur un réseau NAT appelé « development ». Il suffit d’exécuter « virsh net-edit development » et d’ajouter ce qui suit :

<dns>
  <host ip='192.168.101.200'>
    <hostname> admin.local </hostname>
  </host>
</dns>
<ip address='192.168.101.1' netmask='255.255.255.0'>
  <dhcp>
<range start='192.168.101.128' end='192.168.101.254'/>
    <host mac='52:54:00:26:37:81' name='admin' ip ='192.168.101.200'/>
  </dhcp>
</ip>

Ensuite, lancez « kvm-network-restart development » et c’est terminé.

Amusez-vous bien !

Blog publié à l’origine par Enrico Mendonca

Share with friends and colleagues on social media
Tags:
Category: Containers, DevOps, Kubernetes, openSUSE, SUSE Linux Enterprise Server, Technical Solutions, Virtualization
This entry was posted mercredi, 13 mars, 2019 at 8:48
You can follow any responses to this entry via RSS.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

No comments yet