2026
Ein regelbasierter DNS-Resolver für Linux: Anfragen per Regel blockieren, umschreiben, ablehnen oder weiterleiten, über UDP, TCP, DoT und DoH antworten und alles über eine HTTP-API und eine Terminaloberfläche steuern.
dnsd ist ein Linux-Daemon, der DNS-Anfragen nach Regeln beantwortet und den Rest an Upstream-Resolver weitergibt. dnsctl ist sein Bedienpult: eine Vollbild-Terminaloberfläche plus CLI, beide sprechen mit der HTTP-API von dnsd.
| Bereich | Fähigkeit |
|---|---|
| Lauschen | Klassisches DNS über UDP und TCP, dazu DoT und DoH |
| Upstreams | Einfaches DNS (UDP mit Rückfall auf TCP), DoT (tls://…), DoH (https://…) |
| Ausgehend | bind_ip / bind_iface pro Profil, pro Upstream oder global |
| Richtlinien | block, refuse, drop, sinkhole, rewrite, forward |
| Blocklisten | Große Werbe-/Tracker-/Malware-Domainlisten, im laufenden Betrieb neu ladbar |
| Telemetrie | QPS, Top-Domains, Top-Blockierte, Top-Clients, Abfrageprotokoll, Fehler |
| Zustand | Optionale JSON-Zustandsdatei, atomar geschrieben, übersteht Neustarts |
block antwortet mit NXDOMAIN, refuse mit REFUSED, drop gar nicht,
sinkhole und rewrite erzeugen einen A/AAAA/CNAME-Eintrag, forward
schickt die Anfrage an eine bestimmte Upstream-Liste, und allow lässt sie
normal weiterlaufen.SO_BINDTODEVICE an ein Interface binden – damit rekursiver Verkehr den
gewünschten Tunnel nimmt.Große Blocklisten prüfen einen Namen und jedes übergeordnete Suffix; wer
tracker.example blockiert, blockiert damit auch a.b.tracker.example.
make build
./bin/dnsd --listen 127.0.0.1:51920 --token dev-token \
--dns-listen 127.0.0.1:5353 --state-file /tmp/dnsd-state.json --allow-insecure
export DNSCTL_URL=http://127.0.0.1:51920 DNSCTL_TOKEN=dev-token
./bin/dnsctl block ads.example
./bin/dnsctl rewrite app.corp 10.77.0.10
dig @127.0.0.1 -p 5353 app.corp +short
Die Steuer-API lauscht standardmäßig auf Loopback und verlangt ein
Bearer-Token, das in konstanter Zeit verglichen wird. dnsd startet nicht,
wenn die Steuer-API auf einer Nicht-Loopback-Adresse mit leerem oder
Entwicklungs-Token laufen soll, außer man setzt ausdrücklich
--allow-insecure. Die mitgelieferte systemd-Unit gewährt nur
CAP_NET_BIND_SERVICE.
Go, Bubble Tea für die TUI. Lizenziert unter der GNU AGPL v3.