Proxmox: Gebridgetes Setup mit iptables Firewall und Portpapping für privates Container Subnet

Linux Network

Proxmox ist phantastisch. Die Netzwerkkonfiguration ist sehr flexibel.
Alles was der Kernel ermöglicht ist auch umsetzbar.

Hier eine funktionierende Konfiguration für folgendes Setup,
das wohl viele Leute benutzen:

Proxmox Host

Physisches Interface: enp5s0
Öffentliche IPv4: 1.2.3.4/26
Gateway vom Hoster: 1.2.3.5

Privates Subnet für Proxmox Container:
Virtuelle Bridge: vmbr0
IP-Adresse der Bridge: 10.10.10.100/24

Netzwerkconfig von Containern:
Netzwerinterface: vmbr0
IP Adresse: 10.10.10.x
Subnet: 255.255.255.0
Gateway: 10.10.10.100

In dieser Konfiguration enthalten ist:
– eine Firewall für den Host, die jeden direkten Input auf den Host bis auf die freigegebenen Ports blockt
– das Portmapping für die Container im 10.10.10.0/24 Subnet
– Das Masquerading für das Container-Subnet, damit die Container Internet haben

Die gesamte Config wird in einer Datei vorgenommen: /etc/network/interfaces

Getestet wurde das Ganze auf Proxmox 8.2.2

Habe eine Weile dafür gebraucht, bis es sauber lief, deshalb hier die Config für Euch.
Und wie immer: Keine Garantien. Ihr solltet wissen was ihr tut. Ein einfaches Copy/Paste
wird für Euer individuelles Setup eher nicht funktionieren.

Überprüfen sollte man auch ob man andere Firewall-Tools wie zum Beispiel ufw installiert hat.
Diese sollten deaktiviert werden, da sie auch iptables benutzen und mit dieser manuellen
Konfiguration ziemlich sicher in Konflikt geraten würden.

Es ist auch immer etwas gefährlich an Netzwerkconfig und Firewall von Remoteservern herumzuspielen,
da man sich leicht selbst aussperren kann, wenn man aus Versehen den Zugriff auf SSH blockt.

Um nicht umständlich über Rescuesysteme wieder Zugriff auf den Server erhalten zu müssen kann man vorsorgen. Für Testzwecke kann man den Server dazu bringen selbstständig die alte Konfiguration wiederherzustellen, wenn man sich aus Versehen ausgesperrt hat.

# Benötigte Tools installieren
apt install ifupdown2 screen

# Funktionierende Netzwerkconfiguration backuppen
cp /etc/network/interfaces /tmp/interfaces.backup

# Screen Session öffnen. Diese läuft weiter, auch wenn die SSH-Sitzung durch einen 
# Konfigurationsfehler in der geänderten Netzwerkconfig beendet wird.
screen -R -d networkrollback

# In der neu geöffneten screen-Session diesen Befehl eingeben.
# Er kopiert nach einer Minute die Original-Config wieder zurück und startet das Netzwerk neu.
# Lief alles gut und man hat sich nicht ausgesperrt, kann man die Ausführung innerhalb einer Minute
# durch CTRL-C beenden und das Rückspielen der Sicherung abbrechen
sleep 1m; cp /tmp/interfaces.backup /etc/network/interfaces; ifreload -a

Sehr geholfen hat auch die offizielle Dokumentation hier:
https://pve.proxmox.com/wiki/Network_Configuration

Hier jetzt also eine funktionierende Config für meinen Anwendungsfall.
Also Vorsicht, Gute Nerven und Viel Spaß! :)

# cat /etc/network/interfaces

source /etc/network/interfaces.d/*

auto lo
iface lo inet loopback

# Das physikalische Interface des Servers
auto enp5s0
iface enp5s0 inet static
        address  1.2.3.4/26
        gateway  1.2.3.5

        # Aktuell aktive iptables rules löschen
        post-up         iptables -F
        post-up         iptables -t raw -F
        post-up         iptables -t nat -F
        

        # Iptables defaults setzen. FORWARD und OUTPUT erlauben, INPUT verbieten
        post-up iptables -P FORWARD ACCEPT
        post-up iptables -P INPUT DROP
        post-up iptables -P OUTPUT ACCEPT

        # Netwerkverkehr von localhost erlauben
        post-up iptables -A INPUT -i lo -j ACCEPT
        post up iptables -A OUTPUT -o lo -j ACCEPT

        # Erlauben den Host zu pingen
        post-up iptables -A INPUT -i enp5s0 -p icmp -j ACCEPT


        # Ermöglichen, dass bereits hergestellte Verbindungen auch antworten können
        post-up iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
        post-up iptables -A OUTPUT -m conntrack --ctstate ESTABLISHED -j ACCEPT


        # Portfreigabe für Ports am Host. Da INPUT oben verboten wurde, muss jeder Port am Host der
        # benutzt wird hier geöffnet werden
        post-up         iptables -A INPUT -i enp5s0 -p tcp -m tcp --dport 22 -j ACCEPT          #Beispielfreigabe tcp
        post-up         iptables -A INPUT -i enp5s0 -p udp -m udp --dport 12182 -j ACCEPT        #Beispielfreigabe udp



        # Portmappings für die Container im Virtuellen 10.10.10.0 Subnet.
        # Hier wird ermöglicht, dass Dienste im Subnet über das Internet erreichbar werden
 
        # Beispielportmapping tcp
        # Alles was auf der Public-IP des Hosts auf Port 12345 tcp ankommt, wird weitergeleitet an Port 12345 auf Container 10.10.10.3
          post-up       iptables -A PREROUTING -t nat -i enp5s0 -p tcp --dport 12345 -j DNAT --to-destination 10.10.10.3:12345

        # Beispielportmapping udp
        # Alles was auf der Public-IP des Hosts auf Port 12345 udp ankommt, wird weitergeleitet an Port 12345 auf Container 10.10.10.3
          post-up       iptables -A PREROUTING -t nat -i enp5s0 -p udp --dport 12345 -j DNAT --to-destination 10.10.10.3:12345



# Konfiguration der virtuellen Brücke für das 10.10.10.0 Container-Subnet
# Die Brücke benötigt eine IP in ihrem Subnet, hier 10.10.10.100
# Container benutzen in ihrer Config diese IP als Gateway

auto vmbr0
iface vmbr0 inet static
        address  10.10.10.100/24
        bridge-ports none
        bridge-stp off
        bridge-fd 0


        # IP-Forwarding für die Hosts im Container-Subnet
        # Ohne IP-Forwarding und Maskierung haben die Container keinen
        # Internetzugriff

        post-up   echo 1 > /proc/sys/net/ipv4/ip_forward
        post-up   iptables -t nat -A POSTROUTING -s '10.10.10.0/24' -o enp5s0 -j MASQUERADE
        post-down iptables -t nat -D POSTROUTING -s '10.10.10.0/24' -o enp5s0 -j MASQUERADE
        post-up   iptables -t raw -I PREROUTING -i fwbr+ -j CT --zone 1
        post-down iptables -t raw -D PREROUTING -i fwbr+ -j CT --zone 1

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Nach oben