open-how2 – Entdecke. Verstehe. Nutze.
Veröffentlicht am
How2-Tipps

UFW-Firewall und Domains: Wie du Domainnamen trotzdem nutzen kannst

Autor
UFW-Firewall und Domains: Wie du Domainnamen trotzdem nutzen kannst

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:

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

#!/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

  1. Speichere das Skript:

    sudo nano /usr/local/bin/ufw-dns-allow.sh
    

    Füge den oben stehenden Code ein.

  2. Ausführbar machen:

    sudo chmod +x /usr/local/bin/ufw-dns-allow.sh
    
  3. Testen:

    sudo /usr/local/bin/ufw-dns-allow.sh
    
  4. Automatisch regelmäßig ausführen (per Cron):

    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.com auf Port 443,
  • oder bestimmte Cloud-Dienste (z. B. hook.integromat.com) zulassen.