- Go 100%
|
All checks were successful
CI / build (push) Successful in 51s
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> |
||
|---|---|---|
| .forgejo/workflows | ||
| .gitignore | ||
| blocklist.txt | ||
| COMMANDS.md | ||
| dnsblogger | ||
| domains.txt | ||
| go.mod | ||
| go.sum | ||
| main.go | ||
| README.md | ||
| web.go | ||
dnsBlogger
Befehle & Cheatsheet: COMMANDS.md
Ein DNS-Server der alle Anfragen loggt und optional Domains sperren kann.
Browser/App → [dnsBlogger] → 8.8.8.8 (Upstream)
│
├─ Logging (alle Anfragen)
├─ blocklist.txt (NXDOMAIN zurückgeben)
└─ domains.txt (alle gesehenen Domains speichern)
Kompilieren
go build -o dnsBlogger .
Verwendung
# Normaler Start (Port 53, braucht sudo)
sudo ./dnsBlogger
Das war's. Der Server lädt automatisch:
blocklist.txt— falls die Datei existiertdomains.txt— alle gesehenen Domains werden dort gesammelt
Zum Testen ohne sudo (Port 5353):
./dnsBlogger -listen 127.0.0.1:5353
Flags
| Flag | Standard | Beschreibung |
|---|---|---|
-listen |
127.0.0.1:53 |
Bind-Adresse |
-upstream |
8.8.8.8:53 |
Upstream DNS (Cloudflare: 1.1.1.1:53) |
-blocklist |
blocklist.txt |
Andere Blocklist-Datei verwenden |
-no-blocklist |
— | Blocklist komplett deaktivieren |
-domains |
domains.txt |
Andere Datei für Domain-Tracking |
-no-domains |
— | Domain-Tracking deaktivieren |
-web |
127.0.0.1:8080 |
Web UI Adresse (ip:port) |
-no-web |
— | Web UI deaktivieren |
-log |
stdout | Log in Datei schreiben (deaktiviert Farben) |
Beispiele:
# Andere Blocklist verwenden
sudo ./dnsBlogger -blocklist meine-liste.txt
# Ohne Blocking, nur logging
sudo ./dnsBlogger -no-blocklist
# Cloudflare statt Google als Upstream
sudo ./dnsBlogger -upstream 1.1.1.1:53
# Alles in Dateien, kein Terminal-Output
sudo ./dnsBlogger -log /var/log/dns.log
Console-Ausgabe
2026/06/02 17:52:36.118874 INFO DNS server listening on 127.0.0.1:53 ...
2026/06/02 17:52:36.118900 INFO Loaded 55 entries from blocklist.txt
2026/06/02 17:52:36.118910 INFO Recording unique domains to domains.txt
2026/06/02 17:52:37.001234 QUERY src=127.0.0.1:54321 type=A name=github.com.
2026/06/02 17:52:37.045678 ALLOW src=127.0.0.1:54321 latency=44ms
2026/06/02 17:52:38.001234 BLOCK src=127.0.0.1:54322 type=A name=doubleclick.net.
- QUERY (cyan) — Anfrage eingegangen, wird weitergeleitet
- ALLOW (grün) — Antwort erhalten und zurückgegeben
- BLOCK (rot) — Domain geblockt, NXDOMAIN zurückgegeben
- ERROR (rot) — Upstream nicht erreichbar
Blocklist neu laden (ohne Neustart)
Nach Änderungen an blocklist.txt muss der Server normalerweise neu gestartet werden. Mit SIGHUP geht es ohne Unterbrechung:
# PID des laufenden Servers herausfinden
sudo lsof -i :53 -sTCP:LISTEN | grep dnsBlogger
# Blocklist neu laden (kein Neustart, keine Unterbrechung)
sudo kill -HUP <pid>
Der Server antwortet sofort:
INFO Reloading blocklist...
INFO Loaded 57 entries from blocklist.txt
Statistiken
Beim Beenden (Ctrl+C) gibt der Server eine Zusammenfassung aus:
INFO ─── Stats ───────────────────────────────────────
INFO Queries: 8432 Blocked: 1205 (14%) Allowed: 7227 Errors: 0
INFO Top blocked domains:
INFO 1. doubleclick.net 42x
INFO 2. googleadservices.com 28x
INFO 3. bat.bing.com 15x
Web UI
Standardmäßig läuft eine Web-Oberfläche auf http://127.0.0.1:8080.
http://127.0.0.1:8080
Features
- Live Log (links) — alle DNS-Anfragen in Echtzeit, farbkodiert (rot=BLOCK, grün=ALLOW, blau=QUERY). Scrollen pausiert beim Hovern.
- Domain-Liste (rechts) — alle bisher gesehenen Domains, durchsuchbar. Geblockte Domains stehen oben in Rot.
- Block / Unblock — ein Klick reicht. Änderungen werden sofort in
blocklist.txtgespeichert. - Stats-Bar oben — Queries / Blocked / Allowed / Errors / Domains seen (aktualisiert sich alle 5 Sekunden).
- Live-Indikator (grüner Punkt) — zeigt ob die SSE-Verbindung aktiv ist.
Im Netzwerk erreichbar (z.B. Raspberry Pi)
Einfach den Server so starten:
sudo ./dnsBlogger -listen 0.0.0.0:53 -web 0.0.0.0:8080
Dann erreichst du die UI von jedem Gerät im Netzwerk über:
http://<raspberry-pi-ip>:8080
Die IP des Pi herausfinden:
hostname -I
Empfehlenswert: dem Pi im Router eine feste IP vergeben (DHCP-Reservierung), damit sich die Adresse nach einem Neustart nicht ändert.
Hinweis: Wenn Domains über die UI geblockt oder entblockt werden, schreibt der Server
blocklist.txtals flache sortierte Liste neu. Kommentare aus der Original-Datei gehen dabei verloren.
Netzwerk-Modus (alle Geräte im Netzwerk)
Statt nur 127.0.0.1 auf allen Interfaces lauschen — dann kann der Router diesen Rechner als DNS für alle Geräte eintragen:
sudo ./dnsBlogger -listen 0.0.0.0:53
Im Router (z.B. Fritz!Box) unter DHCP-Einstellungen die IP dieses Rechners als DNS-Server eintragen. Alle Geräte im Netzwerk laufen dann automatisch durch dnsBlogger.
blocklist.txt
Eine Domain pro Zeile, # für Kommentare (auch inline):
# Werbung
doubleclick.net
googleadservices.com # Google Ads
# Social Media
instagram.com
Subdomain-Matching: ads.example.com blockt auch sub.ads.example.com.
Test-Modus: Zeile * einfügen um alles zu blocken — danach entfernen und neu starten.
Nach jeder Änderung: Server neu starten damit die neue Blocklist geladen wird.
domains.txt
Jede Domain die zum ersten Mal aufgerufen wird, landet in domains.txt. Duplikate werden übersprungen — auch über Neustarts hinweg.
Nützlich um zu sehen welche Domains dein Netzwerk kontaktiert, und daraus eigene Blocklist-Einträge zu bauen.
DNS einstellen
macOS
Schritt 1 — Server starten
sudo ./dnsBlogger
Schritt 2 — macOS auf 127.0.0.1 als DNS umstellen
- Systemeinstellungen öffnen
- WLAN → dein Netzwerk → Details...
- Tab DNS auswählen
- Bestehende Einträge mit
−entfernen - Mit
+den Eintrag127.0.0.1hinzufügen - OK → Anwenden
Schritt 3 — Prüfen
scutil --dns | head -5
# nameserver[0] : 127.0.0.1 ← muss so stehen
DNS zurücksetzen (macOS)
- Systemeinstellungen → WLAN → Details → DNS
127.0.0.1entfernen, leer lassen (Router-DNS) oder1.1.1.1eintragen- OK → Anwenden
Windows
Schritt 1 — Eingabeaufforderung als Administrator, dann:
dnsBlogger.exe
Schritt 2 — DNS umstellen
- Einstellungen → Netzwerk & Internet → WLAN/Ethernet → Adapteroptionen
- Rechtsklick auf Adapter → Eigenschaften
- Internetprotokoll Version 4 (TCP/IPv4) → Eigenschaften
- „Folgende DNS-Serveradressen verwenden" →
127.0.0.1 - OK
DNS zurücksetzen: Selber Weg → „DNS-Serveradresse automatisch beziehen"
Linux (systemd-resolved)
# /etc/systemd/resolved.conf bearbeiten:
[Resolve]
DNS=127.0.0.1
DNSStubListener=no # wichtig: sonst belegt systemd Port 53
sudo systemctl restart systemd-resolved
Router (alle Geräte im Netzwerk)
Den Server auf einem Gerät mit fester IP starten (z.B. Mac mini, Raspberry Pi):
# Beispiel: Gerät hat IP 192.168.0.10
sudo ./dnsBlogger -listen 192.168.0.10:53
Dann im Router unter DHCP-Einstellungen diesen Rechner als DNS-Server eintragen. Alle Geräte im Netzwerk nutzen danach automatisch dnsBlogger.
DNS-Cache leeren
Nach einer DNS-Änderung immer den Cache leeren:
| System | Befehl |
|---|---|
| macOS | sudo dscacheutil -flushcache && sudo killall -HUP mDNSResponder |
| Windows | ipconfig /flushdns (als Administrator) |
| Linux (systemd) | sudo systemd-resolve --flush-caches |
| Chrome | chrome://net-internals/#dns → „Clear host cache" |
| Firefox | about:networking#dns → „Clear DNS Cache" |
Einschränkung: DNS over HTTPS (DoH)
Viele Apps und Browser nutzen DoH — DNS direkt über HTTPS, am lokalen Server vorbei. dnsBlogger kann diese nicht abfangen.
| Browser | Einstellung |
|---|---|
| Firefox | about:config → network.trr.mode → 5 |
| Chrome | Einstellungen → Datenschutz → Sicherheit → Sicheres DNS → deaktivieren |
| Edge | Einstellungen → Datenschutz → DNS über HTTPS → deaktivieren |