Port Forwarding da host a guest con libvirt 0.8.3 usando KVM su Ubuntu


14

L'host ha un singolo IP esterno disponibile, quindi ho impostato i miei ospiti KVM con NAT.

Come posso impostare un port forwarding per inoltrare alcune richieste dall'esterno agli ospiti?

Non sono riuscito a trovare documentazione su questo. La risposta più vicina è probabilmente questa risposta , ma poi viene anche menzionato il modo più semplice per farlo in libvirt 0.8.3. Qualcuno sa di un modo più attuale per farlo?


esterno - intendi IP Internet? o solo la tua LAN (esterna alle VM)? È possibile allocare tali indirizzi esterni alle macchine virtuali per configurare reti collegate?
Art Shayderov,

Posso ottenere solo un indirizzo IP Internet, ecco perché non ho usato la modalità di rete con bridge.
wei,

Risposte:


12

Ecco un modo migliore per impostare il port forwarding, usando uno script hook ( sorgente ).

In /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

Dovresti impostare le quattro variabili in alto per adattarle alla tua configurazione di libvirt.

Dovrai riavviare libvirt-bin, che su Ubuntu è fatto con:

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

quindi dovrai riavviare il guest. Su Ubuntu, dovrai regolare /etc/apparmor.d/usr.sbin.libvirtdper consentire l'esecuzione dello script hook:

Accanto a

/usr/sbin/* PUx,

aggiungere

/etc/libvirt/hooks/* PUx,

Quindi ricaricare apparmor:

sudo service apparmor reload

C'è probabilmente un modo per autoconfigurare $GUEST_IPADDRusando virsh / dumpxml / iface-dumpxml, ma non l'ho trovato. In alternativa, l'IP può essere impostato staticamente nella rete xml: documentazione .

Per quanto ne so, i filtri di rete possono essere utilizzati solo per limitare ciò che accade sulla rete virtuale e non sono utili per il port forwarding.


1
Trusty ha una linea /etc/libvirt/hooks/** rmix,nel file di configurazione di apparmor per impostazione predefinita e sembra avere lo stesso effetto. Potrei eseguire lo script senza modificare la configurazione di apparmor.
Amir Ali Akbari,

2

Sono in una situazione simile. Ho un server Windows in esecuzione in KVM nella rete NAT privata che è connessa all'host tramite l'interfaccia virbr0. Voglio accedere alla VM tramite desktop remoto. Quindi devo inoltrare il traffico alla porta 3389 (RDP) alla porta VM 3389. Ho raggiunto questo obiettivo con alcune regole iptable.

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

/ sbin / iptables -I AVANTI -m stato -d VM-NET / 24 --stato NUOVO, CORRELATO, STABILITO -j ACCETTA

HOST-IP, VM-IP e VM-NET devono ovviamente essere adottati. Tuttavia, fare confusione con iptables e libvirt è complicato. In questo momento sto cercando una soluzione per ottenere l'accesso a Internet sulla mia macchina virtuale che ho perso a causa del pasticcio con le regole di iptable :-(


So che ha qualche anno, ma questa risposta ha funzionato per me. Grazie!
mttdbrd,

1

Credo che la risposta a cui fai riferimento mostri ancora le regole iptables appropriate. Tuttavia, ora è possibile utilizzare un hook di script per creare e distruggere le regole all'avvio e all'arresto delle macchine virtuali. Come ha detto Isaac nella risposta precedente, ci sono anche filtri di rete nell'attuale libvirt ma non sono sicuro di come o anche se possano essere usati per aprire le porte per gli ospiti NATed.


0

come si configura la rete ospite? se è collegato, tutto ciò che devi fare è inoltrare le porte agli IP degli ospiti. Se i tuoi ospiti sono dietro l'ennesimo NAT, quello che viene impostato su Libvirt, diventa complicato

ma in ogni caso, qui trattate semplicemente le macchine virtuali come fareste con una macchina fisica


Immagino di non averlo detto chiaramente. L'host non si trova in un NAT, ha un indirizzo IP esterno. Sfortunatamente, la rete ospite è dietro il NAT creato da libvirt.
wei

ah, allora è un'altra questione. fondamentalmente libvirt gestisce la propria soluzione NAT, che può essere modificata.
dyasny,

sì, è quello che mi è stato detto, può essere modificato. Ma non riesco proprio a trovare alcun riferimento al riguardo, i file di configurazione xw di nwfilter mi sembrano solo bizzarri, la documentazione sul sito Web di libvirt non è molto utile.
wei

Se disponi di un collegamento in rete, puoi semplicemente abbandonare il NAT libvirt predefinito e configurare tutto ciò che desideri. Come diceva Dyasny, tratta la VM come faresti con una macchina fisica. Ho un host KVM e l'interfaccia con IP esterno è assegnata a una VM configurata come gateway. Se è adatto alle tue esigenze, posso pubblicare la configurazione (stile Ubuntu).
Art Shayderov,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.