Tags

Diese Seite dokumentiert die eigentliche dnsbl-ipset-Engine (FireHOL dnsbl-ipset.sh), die in Echtzeit IP-Adressen gegen verschiedene DNS-Blocklisten prüft und in ein ipset schreibt.

== Ziel

  • Verdächtige Verbindungen aus dem Firewall-Log (ulogd) in Echtzeit gegen DNSBLs prüfen
  • Treffer automatisiert in ein ipset schreiben
  • iptables-Regeln verwenden dieses ipset, um IPs temporär zu blocken

== Komponenten

  • Script: /etc/firehol/dnsbl-ipset.sh
  • ipset: dnsbl (Typ: hash:ip, Timeout z.B. 1209600 Sekunden ≈ 14 Tage)
  • Logquelle: /var/log/ulog/syslogemu.log (ulogd iptables Log)
  • Auswertescript (separate Seite): dnsbl.sh – siehe Wiki: https://wiki.bubuit.net/dnsblsh

== Funktionsweise

  1. dnsbl-ipset.sh liest kontinuierlich das ulogd-Log (/var/log/ulog/syslogemu.log) per tail -F.
  2. Aus jeder geloggten Verbindung wird die Quell-IP extrahiert.
  3. Für jede IP werden asynchrone DNS-Anfragen an die konfigurierten DNSBLs gestellt (z.B. zen.spamhaus.org, dnsbl.sorbs.net, etc.).
  4. Aus den Antworten wird ein Score berechnet (z.B. 0 = neutral, >0 = negativ, <0 = Whitelist).
  5. IPs mit ausreichendem Score werden in das ipset dnsbl eingetragen (mit Timeout und Kommentar).
  6. iptables wertet das dnsbl-Set in eigenen Regeln aus und blockt diese IPs.

== Wichtig: Dauerbetrieb im Hintergrund

dnsbl-ipset.sh ist ein dauerhaft laufender Dienst, kein einmaliger Cronjob.

  • Es muss kontinuierlich im Hintergrund laufen, damit:
    • neue Verbindungen sofort geprüft werden
    • das ipset dnsbl ständig aktuell gehalten wird
  • Wenn der Prozess nicht läuft, bleibt ipset list dnsbl leer – auch wenn matches.log noch alte Einträge enthält.

== systemd-Service

Statt das Script wöchentlich via Cron zu starten, sollte es als systemd-Service laufen.

Beispiel-Unit-Datei /etc/systemd/system/dnsbl-ipset.service (vereinfachter Entwurf):

[Unit]
Description=DNSBL realtime firewall updater
After=network-online.target ulogd.service
Wants=network-online.target

[Service]
Type=simple
ExecStart=/etc/firehol/dnsbl-ipset.sh
Restart=always
RestartSec=5
StandardOutput=append:/var/log/dnsbl-ipset.log
StandardError=append:/var/log/dnsbl-ipset.log

[Install]
WantedBy=multi-user.target

Aktivierung:

systemctl daemon-reload
systemctl enable --now dnsbl-ipset.service

== Entfernen des alten Cron-Setups

Früher wurde dnsbl-ipset.sh über einen wöchentlichen Cronjob gestartet:

  • Datei: /etc/cron.weekly/dnsbl-update
  • Problem: der Prozess läuft nicht dauerhaft und startet nach Reboot oder Fehlern nicht automatisch neu.

Stattdessen:

mv /etc/cron.weekly/dnsbl-update /etc/cron.weekly/dnsbl-update.disabled

Damit ist eindeutig: dnsbl-ipset läuft dauerhaft über systemd, nicht zeitgesteuert per Cron.

== ipset-Status verstehen

  • Befehl zur Kontrolle:

    ipset list dnsbl
  • Wichtig:
    • Number of entries: 0 bedeutet nicht zwingend einen Fehler, sondern nur, dass aktuell keine IP aktiv blockiert wird (keine neuen Treffer oder alle Timeouts abgelaufen).
    • Das timeout im Set-Header (z.B. timeout 1209600) entspricht der Lebensdauer einer geblockten IP im Set.
    • matches.log (siehe Auswertungsseite) kann viele Zeilen enthalten, obwohl das ipset leer ist – matches.log ist historisch, ipset ist der aktuelle Live-Zustand.

== Verwandte Seiten

  • Auswertescript (wöchentliche Reports aus matches.log): dnsbl.shhttps://wiki.bubuit.net/dnsblsh
  • Alte Dokumentation/Notizen: ursprüngliche Seite dnsbl-ipset (wurde mit dieser Seite aktualisiert)