UFW Firewall Regeln mit (dynamischen) DNS Hostnamen

Neue Firewall-Regeln auf einem entfernten Server zu installieren oder bestehende Regeln zu ändern birgt immer das Risiko sich selbst auszusperren. Der ein oder andere Administrator hat bereits durch etwas Unachtsamkeit vollständig den Zugang zu seinem Server durch solche Unachtsamkeiten verloren. Wenn man sich erst einmal ausgesperrt hat, ist auch eine Korrektur des Fehlers mangels SSH-Zugriffes schwer. In diesem Artikel zeige ich, wie man quasi eine gewollte Hintertür auf seinem Server installiert, die in so einem Fall den Zugriff wiederherstellen kann. Das Skript kann zudem verwendet werden um DDNS / DynDNS Hostnamen mit dynamisch wechselnder IP in die Firewall-Regeln zu integrieren.

Adblocker blockieren die wichtigste Einnahmequelle von diesem Blog.

Voraussetzungen

Die Methode, die ich hier zeige, wurde auf einem Server mit Ubuntu 20.04. als Betriebssystem implementiert. Die verwendete Firewall ist uncomplicated firewall (UFW), ein benutzerfreundliches Frontend für Iptables. Zudem wird eine (Sub-)Domain benötigt, für dessen A-Eintrag man eine generelle „allow“-Regel in der Firewall installieren möchte. Dies kann entweder eine Domain sein, dessen Eintrag man im Fall der Fälle manuell ändert, oder eine Domain dessen DNS-Eintrag sich automatisch ändert. Beispielsweise von einem DynDNS-Service. In meinem Fall habe ich hierfür eine spezielle subdomain, lifeline.baltic-lab.com. Ich bin schon jetzt gespannt, wie viele DNS-Anfragen ich in den Logs meines DNS-Servers nach dem Posten dieses Artikels finden werde… 🙂

Eine fehlerhaft konfigurierte Firewall kann sehr viel Ärger bedeuten. Im schlimmsten Fall sperrt man sich selbst von seinem Server aus.

Eine fehlerhaft konfigurierte Firewall kann sehr viel Ärger bedeuten. Im schlimmsten Fall sperrt man sich selbst von seinem Server aus.

Bash Skript

The installed IP address will be logged to a text file named „example.com.log“ located in /var/log/. If the logfile already exists, the script will compare the IP address retrieved from the DNS record with the already installed rule. If they match, the comment is updated to the current time. That way the functionality can easily be verified by viewing the current firewall rules, for instance by executing the command „ufw status“. In case the IP has changed, the new IP will be installed and the old rule will be removed.

Das Skript fragt zunächst den A-Eintrag der angegebenen Domain ab. Sofern das Skript für die angegebene Domain das erste mal aufgerufen wird, legt es sofort eine „ufw prepend allow“-Regel für die IP-Adresse an. Der „prepend“-Teil stellt sicher, dass die Regel an erster Stelle steht. Das ist wichtig, da UFW die Regeln der Reihenfolge nach abarbeitet und bei der ersten zutreffenden Regel diese ausführt und keine weiteren Regeln zu dem Vorgang mehr bearbeitet. Mit dem „prepend“-Statement wird also sichergestellt, dass die „allow“-Regel auch tatsächlich die erste Regel ist, die von UFW zu der IP gefunden wird. Die IP-Adresse wird dann unter /var/log/example.com.log in einer Textdatei abgelegt. Dabei steht example.com stellvertretend für den tatsächlichen Domainnamen. Bei zukünftigen Aufrufen vergleicht das Skript die aktuelle IP aus dem A-Eintrag mit der IP in der Logdatei. Sofern beide gleich sind, wird lediglich der Kommentar mit dem aktuellen Datum und der Uhrzeit aktualisiert. Hierdurch kann man sich durch einen Blick in die aktuellen Firewall-Regeln jederzeit vergewissern, dass das Skript auch brav im Hintergrund seine Arbeit macht. Sofern sich die IP-Adresse zwischenzeitlich geändert hat, legt das Skript eine neue „ufw allow prepend“-Regel an und löscht die Regel mit der alten IP. Die neue IP wird dann natürlich auch noch in der Log-Datei hinterlegt.

#!/bin/bash

HOSTNAME=lifeline.example.com
LOGFILE=/var/log/$HOSTNAME.log
Time=$(date '+%d/%m/%Y %H:%M:%S');
Current_IP=$(host $HOSTNAME | tail -n1 | cut -f4 -d ' ')

if [ $LOGFILE = "" ] ; then
  ufw prepend allow from $Current_IP comment 'lifeline.example.com'
  echo $Current_IP > $LOGFILE
else
  Old_IP=$(cat $LOGFILE)
  if [ "$Current_IP" = "$Old_IP" ] ; then
    ufw allow from $Current_IP comment "lifeline.example.com (Validated: $Time)"
  else
    ufw delete allow from $Old_IP
    ufw prepend allow from $Current_IP comment 'lifeline.example.com'
    echo $Current_IP > $LOGFILE
    echo Firewall rules for $HOSTNAME have been updated
  fi
fi

Damit das Skript eigenständig im Hintergrund seine Arbeit verrichtet muss dieses lediglich in die Crontab-Datei vom User root eingetragen werden. Sofern alles korrekt installiert wurde, kann man durch einen Blick auf „ufw status“ sehen, wie die Regeln dynamisch aktualisiert werden. Ob man das Skript nun benutzt um in seinem eigenen Systemen quasi eine manuelle Hintertür als Vorsichtsmaßnahme gegen eigene Unachtsamkeiten einbaut oder es als nützliches Tool für Zugriffe von Anschlüssen mit dynamischer IP-Adresse verwendet sei jedem selbst überlassen. Sofern man ohnehin eine DynDNS-Domain dem eigenen Internetanschluss zugeordnet hat, so kann man damit zum Beispiel den SSH-Zugang nur vom eigenen Anschluss aus erlauben. Sofern man unterwegs dann doch mal einen Notfall hat und schnell an den Server kommen muss, kann der DNS-Eintrag dann immer noch händisch verändert werden.

Automatisch installierte Firewall-Regel auf einem Ubuntu Webserver

Automatisch installierte Firewall-Regel auf einem Ubuntu Webserver

Bitte zitieren als:
S. Westerhold: UFW Firewall Regeln mit (dynamischen) DNS Hostnamen (2025), in: Baltic Labor Blog für Hochfrequenz- und Messtechnik, ISSN (Online): 2751-806X, URL: https://baltic-labor.de/2025/01/ufw-firewall-regeln-mit-dynamischen-dns-hostnamen/ (Stand: 14.01.2025).

Sebastian Westerhold

Schreiben Sie einen Kommentar

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