Proxmox: Erreichbarkeit auf IP von DynDNS Namen begrenzen

Proxmox VE bietet durch die integrierte Firewall bereits die Möglichkeit, die Erreichbarkeit des Hostsystems sehr einfach zu begrenzen. Wer den Zugriff auf die IP-Adresse des Internetzugangs zuhause beschränken möchte, hat es jedoch möglicherweise nicht ganz so einfach, wenn er keine statische IP-Adresse besitzt.

In dem Fall könnte nun ein VPN-Server betrieben werden, zu welchem man sich vorher verbindet und dann auch einen Zugriff auf das Hostsystem hat. Eventuell hat man durch den Einsatz einer Firewall-VM wie OPNsense, pfSense, usw. schon die idealen Voraussetzungen dafür.

Während die VPN-Variante von mir bevorzugt eingesetzt wird, möchte man teilweise vielleicht keinen VPN-Server dafür betreiben. In diesem Fall könnte man das ganze auch wie folgt lösen:

Voraussetzungen

  • DSL-Modem/Router oder NAS/Homeserver, der bei Änderung der IP-Adresse einen dynamischen DNS-Eintrag aktualisiert
  • Script auf dem Proxmox Host, welches in bestimmten Intervall den DNS-Record auflöst und bei Bedarf die IP-Adresse in der Proxmox Firewall aktualisiert

DynDNS einrichten

Auf den DynDNS Teil möchte ich hier eigentlich gar nicht so genau eingehen, wer allerdings idealerweise eine FritzBox zuhause hat, kann hier bereits sehr einfach DynDNS einrichten. Die Aufgabe zur Aktualisierung direkt am DSL-Modem/Router einzurichten, ist auf jedenfall die beste Anlaufstelle, da diesem Gerät natürlich zuerst bekannt ist, wenn sich die IP-Adresse durch einen Reconnect ändert. Alternativ kann das ganze natürlich auch über ein NAS, Raspberry Pi oder einem eigenen Homeserver realisiert werden. Hier gibt es sehr viele Möglichkeiten und ebenso viele Anleitungen im Netz.

Einrichtung auf Proxmox Host

Proxmox VE hat bereits out-of-the Box die Möglichkeit integriert, ein IPSet mit dem Namen „management“ anzulegen. Alle IP-Adressen, die in diesem IPSet eingetragen werden, haben automatisch den Zugriff auf alle relevanten Management Ports, d.h. SSH Port (sofern nicht abweichend von Port 22 konfiguriert), SPICE (3128) und die Proxmox Web-GUI via Port 8006. Wir ersparen uns über diesen Weg also die Erstellung von einzelnen Regeln für jeden Port – das übernimmt Proxmox in diesem Fall automatisch.

Unter Datacenter → IPSet legen wir also zunächst ein neues IPSet mit dem Namen „management“ an:

Nun brauchen wir auf dem Proxmox Host lediglich noch ein Script, welches regelmäßig den DynDNS Namen auflöst und die aktuelle IP-Adresse in die Proxmox Firewall einfügt.

Dazu erstellen wir das Script, beispielsweise /root/update-dynip.sh mit folgendem Inhalt:

#!/bin/bash
 
ipcheck() {
	DYN_NAME=$1
 
	# get IP from DynDNS name
	DYN_IP=$(getent ahostsv4 $DYN_NAME | awk '{ print $1 }'| head -1)
 
	# check if response is valid ip address
	if [[ $DYN_IP =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
	        echo "DNS Response seems valid ip: $DYN_IP"
 
		# get current IP from PVE Firewall
		FW_IP=$(pvesh get cluster/firewall/ipset/management | grep $DYN_NAME | grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}')
 
	        if [[ -z "$FW_IP" ]]; then
			echo "$DYN_NAME not found in cluster.fw, adding $DYN_IP to managment"
			pvesh create cluster/firewall/ipset/management -cidr $DYN_IP -comment $DYN_NAME
		elif [[ "$DYN_IP" == "$FW_IP" ]]; then
                	echo "$DYN_IP already in Firewall, nothing to do"
        	else
                	echo "$DYN_IP is different than $FW_IP - replacing..."
			pvesh delete cluster/firewall/ipset/management/$FW_IP
			pvesh create cluster/firewall/ipset/management -cidr $DYN_IP -comment $DYN_NAME
			#echo "Proxmox Firewall updated from $FW_IP to $DYN_IP"|mail -s "$(hostname -f): DynDNS IP changed" your@mail.tld
        	fi
	else
        	echo "DNS Response for $DYN_NAME seems invalid!"
	fi
 
}
 
if [ $# -eq 0 ]; then
        echo "Usage: $0 yourdyndns.name.tld"
        exit 1
else
        # call ipcheck for every argument
        for arg in "$@"
        do
                ipcheck $arg
        done
fi

Wer bei einer Änderung der IP-Adresse in der Konfiguration eine Mail erhalten möchte (sofern Mail-Versand per Postfix auf dem PVE-Node eingerichtet ist) kann das oben im Script ebenfalls wieder einkommentieren und auf seine Wünsche anpassen.

Nun machen wir das Script noch ausführbar:

chmod +x /root/update-dynip.sh

…und legen einen Cronjob an, z.B. in der /etc/crontab mit einem regelmäßigen Aufruf alle 5 Minuten:

*/5 *	* * *	root	/root/update-dynip.sh yourdyndns.name.tld > /dev/null

Beim Cron Aufruf muss „yourdyndns.name.tld“ entsprechend auf euren DynDNS Namen angepasst werden. Wer mehrere DynDNS Namen auflösen und freigeben möchte, kann diese per Leerzeichen getrennt hinter den Scriptaufruf schreiben:

*/5 *	* * *	root	/root/update-dynip.sh yourdyndns.name.tld yourseconddyndns.name.tld > /dev/null

Sobald beim Aufruf von unserem Script nun festgestellt wird, dass die IP-Adresse des DynDNS Namens von der IP-Adresse in der Proxmox Firewall abweicht, wird die IP-Adresse in der Firewall entsprechend aktualisiert.

Nach einem manuellen Scriptaufruf oder nach dem ersten Cron-Durchlauf sollte die IP-Adresse im Management IPSet hinterlegt sein. Ist dies der Fall, kann die Firewall unter Datacenter → Firewall → Options aktiviert werden, sofern noch nicht der Fall. Auch auf PVE-Node Ebene sollte diese aktiv sein, dies sollte in einer frischen Installation aber schon default so sein.

Zugriff auch auf VMs/CTs beschränken

Wer den Zugriff auch für seine betriebenen VMs und CTs auf IP-Adressen im IPSet „management“ begrenzen möchte, kann für diese ebenfalls die Firewall aktivieren und eine Regel mit der Quelle/Source +management verwenden.

Schreibe einen Kommentar

Pflichtfelder sind mit * markiert.