Virtual Machine Manager & QEMU/KVM: Port-Forwarding zw. Host und VM ohne Root-Rechte mit "passt"-Backend

Aus Sicherheitsgründen ist es empfehlenswert VMs ohne Root-Rechte auszuführen. Wie sich das mit Virtual Machine Manager (VMM) und QEMU/ KVM umsetzen lässt, hatte ich bereits in dem Beitrag Virtual Machine Manager & QEMU/KVM: VMs ohne Root-Rechte ausführen beschrieben.

Ohne Root-Rechte verwendet eine VM standardmäßig das funktional eingeschränkte "Benutzermodus"-Netzwerk mit SLIRP als Backend. Grundsätzlich erlaubt auch SLIRP Port-Forwarding, aber das lässt sich anscheindend nicht direkt über VMM konfigurieren. Seit libvirt v9.0.0 kann für das "Benutzermodus"-Netzwerk als Alternative zu SLIRP das moderne und mit "security in mind" entwickelte passt als Backend genutzt werden. Hiermit lassen sich Port-Weiterleitungen direkt in VMM - derzeit allerdings nur durch manuelle XML-Anpassung - einstellen.

Folgende Software wurde verwendet:
  • Arch Linux
  • Virtual Machine Manager v4.1.0
  • QEMU/KVM v8.2.0
  • libvirt v10.0.0
  • passt v2023_12_30.f091893-1

Voraussetzungen

Als erstes müsst ihr passt auf eurem System installieren, falls noch nicht geschehen:

sudo pacman -S passt
Terminal / Konsole

Des Weiteren muss euer Kernel Unprivileged User Namespaces unterstützen und aktiviert haben. Unter den gängigen Systemen, wie z.B. Arch Linux und Debian ist das der Fall. Um zu überprüfen, ob bei euch die Funktioanlität aktiviert ist, verwendet folgenden Befehl:

cat /proc/sys/kernel/unprivileged_userns_clone
1
Terminal / Konsole

Da Unprivileged User Namespaces in der Vergangenheit öfters für Privilege Escalation ausgenutzt wurde, habe ich es bei mir standardmäßig deaktiviert. Ich aktiviere es immer nur temporär, wenn ich es benötige. Dazu nutze ich folgenden Befehl:

sudo sysctl -w kernel.unprivileged_userns_clone=1
Terminal / Konsole

Port-Forwarding/-Weiterleitung in VMM einrichten

In meinem Fall läuft zu Testzwecken in meiner VM bspw. Proxmox und ich möchte von meinem Host-System auf die Web-GUI von Proxmox zugreifen. In der VM ist die Web-GUI über den Port 8006 erreichbar. Im konkreten Fall möchte ich nun den Host-Port 33333 auf den VM-Port 8006 weiterleiten, so dass ich auf die Web-GUI auf meinem Host über https://localhost:33333/ zugreifen kann.

Öffnet in VMM die Konfiguration eurer VM, für die ihr eine Port-Weiterleitung einrichten möchtet. Wählt anschließend die Netzwerkkarte aus und den dazugehörigen XML-Tab. Hier ändert ihr nun das Backend von SLIRP auf passt und definiert die benötigten Port-Weiterleitungen (Details siehe libvirt-Doku: Userspace (SLIRP or passt) connection).

<interface type="user">
    <mac address="52:64:00:dd:22:f5"/>
    <portForward proto="tcp">
        <range start="33333" to="8006"/>
    </portForward>
    <model type="virtio"/>
    <backend type="passt"/>
    <address type="pci" domain="0x0000" bus="0x01" slot="0x00" function="0x0"/>
</interface>
VM-XML - Port-Weiterleitung definieren

In VMM sieht das dann bei mir so aus:

Virtual Machine Manager: Port-Weiterleitung einrichten

Anschließend kann die VM gestartet werden und die Port-Weiterleitung sollte funktionieren.

Fazit

Trotz eingechränktem "Benutzermodus"-Netzwerk lässt sich mit VMM bei Bedarf leicht eine Port-Weiterleitung konfigurieren.

Feedback

Für Feedback zum Beitrag, seien es Fragen, Korrigierungen und/oder Anregungen, könnt ihr mir gerne eine Nachricht per E-Mail oder Mastodon schreiben (siehe Kontakt).