Portweiterleitung vom Host zum Gast mit libvirt 0.8.3 Verwenden von KVM unter Ubuntu

14

Der Host verfügt über eine einzige externe IP-Adresse, sodass ich meine KVM-Gäste mit NAT einrichten kann.

Wie richte ich eine Portweiterleitung ein, um einige der Anfragen von außen an die Gäste weiterzuleiten?

Ich konnte dazu keine Dokumentation finden. Die naheliegendste Antwort ist wahrscheinlich diese Antwort , aber es wird auch erwähnt, dass es in libvirt 0.8.3 einfacher ist, dies zu tun. Kennt jemand einen aktuelleren Weg, dies zu tun?

wei
quelle
extern - meinst du internet IP? oder nur Ihr LAN (außerhalb von VMs)? Können Sie diese externen Adressen Ihren VMs zuweisen, um ein Bridged-Networking einzurichten?
Art Shayderov
Ich kann nur eine Internet-IP-Adresse erhalten, deshalb habe ich den Bridged-Networking-Modus nicht verwendet.
Wei

Antworten:

12

Hier ist eine bessere Möglichkeit, die Portweiterleitung mithilfe eines Hook-Skripts ( Quelle ) einzurichten .

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

Sie sollten die vier Variablen oben einstellen, damit sie zu Ihrem libvirt-Setup passen.

Du musst libvirt-bin neu starten, was auf Ubuntu erledigt ist mit:

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

Dann müssen Sie den Gast neu starten. Unter Ubuntu müssen Sie die Einstellungen anpassen /etc/apparmor.d/usr.sbin.libvirtd, damit das Hook-Skript ausgeführt werden kann:

Neben an

/usr/sbin/* PUx,

anhängen

/etc/libvirt/hooks/* PUx,

Dann lade apparmor neu:

sudo service apparmor reload

Es gibt wahrscheinlich eine Möglichkeit zur $GUEST_IPADDRautomatischen Konfiguration mit virsh / dumpxml / iface-dumpxml, aber ich habe es nicht gefunden. : Alternativ kann die IP statisch im Netzwerk xml eingestellt werden Dokumentation .

Soweit ich weiß, können Netzwerkfilter nur dazu verwendet werden, die Vorgänge im virtuellen Netzwerk einzuschränken, und sie sind für die Portweiterleitung nicht hilfreich.

Tobu
quelle
1
Trusty enthält /etc/libvirt/hooks/** rmix,standardmäßig eine Zeile in der Konfigurationsdatei von apparmor, und dies scheint den gleichen Effekt zu haben. Ich konnte das Skript ausführen, ohne die Apparmor-Konfiguration zu ändern.
Amir Ali Akbari
2

Ich bin in einer ähnlichen Situation. Ich habe einen Windows Server in KVM im privaten NAT-Netzwerk, der auf dem Host über die Schnittstelle virbr0 verbunden ist. Ich möchte über einen Remotedesktop auf die VM zugreifen. Daher muss ich den Datenverkehr an Port 3389 (RDP) an den VM-Port 3389 weiterleiten. Dies habe ich mit einigen iptable-Regeln erreicht.

/ sbin / iptables -t nat -A PREROUTING -p tcp -d Host-IP --dport 3389 -j DNAT --zum Ziel VM-IP: 3389

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

HOST-IP, VM-IP und VM-NET müssen selbstverständlich übernommen werden. Es ist jedoch schwierig, mit iptables und libvirt zu spielen. Im Moment bin ich auf der Suche nach einer Lösung, um Zugang zum Internet auf meiner VM zu erhalten, die ich durch das Durcheinander mit den iptable-Regeln verloren habe :-(

Spa
quelle
Ich weiß, dass es ein paar Jahre alt ist, aber diese Antwort hat bei mir funktioniert. Vielen Dank!
Mttdbrd
1

Ich glaube, dass die Antwort, auf die Sie verweisen, immer noch die entsprechenden Iptables-Regeln enthält. Jetzt können Sie jedoch mithilfe eines Skript-Hooks Regeln erstellen und löschen, wenn virtuelle Maschinen gestartet und gestoppt werden. Wie Isaac in der vorherigen Antwort sagte, gibt es auch Netzwerkfilter in der aktuellen Version von libvirt, aber ich bin mir nicht sicher, wie oder ob sie verwendet werden können, um Ports für NAT-Gäste zu öffnen.

Sciurus
quelle
0

Wie ist das Gast-Networking aufgebaut? Wenn es überbrückt ist, müssen Sie die Ports nur an die IP-Adressen der Gäste weiterleiten. Wenn sich Ihre Gäste hinter einem weiteren NAT befinden, das von einem libvirt eingerichtet wird, wird es kompliziert

In jedem Fall behandeln Sie die VMs hier einfach wie eine physische Maschine

dyasny
quelle
Ich glaube, ich habe es nicht sehr deutlich gesagt. Der Host befindet sich nicht in einem NAT, er hat eine externe IP-Adresse. Leider steckt das Gastnetzwerk hinter dem von libvirt eingerichteten NAT.
Wei
Ah, dann ist es eine andere Sache. Grundsätzlich verwaltet libvirt seine eigene NAT-Lösung, die bearbeitet werden kann.
dyasny
Ja, das wurde mir gesagt, es kann bearbeitet werden. Aber ich kann einfach keinen Hinweis darauf finden, die nwfilter xml-Konfigurationsdateien scheinen mir nur bizarr zu sein, auch die Dokumentation auf der libvirt-Website ist nicht sehr hilfreich.
Wei
Wenn Sie das Netzwerk überbrückt haben, können Sie einfach das Standard-libvirt-NAT verlassen und alles einrichten, was Sie wollen. Wie dyasny sagte, behandeln Sie VM wie eine physische Maschine. Ich habe KVM-Host und die Schnittstelle mit externer IP ist einer VM zugeordnet, die als Gateway konfiguriert ist. Wenn das passt, kann ich die Konfiguration posten (Ubuntu-Stil).
Art Shayderov