{"id":1864,"date":"2024-05-12T13:41:01","date_gmt":"2024-05-12T11:41:01","guid":{"rendered":"https:\/\/www.daniel-ritter.de\/blog\/?p=1864"},"modified":"2024-05-16T22:04:54","modified_gmt":"2024-05-16T20:04:54","slug":"proxmox-gebridgetes-setup-mit-iptables-firewall-und-portpapping-fuer-privates-container-subnet","status":"publish","type":"post","link":"https:\/\/www.daniel-ritter.de\/blog\/proxmox-gebridgetes-setup-mit-iptables-firewall-und-portpapping-fuer-privates-container-subnet\/","title":{"rendered":"Proxmox: Gebridgetes Setup mit iptables Firewall und Portpapping f\u00fcr privates Container Subnet"},"content":{"rendered":"<p>Proxmox ist phantastisch. Die Netzwerkkonfiguration ist sehr flexibel.<br \/>\nAlles was der Kernel erm\u00f6glicht ist auch umsetzbar.<\/p>\n<p>Hier eine funktionierende Konfiguration f\u00fcr folgendes Setup,<br \/>\ndas wohl viele Leute benutzen:<br \/>\n<strong><br \/>\nProxmox Host<\/strong><br \/>\nPhysisches Interface: enp5s0<br \/>\n\u00d6ffentliche IPv4: 1.2.3.4\/26<br \/>\nGateway vom Hoster: 1.2.3.5<\/p>\n<p><strong>Privates Subnet f\u00fcr Proxmox Container:<\/strong><br \/>\nVirtuelle Bridge: vmbr0<br \/>\nIP-Adresse der Bridge: 10.10.10.100\/24<\/p>\n<p><strong>Netzwerkconfig von Containern:<\/strong><br \/>\nNetzwerinterface: vmbr0<br \/>\nIP Adresse: 10.10.10.x<br \/>\nSubnet: 255.255.255.0<br \/>\nGateway: 10.10.10.100<\/p>\n<p><strong>In dieser Konfiguration enthalten ist: <\/strong><br \/>\n&#8211; eine Firewall f\u00fcr den Host, die jeden direkten Input auf den Host bis auf die freigegebenen Ports blockt<br \/>\n&#8211; das Portmapping f\u00fcr die Container im 10.10.10.0\/24 Subnet<br \/>\n&#8211; Das Masquerading f\u00fcr das Container-Subnet, damit die Container Internet haben<\/p>\n<p>Die gesamte Config wird in einer Datei vorgenommen: \/etc\/network\/interfaces<\/p>\n<p>Getestet wurde das Ganze auf Proxmox 8.2.2<\/p>\n<p>Habe eine Weile daf\u00fcr gebraucht, bis es sauber lief, deshalb hier die Config f\u00fcr Euch.<br \/>\nUnd wie immer: Keine Garantien. Ihr solltet wissen was ihr tut. Ein einfaches Copy\/Paste<br \/>\nwird f\u00fcr Euer individuelles Setup eher nicht funktionieren.<\/p>\n<p>\u00dcberpr\u00fcfen sollte man auch ob man andere Firewall-Tools wie zum Beispiel ufw installiert hat.<br \/>\nDiese sollten deaktiviert werden, da sie auch iptables benutzen und mit dieser manuellen<br \/>\nKonfiguration ziemlich sicher in Konflikt geraten w\u00fcrden.<\/p>\n<p>Es ist auch immer etwas gef\u00e4hrlich an Netzwerkconfig und Firewall von Remoteservern herumzuspielen,<br \/>\nda man sich leicht selbst aussperren kann, wenn man aus Versehen den Zugriff auf SSH blockt.<\/p>\n<p>Um nicht umst\u00e4ndlich \u00fcber Rescuesysteme wieder Zugriff auf den Server erhalten zu m\u00fcssen kann man vorsorgen. F\u00fcr Testzwecke kann man den Server dazu bringen selbstst\u00e4ndig die alte Konfiguration wiederherzustellen, wenn man sich aus Versehen ausgesperrt hat.<\/p>\n<pre>\r\n# Ben\u00f6tigte Tools installieren\r\napt install ifupdown2 screen\r\n\r\n# Funktionierende Netzwerkconfiguration backuppen\r\ncp \/etc\/network\/interfaces \/tmp\/interfaces.backup\r\n\r\n# Screen Session \u00f6ffnen. Diese l\u00e4uft weiter, auch wenn die SSH-Sitzung durch einen \r\n# Konfigurationsfehler in der ge\u00e4nderten Netzwerkconfig beendet wird.\r\nscreen -R -d networkrollback\r\n\r\n# In der neu ge\u00f6ffneten screen-Session diesen Befehl eingeben.\r\n# Er kopiert nach einer Minute die Original-Config wieder zur\u00fcck und startet das Netzwerk neu.\r\n# Lief alles gut und man hat sich nicht ausgesperrt, kann man die Ausf\u00fchrung innerhalb einer Minute\r\n# durch CTRL-C beenden und das R\u00fcckspielen der Sicherung abbrechen\r\nsleep 1m; cp \/tmp\/interfaces.backup \/etc\/network\/interfaces; ifreload -a\r\n<\/pre>\n<p>Sehr geholfen hat auch die offizielle Dokumentation hier:<br \/>\n<a href=\"https:\/\/pve.proxmox.com\/wiki\/Network_Configuration\">https:\/\/pve.proxmox.com\/wiki\/Network_Configuration<\/a><\/p>\n<p>Hier jetzt also eine funktionierende Config f\u00fcr meinen Anwendungsfall.<br \/>\nAlso Vorsicht, Gute Nerven und Viel Spa\u00df! :)<\/p>\n<pre># cat \/etc\/network\/interfaces\r\n\r\nsource \/etc\/network\/interfaces.d\/*\r\n\r\nauto lo\r\niface lo inet loopback\r\n\r\n# Das physikalische Interface des Servers\r\nauto enp5s0\r\niface enp5s0 inet static\r\n        address  1.2.3.4\/26\r\n        gateway  1.2.3.5\r\n\r\n        # Aktuell aktive iptables rules l\u00f6schen\r\n        post-up         iptables -F\r\n        post-up         iptables -t raw -F\r\n        post-up         iptables -t nat -F\r\n        \r\n\r\n        # Iptables defaults setzen. FORWARD und OUTPUT erlauben, INPUT verbieten\r\n        post-up iptables -P FORWARD ACCEPT\r\n        post-up iptables -P INPUT DROP\r\n        post-up iptables -P OUTPUT ACCEPT\r\n\r\n        # Netwerkverkehr von localhost erlauben\r\n        post-up iptables -A INPUT -i lo -j ACCEPT\r\n        post up iptables -A OUTPUT -o lo -j ACCEPT\r\n\r\n        # Erlauben den Host zu pingen\r\n        post-up iptables -A INPUT -i enp5s0 -p icmp -j ACCEPT\r\n\r\n\r\n        # Erm\u00f6glichen, dass bereits hergestellte Verbindungen auch antworten k\u00f6nnen\r\n        post-up iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT\r\n        post-up iptables -A OUTPUT -m conntrack --ctstate ESTABLISHED -j ACCEPT\r\n\r\n\r\n        # Portfreigabe f\u00fcr Ports am Host. Da INPUT oben verboten wurde, muss jeder Port am Host der\r\n        # benutzt wird hier ge\u00f6ffnet werden\r\n        post-up         iptables -A INPUT -i enp5s0 -p tcp -m tcp --dport 22 -j ACCEPT          #Beispielfreigabe tcp\r\n        post-up         iptables -A INPUT -i enp5s0 -p udp -m udp --dport 12182 -j ACCEPT        #Beispielfreigabe udp\r\n\r\n\r\n\r\n        # Portmappings f\u00fcr die Container im Virtuellen 10.10.10.0 Subnet.\r\n        # Hier wird erm\u00f6glicht, dass Dienste im Subnet \u00fcber das Internet erreichbar werden\r\n \r\n        # Beispielportmapping tcp\r\n        # Alles was auf der Public-IP des Hosts auf Port 12345 tcp ankommt, wird weitergeleitet an Port 12345 auf Container 10.10.10.3\r\n          post-up       iptables -A PREROUTING -t nat -i enp5s0 -p tcp --dport 12345 -j DNAT --to-destination 10.10.10.3:12345\r\n\r\n        # Beispielportmapping udp\r\n        # Alles was auf der Public-IP des Hosts auf Port 12345 udp ankommt, wird weitergeleitet an Port 12345 auf Container 10.10.10.3\r\n          post-up       iptables -A PREROUTING -t nat -i enp5s0 -p udp --dport 12345 -j DNAT --to-destination 10.10.10.3:12345\r\n\r\n\r\n\r\n# Konfiguration der virtuellen Br\u00fccke f\u00fcr das 10.10.10.0 Container-Subnet\r\n# Die Br\u00fccke ben\u00f6tigt eine IP in ihrem Subnet, hier 10.10.10.100\r\n# Container benutzen in ihrer Config diese IP als Gateway\r\n\r\nauto vmbr0\r\niface vmbr0 inet static\r\n        address  10.10.10.100\/24\r\n        bridge-ports none\r\n        bridge-stp off\r\n        bridge-fd 0\r\n\r\n\r\n        # IP-Forwarding f\u00fcr die Hosts im Container-Subnet\r\n        # Ohne IP-Forwarding und Maskierung haben die Container keinen\r\n        # Internetzugriff\r\n\r\n        post-up   echo 1 &gt; \/proc\/sys\/net\/ipv4\/ip_forward\r\n        post-up   iptables -t nat -A POSTROUTING -s '10.10.10.0\/24' -o enp5s0 -j MASQUERADE\r\n        post-down iptables -t nat -D POSTROUTING -s '10.10.10.0\/24' -o enp5s0 -j MASQUERADE\r\n        post-up   iptables -t raw -I PREROUTING -i fwbr+ -j CT --zone 1\r\n        post-down iptables -t raw -D PREROUTING -i fwbr+ -j CT --zone 1\r\n\r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Proxmox ist phantastisch. Die Netzwerkkonfiguration ist sehr flexibel. Alles was der Kernel erm\u00f6glicht ist auch umsetzbar. Hier eine funktionierende Konfiguration f\u00fcr folgendes Setup, das wohl viele Leute benutzen: Proxmox Host Physisches Interface: enp5s0 \u00d6ffentliche IPv4: 1.2.3.4\/26 Gateway vom Hoster: 1.2.3.5 Privates Subnet f\u00fcr Proxmox Container: Virtuelle Bridge: vmbr0 IP-Adresse der Bridge: 10.10.10.100\/24 Netzwerkconfig von Containern: [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":1880,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[227,224],"tags":[81,222,123,47,210,82,220,221],"class_list":["post-1864","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-linux","category-network","tag-bridge","tag-container","tag-firewall","tag-iptables","tag-lxc","tag-netzwerk","tag-proxmox","tag-virtualisierung"],"_links":{"self":[{"href":"https:\/\/www.daniel-ritter.de\/blog\/wp-json\/wp\/v2\/posts\/1864","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.daniel-ritter.de\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.daniel-ritter.de\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.daniel-ritter.de\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.daniel-ritter.de\/blog\/wp-json\/wp\/v2\/comments?post=1864"}],"version-history":[{"count":25,"href":"https:\/\/www.daniel-ritter.de\/blog\/wp-json\/wp\/v2\/posts\/1864\/revisions"}],"predecessor-version":[{"id":1975,"href":"https:\/\/www.daniel-ritter.de\/blog\/wp-json\/wp\/v2\/posts\/1864\/revisions\/1975"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.daniel-ritter.de\/blog\/wp-json\/wp\/v2\/media\/1880"}],"wp:attachment":[{"href":"https:\/\/www.daniel-ritter.de\/blog\/wp-json\/wp\/v2\/media?parent=1864"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.daniel-ritter.de\/blog\/wp-json\/wp\/v2\/categories?post=1864"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.daniel-ritter.de\/blog\/wp-json\/wp\/v2\/tags?post=1864"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}