AdGuard Home + Unbound auf Debian 13 — DNS-Filter selbst hosten

AdGuard Home mit Unbound auf Debian 13 einrichten: Eigener DNS-Filter mit Werbe- und Tracker-Blocking, ohne Abhängigkeit von Google oder Cloudflare. Schnell, privat und unter deiner Kontrolle.

Adguard home unbound debian

AdGuard Home mit Unbound auf Debian 13 einrichten: Eigener DNS-Filter mit Werbe- und Tracker-Blocking, ohne Abhängigkeit von Google oder Cloudflare. Schnell, privat und unter deiner Kontrolle.

💡 Hinweis: Dieses Tutorial setzt voraus, dass du einen normalen Benutzer mit sudo-Rechten verwendest — wie im Tutorial Debian 13 Server absichern beschrieben.

Einleitung — Was ist AdGuard Home?

Jedes Gerät in eurem Netzwerk fragt ständig DNS-Server: „Wo ist google.com? Wo ist tracking.facebook.com? Wo ist ads.example.com?“. Standardmäßig laufen diese Anfragen über Google (8.8.8.8) oder Cloudflare (1.1.1.1) — beides Konzerne, die jede einzelne Anfrage protokollieren können.

AdGuard Home ist ein Open-Source DNS-Server, den ihr selbst hostet. Er filtert Werbung, Tracker und Malware-Domains schon auf DNS-Ebene — geräteübergreifend für alle Smartphones, Smart-TVs, IoT-Geräte und PCs in eurem Netzwerk. Unbound als Backend macht das Setup vollständig unabhängig von Drittanbietern: AdGuard Home filtert, Unbound fragt direkt die DNS-Root-Server.

Was AdGuard Home kann

  • Network-wide Blocking — Werbung & Tracker für alle Geräte gleichzeitig
  • DNS-over-HTTPS, DNS-over-TLS, DNS-over-QUIC — Verschlüsselte DNS-Anfragen
  • Web-Dashboard — Statistiken, Logs, Block/Allow-Listen
  • Per-Client-Regeln — Kindersicherung, eigene Filter pro Gerät
  • Custom DNS Records — Lokale Domains für Self-Hosted-Services
  • Parental Control — Erwachseneninhalte automatisch blockieren
  • Safe Search — Google, Bing, YouTube zwingen zu jugendfreien Ergebnissen

AdGuard Home vs. Pi-hole

FeatureAdGuard HomePi-hole
SetupSingle BinaryLAMP-Stack nötig
KonfigurationWeb-UI komplettWeb-UI + CLI
DNS-over-HTTPSEingebautNur via Cloudflared
DNS-over-TLSEingebautNur via stubby
Verschlüsseltes UpstreamJaErweitert nötig
Per-Client-RegelnSehr gutMöglich, aber komplex
UpdateSelf-Updateapt-get
PerformanceSehr gutSehr gut

Beides sind exzellente Tools — AdGuard Home ist moderner und bringt mehr Features standardmäßig mit, Pi-hole ist der etablierte Klassiker mit größerer Community.

In diesem Guide richten wir AdGuard Home + Unbound auf Debian 13 ein — vom DNS-Setup bis zur Router-Integration und Backup-Strategie.


Architektur des Setups

[Eure Geräte]
     ↓ DNS-Anfrage
[AdGuard Home] (Port 53)
     ↓ Werbung & Tracker raus
     ↓ Rest weiterleiten
[Unbound] (Port 5335, lokal)
     ↓ Direkt fragen, kein Upstream
[DNS Root-Server der Welt]
  • AdGuard Home lauscht auf Port 53 (Standard-DNS)
  • Unbound lauscht auf Port 5335 (intern)
  • AdGuard Home leitet alle nicht-blockierten Anfragen an Unbound weiter
  • Unbound fragt rekursiv die echten DNS-Server der Welt — keine Upstream-Provider, keine Logs bei Dritten

Voraussetzungen

  • Debian 13 (Trixie) — siehe Debian 13 Server-Guide
  • Mindestens 512 MB RAM (1 GB empfohlen, AdGuard Home ist sehr leichtgewichtig)
  • Statische IP-Adresse im LAN — euer Router muss diese kennen
  • Port 53 freisystemd-resolved muss umkonfiguriert werden
  • Optional: Port 80/443 für AdGuard-Web-UI mit eigener Domain

Schritt 1: Port 53 freimachen (systemd-resolved)

Debian 13 nutzt systemd-resolved, das selbst auf Port 53 lauscht. Wir müssen es umstellen, sonst kann AdGuard Home nicht starten.

sudo nano /etc/systemd/resolved.conf

Setzt diese Werte:

[Resolve]
DNS=127.0.0.1
DNSStubListener=no

Symlink für /etc/resolv.conf aktualisieren:

sudo ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf
sudo systemctl restart systemd-resolved

Prüfen, dass Port 53 jetzt frei ist:

sudo ss -tulpn | grep ':53 '

Die Ausgabe sollte leer sein.

⚠️ Wichtig: Sobald AdGuard Home läuft, ist euer Server selbst von DNS abhängig. Achtet darauf, dass entweder AdGuard Home oder ein Fallback (z.B. 1.1.1.1 in /etc/resolv.conf) erreichbar ist — sonst funktioniert auch apt update nicht mehr.


Schritt 2: Unbound installieren

sudo apt update
sudo apt install -y unbound

Unbound für AdGuard Home konfigurieren

sudo nano /etc/unbound/unbound.conf.d/adguard.conf

Inhalt:

server:
    # Auf localhost, Port 5335 lauschen
    interface: 127.0.0.1
    port: 5335

    # Nur lokal erreichbar
    do-ip4: yes
    do-udp: yes
    do-tcp: yes

    # IPv6 — bei Bedarf aktivieren
    do-ip6: no

    # Trust-Anchor für DNSSEC
    auto-trust-anchor-file: "/var/lib/unbound/root.key"

    # Performance
    num-threads: 2
    msg-cache-slabs: 4
    rrset-cache-slabs: 4
    infra-cache-slabs: 4
    key-cache-slabs: 4

    # Cache-Größen (für ~512 MB RAM ausreichend)
    rrset-cache-size: 100m
    msg-cache-size: 50m

    # Privacy
    hide-identity: yes
    hide-version: yes
    qname-minimisation: yes
    harden-glue: yes
    harden-dnssec-stripped: yes
    use-caps-for-id: yes

    # Maximum UDP-Größe — verhindert Fragmentierung
    edns-buffer-size: 1232

    # Prefetch beliebter Anfragen
    prefetch: yes
    prefetch-key: yes

    # Privates IP-Netz nicht extern auflösen (Rebind-Schutz)
    private-address: 192.168.0.0/16
    private-address: 169.254.0.0/16
    private-address: 172.16.0.0/12
    private-address: 10.0.0.0/8
    private-address: fd00::/8
    private-address: fe80::/10

Standard-Konfiguration deaktivieren, damit es keine Konflikte gibt:

sudo systemctl restart unbound
sudo systemctl enable unbound

Test: Funktioniert Unbound?

dig @127.0.0.1 -p 5335 google.com

Ihr solltet eine Antwort mit status: NOERROR und einer IP-Adresse sehen. Erste Anfragen dauern länger (Cache leer), danach unter 50ms.

💡 Tipp: Mit dig +dnssec @127.0.0.1 -p 5335 cloudflare.com testet ihr, ob DNSSEC funktioniert. Im flags-Feld muss ad stehen (Authenticated Data) — dann validiert Unbound korrekt.


Schritt 3: AdGuard Home installieren

AdGuard Home ist ein Single-Binary, also keine Paketquellen nötig. Wir laden es direkt:

cd /tmp
curl -sSL https://github.com/AdguardTeam/AdGuardHome/releases/latest/download/AdGuardHome_linux_amd64.tar.gz -o AdGuardHome.tar.gz
tar -xzf AdGuardHome.tar.gz
sudo mv AdGuardHome /opt/
cd /opt/AdGuardHome
sudo ./AdGuardHome -s install

Das Install-Script richtet AdGuard Home als systemd-Service ein und startet ihn.

Status prüfen

sudo systemctl status AdGuardHome

Sollte active (running) zeigen. Im Browser:

http://EURE-SERVER-IP:3000

Schritt 4: Initial-Setup im Web-Wizard

Im Wizard:

  1. Listen Interface: Alle Interfaces, Port 80 für Web-UI (oder 3000 belassen)
  2. DNS Listen Interface: Alle Interfaces, Port 53
  3. Admin-User: Username + starkes Passwort wählen
  4. Konfiguration prüfen und abschließen

⚠️ Wichtig: Wenn AdGuard Home auf Port 80 lauscht, kann später kein Webserver (Nginx, Apache, Traefik) mehr auf Port 80 laufen. Falls ihr beides braucht, lasst AdGuard auf Port 3000 oder 8080 und schaltet einen Reverse Proxy davor.

Nach dem Wizard meldet ihr euch erneut an — diesmal unter dem konfigurierten Port.


Schritt 5: AdGuard Home → Unbound verbinden

Im AdGuard-Dashboard: Einstellungen → DNS-Einstellungen.

Bei Upstream-DNS-Server alles löschen und nur eintragen:

127.0.0.1:5335

Bei Bootstrap DNS Server (für initiale Auflösung):

1.1.1.1
8.8.8.8

💡 Hinweis: Bootstrap DNS wird nur einmalig für die DNS-over-HTTPS-Provider-Domain aufgelöst. Für eure normalen Anfragen ist das egal — die laufen über Unbound.

Klickt auf Test Upstreams — alle sollten OK sein. Dann Speichern.

Filter-Listen aktivieren

Unter Filter → DNS-Sperrlisten → Aktualisierungs-Intervall auf 12 Stunden stellen. Standard-Listen sind aktiv. Empfehlenswerte zusätzliche Listen:

  • OISD Bighttps://big.oisd.nl/ (sehr umfassende Liste)
  • HaGeZi Prohttps://raw.githubusercontent.com/hagezi/dns-blocklists/main/adblock/pro.txt
  • AdGuard DNS Filter (bereits aktiv)
  • EasyPrivacy — Tracker-Blocking

Hinzufügen über Custom Filtering Rules → Add blocklist.

Geschafft! AdGuard Home filtert eure DNS-Anfragen über Unbound — kein Upstream-Provider, kein externer Logger, vollständig unter eurer Kontrolle.


Schritt 6: AdGuard Home als DNS im Netzwerk verteilen

Damit alle Geräte AdGuard Home nutzen, müssen sie eure Server-IP als DNS bekommen. Drei Wege:

Variante A: Router-DHCP (empfohlen)

Im Router-Interface (FritzBox, Speedport, OPNsense, pfSense etc.):

  • DHCP-Einstellungen → Lokaler DNS-Server: EURE-SERVER-IP
  • Sekundärer DNS leer lassen oder eine externe Adresse als Fallback

Geräte holen beim Reconnect die neue Konfiguration und nutzen ab sofort AdGuard Home.

Variante B: AdGuard Home als DHCP-Server

AdGuard Home kann selbst DHCP machen, falls euer Router das nicht sauber unterstützt. Im Dashboard: Einstellungen → DHCP-Einstellungen.

⚠️ Wichtig: Nur EINER im Netzwerk darf DHCP-Server sein. Wenn euer Router das schon macht, deaktiviert es entweder im Router oder in AdGuard Home — niemals beides parallel.

Variante C: Pro Gerät manuell

In den Netzwerk-Einstellungen jedes Geräts manuell den DNS auf eure Server-IP setzen. Aufwendig, aber funktioniert ohne Router-Eingriff.


Schritt 7: Verschlüsseltes DNS (DoH/DoT) — optional aber empfohlen

DNS-Anfragen sind im Klartext. Mit DoH/DoT könnt ihr sie verschlüsseln — sinnvoll für Mobilgeräte unterwegs.

Voraussetzungen

  • Eine Domain (z.B. dns.example.com)
  • Ein gültiges SSL-Zertifikat
  • Reverse Proxy davor oder direkter Zugriff auf Port 443

Einfachste Lösung: Nginx als Proxy

Wir nutzen unseren Nginx-Reverse-Proxy, Domain dns.example.com:

sudo nano /etc/nginx/sites-available/dns.example.com

Wichtige Einstellungen:

server {
    listen 443 ssl http2;
    server_name dns.example.com;

    ssl_certificate /etc/letsencrypt/live/dns.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/dns.example.com/privkey.pem;

    location /dns-query {
        proxy_pass http://127.0.0.1:3000;
        proxy_set_header Host $host;
    }
}

In AdGuard Home: Einstellungen → Verschlüsselung → DNS-over-HTTPS aktivieren, Pfad /dns-query.

In iOS/Android über Profile oder Apps wie AdGuard lässt sich der DoH-Server eintragen — funktioniert dann auch im LTE/5G-Netz.


Schritt 8: Custom DNS Records für Self-Hosted-Services

Ein riesiger Vorteil eures eigenen DNS: Ihr könnt interne Domains definieren, die nur im LAN auflösbar sind.

Im AdGuard-Dashboard: Filter → Custom Filtering Rules.

Beispiel:

192.168.1.100  proxmox.local
192.168.1.101  nas.local
192.168.1.50   homeassistant.local

Jetzt sind eure Self-Hosted-Services unter sprechenden Namen erreichbar — auch ohne öffentliche DNS-Einträge.

💡 Tipp: Mit .local als TLD habt ihr garantiert keine Konflikte mit echten Domains. Manche Geräte (Apple Bonjour) reservieren .local aber für sich selbst — alternativ funktioniert .lan oder .home.


Schritt 9: Per-Client-Regeln & Kindersicherung

Im AdGuard-Dashboard: Einstellungen → Clients-Einstellungen.

Hier könnt ihr für jedes Gerät individuelle Filter-Regeln festlegen:

  • Kinder-Tablet: Safe Search aktiv, zusätzliche Filter-Listen, YouTube auf jugendfrei
  • Smart-TV: Tracker komplett blocken, aber nichts anderes filtern
  • Gaming-PC: Keine Filter, weil Spiel-DRM sonst stört

Geräte werden automatisch erkannt und in der Übersicht angezeigt — ihr müsst sie nur benennen und Regeln zuweisen.


Backups

AdGuard Home speichert alles in /opt/AdGuardHome/AdGuardHome.yaml. Plus die Daten unter /opt/AdGuardHome/data/.

Was muss gesichert werden?

  • /opt/AdGuardHome/AdGuardHome.yaml — Komplette Config
  • /opt/AdGuardHome/data/ — Statistiken, Filter, Sessions
  • /etc/unbound/unbound.conf.d/adguard.conf — Unbound-Config

Automatisches Backup-Script

sudo nano /usr/local/bin/adguard-backup.sh

Inhalt:

#!/bin/bash
set -e

BACKUP_DIR="/var/backups/adguard"
TIMESTAMP=$(date +%Y%m%d-%H%M%S)
RETENTION_DAYS=14

mkdir -p "$BACKUP_DIR"

tar -czf "$BACKUP_DIR/adguard-$TIMESTAMP.tar.gz" \
  -C /opt/AdGuardHome AdGuardHome.yaml data \
  -C /etc/unbound/unbound.conf.d adguard.conf

find "$BACKUP_DIR" -type f -mtime +$RETENTION_DAYS -delete

echo "Backup completed: $TIMESTAMP"

Ausführbar machen und mit systemd Timer automatisieren — wie in unserem restic Backup-Tutorial beschrieben:

sudo chmod +x /usr/local/bin/adguard-backup.sh
sudo /usr/local/bin/adguard-backup.sh

Updates

AdGuard Home

AdGuard Home hat einen eingebauten Auto-Updater. Im Dashboard: Einstellungen → Allgemein → Auto-Update aktivieren. Bei jedem Start prüft AdGuard auf neue Versionen.

Manuell:

sudo /opt/AdGuardHome/AdGuardHome --update

Unbound

Updates über apt:

sudo apt update && sudo apt upgrade unbound
sudo systemctl restart unbound

💡 Empfehlung: Bei AdGuard Home sind Updates fast immer Bugfixes oder neue Features ohne Breaking Changes. Auto-Update ist hier ausnahmsweise unbedenklich — anders als z.B. bei Datenbanken.


Zusammenfassung & Checkliste

SchrittStatus
Debian 13 Server eingerichtet
systemd-resolved umkonfiguriert (Port 53 frei)
Unbound installiert und konfiguriert
Unbound auf Port 5335 erreichbar
AdGuard Home heruntergeladen und installiert
Web-Wizard durchlaufen
Upstream auf 127.0.0.1:5335 (Unbound) gesetzt
Filter-Listen aktiviert
Router-DHCP auf AdGuard-IP umgestellt
Test-Geräte filtern Werbung
Custom DNS Records für lokale Services
Backup-Script eingerichtet

Troubleshooting

„Address already in use“ beim AdGuard-Start

Port 53 ist noch von systemd-resolved belegt:

sudo ss -tulpn | grep ':53 '
sudo systemctl status systemd-resolved

Falls noch belegt, Schritt 1 erneut prüfen.

DNS-Auflösung schlägt fehl

  • AdGuard Home läuft? sudo systemctl status AdGuardHome
  • Unbound läuft? sudo systemctl status unbound
  • Test direkt gegen AdGuard: dig @127.0.0.1 google.com
  • Test gegen Unbound: dig @127.0.0.1 -p 5335 google.com

Geräte im Netzwerk nutzen AdGuard nicht

  • Router-DHCP korrekt umgestellt?
  • Geräte neu verbunden (DHCP-Lease erneuern)?
  • ipconfig /all (Windows) oder cat /etc/resolv.conf (Linux) — welcher DNS steht da?

Webseite blockiert, soll aber funktionieren

  • Im Dashboard → Query Log → Eintrag suchen → Allow this domain
  • Oder dauerhaft in Custom Filtering Rules: @@||example.com^

Unbound-Fehler „could not open autotrust file“

sudo unbound-anchor -a /var/lib/unbound/root.key
sudo chown unbound:unbound /var/lib/unbound/root.key
sudo systemctl restart unbound

Sehr langsame DNS-Antworten

  • Unbound-Cache zu klein? In adguard.conf rrset-cache-size und msg-cache-size erhöhen
  • DNSSEC-Validierung scheitert? Logs prüfen: sudo journalctl -u unbound -f

Nächste Schritte

AdGuard Home läuft — und jetzt? Hier sind sinnvolle nächste Schritte:

  • DNS-over-HTTPS für Mobilgeräte — Filterung auch unterwegs
  • HA-Setup mit zweitem AdGuard — Replikation + Failover für Ausfallsicherheit
  • Pi-hole-Backup importieren — Falls ihr von Pi-hole umzieht, gibt es Migration-Tools
  • Custom-CSS für AdGuard-Dashboard — Branding fürs Homelab
  • Grafana-Dashboards — Block-Statistiken visualisieren
  • AdGuard auf zweitem Server — Round-Robin für Performance

AdGuard Home + Unbound ist die saubere Lösung für DNS-Privatsphäre. Die offizielle AdGuard-Dokumentation ist umfangreich.

Habt ihr Fragen oder Probleme? Schreibt es in die Kommentare — ich helfe gerne!

Kommentar hinterlassen