Wer einen dedizierten Server bei Anbietern wie Hetzner mietet, bekommt je nach Tarif häufig nur eine einzige öffentliche IPv4-Adresse. Das reicht für den Anfang völlig aus – bis man anfängt, mehrere virtuelle Maschinen zu betreiben.
Genau an diesem Punkt stand ich irgendwann selbst.
Mein Homelab wuchs immer weiter: Webserver, Docker-Container, KI-Dienste, Monitoring und zahlreiche weitere Anwendungen liefen inzwischen auf verschiedenen VMs und LXC-Containern. Alle sollten erreichbar sein, aber eine zusätzliche öffentliche IPv4 wollte ich dafür nicht kaufen.
Also musste eine andere Lösung her.
Das Problem
Mein Server besitzt lediglich eine öffentliche IPv4-Adresse.
Gleichzeitig wollte ich:
- mehrere virtuelle Maschinen betreiben
- Dienste sauber voneinander trennen
- möglichst wenig direkt im Internet exponieren
- trotzdem einzelne Ports gezielt veröffentlichen
Ein klassisches Bridging aller VMs ins öffentliche Netz kam für mich deshalb nicht infrage.
Die Idee
Statt jeder VM eine öffentliche IP zu geben, habe ich ein komplett internes Netzwerk aufgebaut.
Der Proxmox-Host fungiert dabei gleichzeitig als Router.
Das Ergebnis sieht vereinfacht so aus:
Internet
│
▼
Öffentliche IPv4
│
Proxmox Host
│
┌──────────────┐
│ internes LAN │
│ 10.0.0.0/24 │
└──────────────┘
│ │ │
▼ ▼ ▼
Plesk Docker Jellyfin
Alle virtuellen Maschinen besitzen ausschließlich private IP-Adressen.
Nur der Host selbst besitzt die öffentliche IPv4-Adresse.
DNAT übernimmt die Weiterleitung
Damit Dienste trotzdem von außen erreichbar sind, leite ich die benötigten Ports gezielt weiter.
Beispielsweise:
- Port 80 → Webserver
- Port 443 → Reverse Proxy
- weitere Ports nur dann, wenn sie wirklich benötigt werden
Der gesamte Datenverkehr läuft zunächst auf dem Host auf und wird anschließend an die passende VM weitergeleitet.
Dadurch bleibt die eigentliche Infrastruktur vollständig intern.
Warum ich dafür ein eigenes Skript geschrieben habe
Anfangs bestand meine Firewall-Konfiguration aus einzelnen iptables-Befehlen.
Mit jeder neuen VM kamen weitere Regeln hinzu.
Irgendwann wurde das Ganze unübersichtlich.
Deshalb habe ich ein eigenes Bash-Skript geschrieben.
Dieses erstellt automatisch:
- eigene iptables-Chains
- DNAT-Regeln
- FORWARD-Regeln
- SNAT/MASQUERADE
- Portweiterleitungen
Neue Regeln können dadurch wesentlich einfacher ergänzt werden.
Statt dutzende Befehle einzeln auszuführen, genügt es, das Skript anzupassen und erneut auszuführen.
Das spart Zeit und verhindert viele typische Konfigurationsfehler.
Vorteile meines Setups
Nachdem das Netzwerk einmal eingerichtet war, ergaben sich einige Vorteile:
Mehr Sicherheit
Da sämtliche VMs ausschließlich interne IP-Adressen besitzen, ist keine davon direkt aus dem Internet erreichbar.
Nur explizit freigegebene Dienste können von außen angesprochen werden.
Klare Trennung
Webserver, Docker-Container und andere Anwendungen laufen unabhängig voneinander.
Dadurch lassen sich einzelne Systeme einfacher warten oder neu aufsetzen.
Nur eine öffentliche IPv4 notwendig
Der vermutlich größte Vorteil:
Ich benötige trotz zahlreicher virtueller Maschinen nur eine einzige öffentliche IPv4-Adresse.
Das spart zusätzliche Kosten und vereinfacht die Netzwerkstruktur erheblich.
Skalierbar
Neue VMs erhalten einfach eine freie interne IP-Adresse.
Soll später ein weiterer Dienst veröffentlicht werden, wird lediglich eine neue Portweiterleitung ergänzt.
Die eigentliche Netzwerkinfrastruktur bleibt unverändert.
Würde ich es heute wieder so machen?
Definitiv.
Mein Homelab ist inzwischen deutlich größer geworden als ursprünglich geplant.
Trotzdem funktioniert das Netzwerkprinzip heute noch genauso zuverlässig wie am ersten Tag.
Das interne NAT-Netz sorgt für eine klare Trennung zwischen Internet und meinen virtuellen Maschinen und ermöglicht es mir, neue Dienste schnell bereitzustellen, ohne jedes Mal über zusätzliche öffentliche IP-Adressen nachdenken zu müssen.
Ausblick
In einem zukünftigen Beitrag werde ich mein DNAT-Skript genauer vorstellen und erklären, wie sich damit neue Portweiterleitungen in wenigen Minuten hinzufügen lassen.
Vielleicht stelle ich das Skript anschließend auch als kleines Open-Source-Projekt auf GitHub zur Verfügung.
Wie löst ihr dieses Problem?
Setzt ihr ebenfalls auf ein internes NAT-Netz oder verwendet ihr zusätzliche öffentliche IPv4-Adressen beziehungsweise geroutete Subnetze? Ich freue mich auf eure Erfahrungen und Ideen in den Kommentaren.


Schreibe einen Kommentar