Die Kombination aus BIND9, dnsmasq und SpamAssassin so konfiguriert wird, dass:

  • der Server einen eigenen rekursiven Resolver (BIND) mit Root-Hints nutzt,
  • Rekursion nur für localhost erlaubt ist,
  • das System selbst sowie Dienste (Postfix, SpamAssassin, LXC/dnsmasq) immer über 127.0.0.1 auflösen,
  • SpamAssassin-RBL-/URIBL-Anfragen stabil und schnell laufen,
  • eigene Domains nicht gegen URIBL-Listen geprüft werden.

Komponenten-Überblick

  • BIND9
    • Autoritativer DNS-Server für eigene Zonen (z. B. kalcker.org, dioxitube.com, orangeicebear.at, …)
    • Gleichzeitig rekursiver Resolver nur für localhost über Root-Hints.
  • dnsmasq
    • Stellt DNS für LXC-/LAN-Netze bereit (z. B. 10.0.5.0/24).
    • Nutzt BIND (127.0.0.1) als Upstream.
  • SpamAssassin (spamd)
    • Nutzt den lokalen Resolver 127.0.0.1.
    • RBL-/URIBL-Tuning sorgt dafür, dass eigene Domains und einige große Provider-Domains nicht unnötig gegen RBLs geprüft werden.

BIND9 – Konfiguration

1. Root-Hints einbinden

Datei: /etc/bind/named.conf.root-hints

// prime the server with knowledge of the root servers
zone "." {
    type hint;
    file "/usr/share/dns/root.hints";
};

In der Hauptkonfiguration sicherstellen, dass diese Datei eingebunden wird.

Datei: /etc/bind/named.conf

include "/etc/bind/named.conf.options";
include "/etc/bind/named.conf.local";
include "/etc/bind/named.conf.root-hints";

Hinweis: Falls es zusätzlich eine named.conf.default-zones gibt, darf dort keine weitere zone "."-Definition existieren. Es muss genau eine Hint-Zone geben.


2. Rekursion nur für localhost erlauben

Datei: /etc/bind/named.conf.options

acl "trusted" {
    127.0.0.1;
    ::1;
};

options {
    directory "/var/cache/bind";

    dnssec-validation no;

    querylog yes;
    auth-nxdomain no;
    notify yes;
    version none;

    listen-on { 127.0.0.1; 23.88.113.138; };
    listen-on-v6 { ::1; 2a01:4f8:c17:dd58::1; };

    # Autoritative Antworten für eigene Zonen von überall
    allow-query { any; };

    # Cache & Rekursion nur für localhost
    allow-query-cache { trusted; };
    recursion yes;
    allow-recursion { trusted; };

    max-cache-size 512M;

    # Wichtig: Keine forwarders, kein "forward only;" –
    # BIND nutzt direkt die Root-Hints.
};

Konfiguration prüfen und BIND neu laden:

named-checkconf
systemctl reload bind9

3. Funktionstest BIND (Root-Hints)

3.1 Root-Server direkt testen

dig . NS @198.41.0.4        # A.ROOT-SERVERS.NET
 dig . NS @192.5.5.241       # F.ROOT-SERVERS.NET

Erwartung:

  • status: NOERROR
  • NS-Records im ANSWER-/AUTHORITY-Teil

3.2 BIND als Rekursor testen

lsof -Pni :53 | grep named     # Kontrolle, dass BIND auf 127.0.0.1 und Public-IP lauscht

 dig . NS @127.0.0.1
dig google.com @127.0.0.1
 dig web.de @127.0.0.1

Erwartung:

  • status: NOERROR
  • flags: qr rd ra
  • Antwortzeiten im ms-Bereich

Wenn hier alles ok ist, funktioniert die Rekursion über Root-Hints.


Host-Resolver auf BIND umstellen

Ziel: Der gesamte Host (alle Tools, SpamAssassin, Postfix etc.) nutzt 127.0.0.1 als Resolver.

1. resolv.conf setzen

printf "nameserver 127.0.0.1\noptions edns0 timeout:2 attempts:2\n" > /etc/resolv.conf

2. resolvconf-Dienst deaktivieren und maskieren

systemctl status resolvconf.service
systemctl disable resolvconf.service
systemctl mask resolvconf.service

Damit wird /etc/resolv.conf nicht mehr automatisch überschrieben.

3. Test

dig web.de mx
dig web.de a
host -t mx web.de

Erwartung:

  • SERVER: 127.0.0.1#53
  • gültige MX-/A-Records
  • keine IPv6-Resolver-Fehler à la 2a01:4ff:ff00::add:* host unreachable mehr

dnsmasq an BIND anbinden (optional, empfohlen)

Ziel: LXC-/LAN-Clients (z. B. im Netz 10.0.5.0/24) sollen dnsmasq → BIND nutzen.

1. dnsmasq-Konfiguration erweitern

Datei: /etc/dnsmasq.d/10-bind-upstream.conf

server=127.0.0.1
no-resolv
  • server=127.0.0.1 → dnsmasq fragt BIND.
  • no-resolv → dnsmasq ignoriert /etc/resolv.conf und verlässt sich nur auf die expliziten server=-Einträge.

Dann:

systemctl restart dnsmasq

 dig web.de @10.0.5.1

Erwartung: gleiche Antworten wie bei dig web.de @127.0.0.1.


SpamAssassin – RBL/URIBL-Tuning

Ziel:

  • RBL-/URIBL-Lookups laufen stabil und schnell (DNS ist jetzt sauber),
  • eigene Domains werden nicht gegen URIBL geprüft,
  • Timeouts der Form async: aborting ... AskDNS/URIBL verschwinden weitgehend.

1. Eigene Tuning-Datei anlegen

Datei: /etc/spamassassin/99_local_uridnsbl.cf

# ===== RBL/URIBL tuning for own infra =====
uridnsbl_skip_domain orangeicebear.at
uridnsbl_skip_domain dynproxy.net
uridnsbl_skip_domain bubuit.net
uridnsbl_skip_domain dicta2stream.net

# ===== commonly safe global sender domains =====
uridnsbl_skip_domain gmail.com
uridnsbl_skip_domain outlook.com
uridnsbl_skip_domain microsoft.com
uridnsbl_skip_domain telekom.de
uridnsbl_skip_domain protonmail.com

# ===== RBL lookup timeout tuning =====
rbl_timeout 8

Eigene Domains bei Bedarf ergänzen (weitere Projekte, Subdomains etc.).

2. Konfiguration prüfen

spamassassin --lint

Keine Ausgabe = alles ok.

3. SpamAssassin neu laden

systemctl reload spamd

4. RBL/URIBL-Funktion testen

dig bubuit.net.multi.surbl.org @127.0.0.1
dig dynproxy.net.lookup.dkimwl.org @127.0.0.1
dig orangeicebear.at.multi.surbl.org @127.0.0.1

Typischer Output:

  • status: NXDOMAIN
  • kurze Query-Time

Das bedeutet:

  • RBL-Zonen sind erreichbar,
  • eigene Domains sind nicht gelistet,
  • DNS funktioniert stabil.

5. Logs prüfen

journalctl -u spamd --since "15 minutes ago" | grep -E 'async: aborting|AskDNS|URIBL' || echo "keine async-Fehler gefunden"

Idealerweise kaum oder keine async: aborting-Meldungen mehr.


Troubleshooting

Problem: SERVFAIL / Timeouts bei einfachen Domains

Symptome:

  • dig google.com @127.0.0.1SERVFAIL / No Reachable Authority
  • BIND-Log (/var/log/named/default.log) voll mit query failed (SERVFAIL) für normale Domains

Mögliche Ursachen:

  1. Root-Hints nicht eingebunden oder doppelte zone "."-Definition.
  2. Outbound-DNS zu Root-/TLD-Servern geblockt (Firewall).
  3. IPv6-Outbound kaputt, BIND versucht Root-Server über AAAA-Adressen zu erreichen.

Lösungen:

  • prüfen, dass named.conf.root-hints genau eine Hint-Zone enthält und in named.conf inkludiert ist,
  • Test mit dig . NS @198.41.0.4 und dig . NS @192.5.5.241,
  • ggf. BIND auf IPv4-only betreiben über /etc/default/named:

    OPTIONS="-u bind -4"
    

    und systemctl restart bind9.


Zusammenfassung

  • BIND9 fungiert als Root-basierter, rekursiver Resolver, Rekursion ist nur für localhost erlaubt.
  • /etc/resolv.conf zeigt auf 127.0.0.1, resolvconf.service ist deaktiviert und maskiert.
  • dnsmasq nutzt BIND als Upstream (server=127.0.0.1, no-resolv).
  • SpamAssassin nutzt den lokalen Resolver, RBL-/URIBL-Tuning per 99_local_uridnsbl.cf verhindert sinnlose Abfragen für eigene Domains.
  • Die ursprünglichen Probleme mit async: aborting ... AskDNS/URIBL wurden durch sauberes DNS + Skip-Regeln gelöst.