Die Uncomplicated Firewall (kurz UFW) ist unter Linux ein beliebtes Tool, um Firewalleinstellungen einfach zu verwalten. Doch eine Frage taucht immer wieder auf:
Kann UFW auch mit Domainnamen wie example.com arbeiten – oder nur mit IP-Adressen?
Die kurze Antwort lautet leider: Nein, UFW unterstützt keine Domainnamen. Aber keine Sorge – in diesem Artikel zeige ich dir, warum das so ist und wie du mit einem cleveren Bash-Skript trotzdem dynamische Domain-Zugriffe verwalten kannst.
Warum keine Domainnamen?
UFW basiert intern auf iptables (bzw. nftables) und arbeitet auf der Netzwerkebene, wo nur IP-Adressen eine Rolle spielen. Domainnamen sind eine Sache der Anwendungsebene und müssen über DNS aufgelöst werden. Doch UFW selbst kann das nicht automatisch oder dynamisch – es würde:
- nur einmal auflösen (z. B. beim Hinzufügen der Regel),
- keine IP-Änderungen später mitbekommen,
- fehlschlagen, wenn die Domain mehrere IPs oder IPv6-Adressen liefert.
Versuchst du also Folgendes:
``bash sudo ufw allow from example.com ``
… dann schlägt das fehl oder tut nichts Sinnvolles.
Die Lösung: Ein Bash-Skript, das Domains regelmäßig in IPs umwandelt
Um UFW trotzdem mit Domains „kompatibel“ zu machen, kannst du dir ein kleines Hilfsskript bauen, das:
- regelmäßig die IPs einer oder mehrerer Domains auflöst,
- alte Regeln entfernt,
- neue IPs als UFW-Regeln einträgt – inkl. Kommentar zur Nachverfolgung.
🔧 Das Skript: ufw-dns-allow.sh
```bash #!/bin/bash
-----------------------------
Konfiguration
-----------------------------
DOMAINS=( "example.com" "sub.domain.net" ) PORT=443 PROTO="tcp" TAG="ufw-dns-auto"
-----------------------------
Funktion: IPs für Domain holen
-----------------------------
resolve_ips() { local domain="$1" dig +short "$domain" | grep -E '^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$' }
-----------------------------
Alte Regeln mit TAG entfernen
-----------------------------
clear_old_rules() { ufw status numbered | grep "$TAG" | awk -F'[][]' '{print $2}' | tac | while read -r rule_num; do echo "Lösche Regel $rule_num ($TAG)" yes | ufw delete "$rule_num" done }
-----------------------------
Neue Regeln hinzufügen
-----------------------------
add_new_rules() { for domain in "${DOMAINS[@]}"; do echo "Bearbeite Domain: $domain" for ip in $(resolve_ips "$domain"); do echo "Erlaube Zugriff von $ip für Port $PORT/$PROTO ($domain)" ufw allow from "$ip" to any port "$PORT" proto "$PROTO" comment "$TAG $domain" done done }
-----------------------------
Hauptlogik
-----------------------------
echo "== UFW-DNS-Auto == ($(date))" clear_old_rules add_new_rules echo "== Fertig ==" ```
Einrichtung
- Speichere das Skript:
``bash sudo nano /usr/local/bin/ufw-dns-allow.sh ``
Füge den oben stehenden Code ein.
- Ausführbar machen:
``bash sudo chmod +x /usr/local/bin/ufw-dns-allow.sh ``
- Testen:
``bash sudo /usr/local/bin/ufw-dns-allow.sh ``
- Automatisch regelmäßig ausführen (per Cron):
``bash sudo crontab -e ``
Dann z. B.:
`` 0 /usr/local/bin/ufw-dns-allow.sh ``
Führt das Skript jede Stunde aus und hält die IP-Liste aktuell.
Vorteile
- Keine veralteten IP-Regeln
- Keine manuelle Auflösung nötig
- Perfekt für APIs, CDNs oder dynamische Ziele
- Volle Kontrolle durch Kommentare (
ufw status)
Fazit
Auch wenn UFW keine Domainnamen direkt versteht – mit einem kleinen Script wird aus der Schwäche eine Stärke. Du kannst so gezielt Zugriffe erlauben, etwa:
- nur von
api.example.comauf Port 443, - oder bestimmte Cloud-Dienste (z. B.
hook.integromat.com) zulassen.