Transfert de port d'hôte à invité avec libvirt 0.8.3 à l'aide de KVM sur Ubuntu

14

L'hôte dispose d'une seule adresse IP externe disponible, j'ai donc configuré mes invités KVM avec NAT.

Comment configurer une redirection de port pour transmettre certaines des demandes de l'extérieur aux invités?

Je n'ai trouvé aucune documentation à ce sujet. La réponse la plus proche est probablement cette réponse , mais il est également mentionné qu'il existe un moyen plus facile de le faire dans libvirt 0.8.3. Quelqu'un connaît-il une façon plus actuelle de procéder?

wei
la source
externe - vous voulez dire IP Internet? ou juste votre LAN (externe aux VMs)? Pouvez-vous allouer ces adresses externes à vos machines virtuelles pour configurer un réseau ponté?
Art Shayderov
Je ne peux obtenir qu'une seule adresse IP Internet, c'est pourquoi je n'ai pas utilisé le mode réseau ponté.
wei

Réponses:

12

Voici une meilleure façon de configurer la redirection de port, en utilisant un script de raccordement ( source ).

Dans /etc/libvirt/hooks/qemu:

#!/bin/sh

GUEST_NAME=
HOST_PORT=
GUEST_IPADDR=
GUEST_PORT=

if [ "$1" = "$GUEST_NAME" ]; then
  if [ "$2" = start ]; then
    iptables -t nat -A PREROUTING -p tcp --dport "$HOST_PORT" \
         -j DNAT --to "$GUEST_IPADDR:$GUEST_PORT"
    iptables -I FORWARD -d "$GUEST_IPADDR/32" -p tcp -m state \
         --state NEW -m tcp --dport "$GUEST_PORT" -j ACCEPT
  elif [ "$2" = stopped ]; then
    iptables -t nat -D PREROUTING -p tcp --dport "$HOST_PORT" \
         -j DNAT --to "$GUEST_IPADDR:$GUEST_PORT"
    iptables -D FORWARD -d "$GUEST_IPADDR/32" -p tcp -m state \
         --state NEW -m tcp --dport "$GUEST_PORT" -j ACCEPT
  fi
fi

Vous devez définir les quatre variables en haut pour qu'elles correspondent à votre configuration libvirt.

Vous devrez redémarrer libvirt-bin, ce qui se fait sur Ubuntu avec:

sudo sh -c 'service libvirt-bin stop; service libvirt-bin start'

alors vous devrez redémarrer l'invité. Sur Ubuntu, vous devrez vous ajuster /etc/apparmor.d/usr.sbin.libvirtdpour permettre au script hook de s'exécuter:

À côté de

/usr/sbin/* PUx,

ajouter

/etc/libvirt/hooks/* PUx,

Rechargez ensuite l'apparmeur:

sudo service apparmor reload

Il y a probablement un moyen de configurer automatiquement en $GUEST_IPADDRutilisant virsh / dumpxml / iface-dumpxml, mais je ne l'ai pas trouvé. Alternativement, l'IP peut être définie statiquement dans la documentation réseau xml : .

Pour autant que je sache, les filtres réseau ne peuvent être utilisés que pour restreindre ce qui se passe sur le réseau virtuel, et ils ne sont pas utiles pour la redirection de port.

Tobu
la source
1
Trusty a une ligne /etc/libvirt/hooks/** rmix,dans le fichier de configuration apparmor par défaut, et il semble avoir le même effet. J'ai pu exécuter le script sans modifier la configuration de l'apparmeur.
Amir Ali Akbari
2

Je suis dans une situation similaire. J'ai un serveur Windows fonctionnant en KVM dans le réseau NAT privé qui est connecté sur l'hôte via l'interface virbr0. Je veux accéder à la machine virtuelle via un bureau distant. Je dois donc transférer le trafic vers le port 3389 (RDP) vers le port VM 3389. J'y suis parvenu avec quelques règles iptables.

/ sbin / iptables -t nat -A PREROUTING -p tcp -d HOST-IP --dport 3389 -j DNAT --to-destination VM-IP: 3389

/ sbin / iptables -I FORWARD -m state -d VM-NET / 24 --state NEW, RELATED, ESTABLISHED -j ACCEPT

HOST-IP, VM-IP et VM-NET doivent bien sûr être adoptés. Cependant, jouer avec iptables et libvirt est délicat. En ce moment, je recherche une solution pour accéder à Internet sur ma machine virtuelle que j'ai perdue en raison des règles iptables :-(

spa
la source
Je sais que ça fait quelques années mais cette réponse a fonctionné pour moi. Merci!
mttdbrd
1

Je crois que la réponse que vous mentionnez montre toujours des règles iptables appropriées. Cependant, vous pouvez désormais utiliser un hook de script pour créer et détruire des règles lorsque les machines virtuelles sont démarrées et arrêtées. Comme Isaac l'a dit dans la réponse précédente, il existe également des filtres réseau dans libvirt actuel, mais je ne sais pas comment ni même s'ils peuvent être utilisés pour ouvrir des ports pour les invités NAT.

sciurus
la source
0

comment le réseau invité est-il configuré? s'il est ponté, il vous suffit de transmettre les ports aux adresses IP des invités. Si vos invités sont derrière un autre NAT, celui que libvirt met en place, alors ça se complique

mais dans tous les cas, ici, vous traitez simplement les VM comme vous le feriez pour une machine physique

Dyasny
la source
Je suppose que je ne l'ai pas dit clairement. L'hôte n'est pas dans un NAT, il a une adresse IP externe. Malheureusement, le réseau invité est derrière le NAT mis en place par libvirt.
wei
ah, alors c'est une autre affaire. libvirt gère essentiellement sa propre solution NAT, qui peut être modifiée.
dyasny
oui, c'est ce qu'on m'a dit, ça peut être édité. Mais je ne trouve aucune référence à ce sujet, les fichiers de configuration xml de nwfilter me semblent tout simplement bizarres, la documentation sur le site Web de libvirt n'est pas très utile non plus.
wei
Si vous avez un réseau ponté, vous pouvez simplement abandonner le NAT libvirt par défaut et configurer tout ce que vous voulez. Comme l'a dit Dyasny, traitez les VM comme vous le feriez pour une machine physique. J'ai un hôte KVM et une interface avec une adresse IP externe est affectée à une machine virtuelle configurée comme passerelle. Si cela vous convient, je peux poster la configuration (style ubuntu).
Art Shayderov