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.
- Autoritativer DNS-Server für eigene Zonen (z. B.
- 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-zonesgibt, darf dort keine weiterezone "."-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: NOERRORflags: 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 unreachablemehr
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.confund verlässt sich nur auf die explizitenserver=-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/URIBLverschwinden 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.1→SERVFAIL/No Reachable Authority- BIND-Log (
/var/log/named/default.log) voll mitquery failed (SERVFAIL)für normale Domains
Mögliche Ursachen:
- Root-Hints nicht eingebunden oder doppelte
zone "."-Definition. - Outbound-DNS zu Root-/TLD-Servern geblockt (Firewall).
- IPv6-Outbound kaputt, BIND versucht Root-Server über AAAA-Adressen zu erreichen.
Lösungen:
- prüfen, dass
named.conf.root-hintsgenau eine Hint-Zone enthält und innamed.confinkludiert ist, - Test mit
dig . NS @198.41.0.4unddig . 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.confzeigt auf127.0.0.1,resolvconf.serviceist deaktiviert und maskiert.dnsmasqnutzt BIND als Upstream (server=127.0.0.1,no-resolv).- SpamAssassin nutzt den lokalen Resolver, RBL-/URIBL-Tuning per
99_local_uridnsbl.cfverhindert sinnlose Abfragen für eigene Domains. - Die ursprünglichen Probleme mit
async: aborting ... AskDNS/URIBLwurden durch sauberes DNS + Skip-Regeln gelöst.
- Log in to post comments