Einrichtung eines dedizierten Cloud-Servers mit Proxmox; Konfiguration eines internen und eines Management-Netzwerks mittels OPNsense Firewall, sowie einer sicheren Verbindung in die Netzwerke mittels Wireguard VPN
Ziel ist eine Proxmox Instanz auf einem dedizierten Cloud-Server über eine eigene Domäne erreichbar zu machen und sicher zu betreiben.
Die Topologie sieht in etwa so aus:

Es gibt eine Vielzahl von Hostinganbietern und Domainregistrare, mit einer Reihe von Vor- und Nachteilen. Die Entscheidung für welchen man sich entscheidet ist hochgradig individuell, wesegen ich auf diesen Teil nur relativ oberflächlich eingehe.
Für mein Setup habe ich bei dem deutschen Hosting-Anbieter Hetzner einen dedizierten AX42 Server mit 64GB RAM und acht Kernen, sowie eine .de Domäne gemietet.
Ich habe mich dafür entschieden, Proxmox auf einem bestehenden Debian 13 (Trixie) zu installieren. Die offizielle Anleitung von Proxmox findet sich hier.
Hetzner erlaubt mir, das Betriebssystem für meinen Server aus einer Palette von Linux Varianten zu wählen und ermöglicht mir nach der Installation den Zugang über SSH.
Da unser Server über das Internet erreichbar ist, habe ich als Erstes einen SSH-Schlüssel hinterlegt und die Anmeldung mittels Passwort deaktiviert.
Wichtig: Den SSH-Schlüssel vor der Deaktivierung testen, um ein Aussprerren zu vermeiden
Ich ändere zusätzlich den Port des SSH-Dienstes auf einen unbekannten High-Port. Keine wirkliche Security-Maßnahme (Stichwort Security by Obscurity), hilft aber dennoch automatisierte Zugriffe auf den SSH-Service zu reduzieren.
Mit dem adäquat abgesicherten SSH-Zugang habe ich zuerst ein neues Passwort für den root-Zugang gesetzt (Passwortmanager!) und danach Proxmox relativ einfach installiert (Link siehe oben).
Proxmox ist also auf unserem dedizierten Server installiert - Good Job!
Damit der Server auch zugleich unter unserer neuen Domäne erreichbar ist, muss ein passender A-Record im DNS angelegt werden. Es dauert einige Stunden, bis der Eintrag über das DNS hinweg synchronisiert und verfügbar ist, also genau arbeiten und etwas Geduld mitbringen. In der Hetzner Konsole sieht das beispielsweise so aus:

Wenn alles geklappt hat, solltet ihr euren neuen Proxmox unter https://deine-domäne.de:8006 erreichen können.
Die Zertifikatsmeldung ist zu erwarten. Prüft sicherheitshalber Zertifikat und Domain und akzeptiert dann die Warnung.
Sobald ihr weitergeleitet werdet, könnt ihr Euch mit dem zuvor gesetzten root-Passwort in der Proxmox-UI anmelden.
Um unser System weiter zu härten, habe ich zuerst einen zweiten Faktor für die Authentifizierung eingerichtet.
Die Option hierfür findet sich unter Datacenter > Permissions > Two Factors.

Als nächstes wollen wir passende Zertifikate erstellen, sodass im Browser keine Warnung mehr auftaucht, wenn wir unseren Server aufrufen. Das kann ebenfalls komfortabel über das Webinterface von Proxmox erledigt werden.
Zuerst erstellen wir einen ACME Account über die GUI:

Wichtig ist, dass ihr bei ACME Directory "Let's Encrypt V2" auswählt.
Im nächsten Schritt wollt ihr unter Servername > Certificates den eben erstellten ACME Account hinzufügen und im Anschluss die Zertifikate erstellen lassen.

Wenn das geklappt hat, sollte jetzt auch die Zertifikatswarnung im Browser verschwunden sein.
Der wichtigste Teil ist getan und unser dedizierter Proxmox Server ist einsatzbereit. Spätestens hier bietet es sich an, zur leichteren Referenzierung einen Spitznamen zu vergeben ;)
Mein Server heißt Rocky.
Um nun unseren Server flexibel für verschiedenste Dinge nutzen zu können, müssen wir zuerst etwas die Netzwerkgrundlagen von Proxmox kennenlernen.
Das Fundament stellt die /etc/network/interfaces Datei dar. Viele Konfigurationen können auch über das Webinterface vorgenommen werden, die definitive Wahrheit findet sich aber letztendlich in /etc/network/interfaces.
Proxmox verwendet sogenannte Linux Bridges. Diese kann man sich mehr oder weniger wie einen virtuellen Switch vorstellen, an dem wir unsere VMs anschließen.
Mit der Standard Linux Bridge (vmbr0) verknüpfen wir unser physikalisches Interface, welches auch die statische IPv4-Adresse hat.
Außerdem erstellen wir zwei neue Bridges: eine für ein internes Managementnetz und eine für ein internes Standardnetz. Zweck des Managementnetzes ist der Zugriff auf Schlüsselkomponenten, wie die zentrale Firewall. Im Standardnetzwerk betreiben wir unsere erste Test-VM.
Wir schauen uns Schritt für Schritt die Konfiguration der Bridges in der /etc/network/interfaces an.
Die einzige Bridge, welche eine Verbindung in das Internet aufbauen kann ist vmbr0. Die Werte von address, gateway und bridge-ports unterscheiden sich logischerweise bei Eurem Setup und spiegeln die Einstellungen meiner Proxmox Instanz wieder.
auto vmbr0
iface vmbr0 inet static
address 195.201.61.202/26
gateway 195.201.61.193
bridge-ports enp6s0
bridge-stp off
bridge-fd 0
#route 195.201.61.192/26 via 195.201.61.193
Die beiden zusätzlichen Bridges vmbr1 und vmbr2 unterscheiden sich zunächst nur in der Netzwerkadresse (später werden wir für vmbr2 zusätzlich NAT konfigurieren, sodass die VMs in diesem Netzwerk das Internet erreichen können).
Für mein Managementnetzwerk wähle ich Netzwerk 10.0.0.1/30. Dies entspricht einem sehr kleinen Netz mit lediglich zwei verfügbaren IPv4 Adressen.
auto vmbr1
iface vmbr1 inet static
address 10.0.0.1/30
bridge-ports none
bridge-stp off
bridge-fd 0
Für mein internes Netzwerk definiere ich ein /24 Netzwerk mit dem Netzanteil 192.168.2.
auto vmbr2
iface vmbr2 inet static
address 192.168.2.0/24
bridge-ports none
bridge-stp off
bridge-fd 0
Wenn das Thema Netzwerktechnik noch recht neu für Euch ist, empfehle ich an dieser Stelle das Ganze einmal mit Stift und Papier zu skizzieren und einige Grundlagen zu klären:
Wir haben also erfolgreich zwei neue Netzwerke auf unserem Proxmox Host eingerichtet. Im nächsten Schritt werden wir die Kommunikation zwischen den Netzwerken mittels Firewallregeln definieren.
Für das Konfigurieren der Firewall ist eine wichtige Unterscheidung notwendig.
Wir werden zum einen einige wenige Regeln direkt auf unserem Proxmox Host konfigurieren, der Großteil der Konfiguration findet allerdings auf einer eigens dafür eingesetzten OPNsense VM statt.
Nachdem die neueren Versionen von pfSense keine Offlineinstallation mehr anbieten, sah ich mich gezwungen zu OPNsense zu wechseln. Mein erster Eindruck ist sehr positiv. Das Interface wirkt modern und übersichtlich und die Konfiguration war bisher einfach und unkompliziert.
Wir erstellen also auf unserem Proxmox eine OPNsense VM, welche die Rolle der zentralen Firewall einnimmt.
Achtung: um die Firewall zu konfigurieren, muss sie zeitweise vom Internet aus erreichbar sein! Setzt dafür, über die Konsole im Vorfeld ein starkes Passwort und aktiviert idealerweise auch MFA
Zunächst konfigurieren wir die OPnsense VM mit zwei Netzwerkinterfaces. Die VM ist somit mit vmbr1 und vmbr2 verbunden.

Im Webinterface der OPNsense habe ich dann für die Interfaces die IP Adressen 192.168.2.2 für das interne Netz und 10.0.1.2 für das Management-Netz vergeben.
Neuen VMs sollte die Adresse 192.168.2.2 als Standard-Gateway mitgegeben werden, sodass sich die Firewall korrekt um das Routing kümmern kann.
Fehlt noch die Firewallkonfiguration auf unserem Proxmox Host.
Zu unserer vmbr0 Bridge fügen wir folgende Regeln hinzu:
post-up echo 1 > /proc/sys/net/ipv4/ip_forward
post-up iptables -t nat -A PREROUTING -i vmbr0 -p tcp \
-m multiport ! --dport 22,8006 -j DNAT --to 10.0.0.2
post-up iptables -t nat -A PREROUTING -i vmbr0 -p udp \
-j DNAT --to 10.0.0.2
Dadurch leiten wir jeglichen Netzwerk, außer 22 (SSH) und 8006 (Webinterface) an das WAN Interface der OPNsense weiter. Zudem aktivieren wir IP-Forwarding.
Um den Maschinen im internen Netzwerk Internetzugang zu erlauben setzen wir noch eine entsprechende MASQUERADE Regel wie folgt:
post-up iptables -t nat -A POSTROUTING -s 192.168.2.0/24 \
-o vmbr0 -j MASQUERADE
post-down iptables -t nat -D POSTROUTING -s 192.168.2.0/24 \
-o vmbr0 -j MASQUERADE
In der offiziellen OPNsense Dokumentation gibt es einen ausführlichen Artikel, um ein sogenanntes Road Warrior Setup zu konfigurieren. also eine zentrale WireGuard Instanz auf der OPNsense Firewall zu der sich andere Geräte wie Laptop oder Smartphone verbinden können, um eine sichere Verbindung in das interne Netzwerk herzustellen.
Die offizielle Dokumentation findet sich hier.
Grob zusammengefasst, werden folgende Schritte durchgeführt:
VPN > Wireguard > Instanzen eine neue WireGuard Instanz anlegen (ich habe dabei die Tunneladresse 10.0.1.1/24 gewählt)Firewall > NAT > Outbound entsprechende NAT Regeln hinzufügen, wenn andere Netze vom Wireguard Tunnel erreicht werden sollenvmbr0) erlaubenWenn alles richtig konfiguriert ist, solltet ihr auf Eurem Road Warrior Gerät (in meinem Fall mein Laptop) den Tunnel aufbauen können.
Unter Arch Linux verwende ich dazu folgendes Kommando: sudo wg-quick up wg0
Das wars! Der Grundstein ist gelegt, um ein absolut fabelhaftes Lab in der Cloud einzurichten.
Bis zum nächsten Mal.
Vollständige /etc/network/interfaces Datei auf Rocky (Proxmox Host)
# network interface settings; autogenerated
# Please do NOT modify this file directly, unless you know what
# you're doing.
#
# If you want to manage parts of the network configuration manually,
# please utilize the 'source' or 'source-directory' directives to do
# so.
# PVE will preserve these directives, but will NOT read its network
# configuration from sourced files, so do not attempt to move any of
# the PVE managed interfaces into external files!
source /etc/network/interfaces.d/*
auto lo
iface lo inet loopback
iface lo inet6 loopback
auto enp6s0
iface enp6s0 inet manual
auto vmbr0
iface vmbr0 inet static
address 195.201.61.202/26
gateway 195.201.61.193
bridge-ports enp6s0
bridge-stp off
bridge-fd 0
post-up echo 1 > /proc/sys/net/ipv4/ip_forward
post-up iptables -t nat -A PREROUTING -i vmbr0 -p tcp -m multiport ! --dport 22,8006 -j DNAT --to 10.0.0.2
post-up iptables -t nat -A PREROUTING -i vmbr0 -p udp -j DNAT --to 10.0.0.2
#route 195.201.61.192/26 via 195.201.61.193
iface vmbr0 inet6 static
address 2a01:4f8:13b:44a::2/64
gateway fe80::1
auto vmbr1
iface vmbr1 inet static
address 10.0.0.1/30
bridge-ports none
bridge-stp off
bridge-fd 0
auto vmbr2
iface vmbr2 inet static
address 192.168.2.1/24
bridge-ports none
bridge-stp off
bridge-fd 0
post-up iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -o vmbr0 -j MASQUERADE
post-down iptables -t nat -D POSTROUTING -s 192.168.2.0/24 -o vmbr0 -j MASQUERADE
WireGuard Konfigurationsdatei auf meinem Laptop
[Interface]
Address = 10.0.1.2/32
PrivateKey = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
MTU = 1420
[Peer]
PublicKey = ksCL1IwZC5Je/PJoBVKcip9huQeKaNm4IKgQ59GZ0FE=
Endpoint = 195.201.61.202:57020
AllowedIPs = 192.168.2.1/24
PersistentKeepalive = 25