AdGuard Home: netzwerkweiter Werbe- und Tracking-Blocker
AdGuard Home mit Docker aufsetzen: ein eigener DNS-Server, der Werbung, Tracker und Schadseiten für alle Geräte blockt – sicher nur übers VPN.
Inhaltsverzeichnis
Werbung und Tracker blockt man am wirkungsvollsten nicht im Browser, sondern im DNS – dort, wo jedes Gerät nachfragt, welche IP zu einer Domain gehört. AdGuard Home ist ein selbstgehosteter DNS-Server, der Anfragen an bekannte Werbe-, Tracking- und Schad-Domains einfach ins Leere laufen lässt. Ein Server, alle Geräte – Handy, Fernseher, Laptop – ohne eine einzige App auf dem Client.
Was bauen wir?
Am Ende läuft AdGuard Home v0.107.78 als DNS-Server auf deinem VPS. Er beantwortet DNS-Anfragen, filtert dabei Werbung/Tracker/Malware anhand von Sperrlisten heraus und zeigt dir in einer Weboberfläche live, was blockiert wurde. Konkret:
- ein DNS-Filter mit über 150.000 Regeln (Standard-Blockliste), erweiterbar um beliebige Listen,
- eine Web-Oberfläche mit Statistik und Abfrageprotokoll, abgesichert hinter deinem Reverse Proxy,
- der DNS-Dienst ausschließlich über deinen WireGuard-Tunnel erreichbar – nicht offen im Internet.
Der letzte Punkt ist entscheidend und der Grund, warum dieses Tutorial WireGuard voraussetzt: Ein offener DNS-Resolver im Internet wird binnen Stunden für DNS-Amplification-Angriffe missbraucht. Deshalb binden wir den DNS-Port an das VPN-Interface, und nur deine eigenen Geräte sprechen ihn über den Tunnel an.
Voraussetzungen
- Ein Server mit Docker und einem laufenden Traefik-Reverse-Proxy (für die Weboberfläche unter einer eigenen Domain mit TLS).
- Ein eingerichtetes WireGuard-VPN mit dem Server-Interface
wg0unter10.8.0.1. Darüber erreichen deine Geräte später den DNS-Server. - Grundverständnis von DNS (Domain → IP) hilft, ist aber kein Muss.
AdGuard Home ist extrem genügsam – es kommt mit wenigen zehn MB RAM aus. Der kleinste Tarif reicht locker, zumal er bei dir vermutlich ohnehin neben anderen Diensten läuft.
VPS 1000 G12
4 vCore · 8 GB RAM · 256 GB NVMe
ab 10,36 €/Monat
Für AdGuard Home mehr als ausreichend.
💶 5 € Gutschein für netcup-Neukunden:36nc17844976032
(nur Neukunden, keine Domains)
Schritt für Schritt
Schritt 1: Ist Port 53 frei?
AdGuard Home braucht Port 53 – den DNS-Port. Auf manchen Systemen belegt ihn bereits
systemd-resolved. Prüfe das:
ss -tulpn | grep ":53 "Auf dem hier verwendeten netcup-Debian-13-Image war der Port frei (kein systemd-resolved aktiv),
die Ausgabe also leer. Bekommst du stattdessen eine Zeile mit systemd-resolve, musst du dessen
Stub-Listener abschalten – sonst startet AdGuard nicht („address already in use"):
sudo mkdir -p /etc/systemd/resolved.conf.d
echo -e "[Resolve]\nDNSStubListener=no" | sudo tee /etc/systemd/resolved.conf.d/adguard.conf
sudo systemctl restart systemd-resolvedresolv.conf nicht vergessen
/etc/resolv.conf unter Umständen noch auf 127.0.0.53
und der Server selbst kann keine Namen mehr auflösen. Setze in dem Fall einen funktionierenden
Resolver ein, z. B. nameserver 9.9.9.9 (oder den deines Providers), damit apt & Co.
weiterarbeiten.Schritt 2: Docker-Compose anlegen
Leg den Projektordner an:
mkdir -p /opt/adguardhome/work /opt/adguardhome/conf && cd /opt/adguardhomeErstelle die compose.yaml:
services:
adguardhome:
image: adguard/adguardhome:v0.107.78
container_name: adguardhome
restart: unless-stopped
volumes:
- ./work:/opt/adguardhome/work
- ./conf:/opt/adguardhome/conf
ports:
- "10.8.0.1:53:53/tcp"
- "10.8.0.1:53:53/udp"
networks:
- proxy
labels:
- "traefik.enable=true"
- "traefik.http.routers.adguard.rule=Host(`DEINE_DOMAIN`)"
- "traefik.http.routers.adguard.entrypoints=websecure"
- "traefik.http.routers.adguard.tls.certresolver=le"
- "traefik.http.services.adguard.loadbalancer.server.port=3000"
networks:
proxy:
external: trueDas Wichtigste:
ports: "10.8.0.1:53:53"– der DNS-Port wird nur an die WireGuard-Adresse gebunden, nicht an0.0.0.0. Damit ist der Resolver ausschließlich über den VPN-Tunnel erreichbar und niemals offen im Internet. Diese eine Zeile ist der Unterschied zwischen „sicher" und „wird für Angriffe missbraucht".- Die Web-Oberfläche läuft auf Container-Port 3000 und wird über die vier Traefik-Labels
unter
DEINE_DOMAINmit TLS veröffentlicht. ErsetzeDEINE_DOMAINdurch deine echte Domain. - Beide
volumes(work,conf) machen Konfiguration und Statistik dauerhaft.
Starte den Container:
docker compose up -dPrüfe, dass er läuft:
docker compose psDu solltest Up sehen und dass Port 53 an 10.8.0.1 gebunden ist.
Niemals Port 53 offen ins Internet
- "53:53/udp" (das bindet an alle Interfaces) auf einem öffentlichen Server. Ein
offener Resolver wird automatisiert gefunden und für Amplification-DDoS gegen Dritte
missbraucht – dein Anbieter sperrt dich dann zu Recht. Immer an ein privates Interface
(10.8.0.1) binden.Schritt 3: Die Ersteinrichtung
Rufe deine Domain im Browser auf – du landest im Einrichtungsassistenten. Rechts unten kannst du die Sprache auf Deutsch stellen.

Klick dich durch die fünf Schritte. Zwei Angaben sind wichtig:
- Admin-Weboberfläche: Als Port musst du 3000 eintragen (Alle Schnittstellen, Port
3000) – denn genau dorthin leitet Traefik. Der Vorschlag ist oft Port 80; änderst du ihn nicht, ist die Oberfläche nach dem Setup über Traefik nicht mehr erreichbar. - DNS-Server: Port 53 (Alle Schnittstellen). Die Beschränkung auf das VPN-Interface erledigt bereits die Port-Bindung aus der Compose – innerhalb des Containers darf AdGuard ruhig auf allen Schnittstellen lauschen.
Danach legst du Benutzername und ein starkes Passwort für die Anmeldung an. Fertig – du wirst zur Anmeldung weitergeleitet.
Schritt 4: Das Dashboard
Nach dem Login siehst du die Übersicht: Zahl der Anfragen, wie viele davon gesperrt wurden, die am häufigsten angefragten und die am häufigsten gesperrten Domains.

Anfangs ist alles auf null – das füllt sich, sobald das erste Gerät AdGuard als DNS nutzt (Schritt 6).
Schritt 5: Sperrlisten verwalten
Unter Filter → DNS-Sperrlisten siehst du die aktiven Blocklisten. Standardmäßig ist der AdGuard DNS filter aktiv – bei uns mit 159.173 Regeln.

Über Blockliste hinzufügen kannst du weitere kuratierte Listen einbinden (AdGuard bringt einen Katalog mit, z. B. AdAway oder OISD). Weniger ist oft mehr: Ein, zwei gute Listen blocken das meiste, ohne dass ständig legitime Seiten kaputtgehen. Mit Nach Updates suchen aktualisierst du die Regeln manuell; AdGuard hält sie sonst automatisch aktuell (siehe „Wartung").
Nicht übertreiben
Schritt 6: Geräte auf AdGuard umstellen
Damit deine Geräte den Filter nutzen, müssen sie AdGuard als DNS-Server verwenden. Über den
WireGuard-Tunnel geht das am elegantesten zentral in der Client-Konfiguration: Trag in der
[Interface]-Sektion deiner WireGuard-Clients die Server-Tunneladresse als DNS ein:
[Interface]
# ... deine bestehenden Zeilen ...
DNS = 10.8.0.1Sobald der Tunnel steht, schickt das Gerät alle DNS-Anfragen an AdGuard – egal ob unterwegs im WLAN oder im Mobilfunknetz. Kein Eingriff am Router nötig, und der Schutz wirkt auch von unterwegs.
Schritt 7: Funktioniert es wirklich?
Prüf den Resolver direkt auf dem Server über die VPN-Adresse. Eine normale Domain muss auflösen:
dig @10.8.0.1 +short example.com172.66.147.243Eine bekannte Tracking-Domain muss geblockt werden – AdGuard antwortet dann mit 0.0.0.0:
dig @10.8.0.1 +short doubleclick.net0.0.0.0Zur Gegenprobe, dass der Resolver nicht offen lauscht, fragst du ihn über die Loopback-Adresse an – das muss scheitern:
dig @127.0.0.1 +time=2 +tries=1 example.com;; communications error to 127.0.0.1#53: connection refusedGenau so soll es sein: erreichbar über 10.8.0.1 (den Tunnel), abgewiesen auf allen anderen
Adressen. Ein Blick ins Abfrageprotokoll in der Weboberfläche zeigt dieselben Anfragen live –
gesperrte Einträge sind rot markiert und nennen die Liste, die gegriffen hat:

Wenn es nicht funktioniert
Der Container startet nicht, Log sagt „listen udp :53: bind: address already in use".
systemd-resolved (oder ein anderer DNS-Dienst) belegt Port 53. Stub-Listener abschalten wie in
Schritt 1, danach docker compose up -d erneut.
docker compose up scheitert mit „cannot assign requested address" für 10.8.0.1. Das
WireGuard-Interface wg0 mit 10.8.0.1 existiert (noch) nicht – Docker kann den Port nicht an eine
nicht vorhandene Adresse binden. Zuerst das WireGuard-VPN
einrichten und wg0 hochfahren (ip -br addr show wg0 muss 10.8.0.1 zeigen), dann den Container
starten.
Nach dem Setup ist die Weboberfläche nicht mehr erreichbar. Im Assistenten wurde der Admin-Port
auf 80 (Vorschlag) statt auf 3000 gesetzt – Traefik leitet aber auf 3000. In
./conf/AdGuardHome.yaml unter http: die address auf 0.0.0.0:3000 korrigieren und docker compose restart.
DNS filtert nicht, obwohl das Gerät verbunden ist. Der Browser nutzt DNS-over-HTTPS (DoH)
und umgeht damit deinen Server komplett – Firefox und Chrome haben das teils standardmäßig aktiv. In
den Browser-Einstellungen „Sicheres DNS" / „DNS über HTTPS" deaktivieren. Prüfen kannst du das mit
dig @10.8.0.1 … (greift immer).
Eine Website ist plötzlich kaputt (leere Seiten, fehlende Bilder, kein Login). Overblocking – eine Sperrliste blockt eine Domain, die die Seite wirklich braucht. Im Abfrageprotokoll die gesperrte Domain suchen, per Rechtsklick/Menü freigeben (Ausnahme) oder die zu aggressive Liste deaktivieren.
Wartung & Backups
Sperrlisten-Updates. AdGuard aktualisiert die Listen automatisch (Standard: alle 24 Stunden). Du musst hier nichts tun; ein manuelles Nach Updates suchen geht bei Bedarf jederzeit.
Backups. Die gesamte Konfiguration steckt in /opt/adguardhome/conf/AdGuardHome.yaml – Admin-Login,
DNS-Einstellungen, Listen, Ausnahmen. Diese Datei (plus den work-Ordner mit der Statistik) sicherst
du regelmäßig mit, z. B. per restic. Damit ist ein Server-Umzug in
Minuten erledigt: Container hochziehen, conf zurückspielen, fertig.
Updates. Neue Versionen holst du dir wie bei jedem Compose-Stack. Pinne den Tag bewusst
(nicht latest), damit Updates kontrolliert passieren:
cd /opt/adguardhome
docker compose pull && docker compose up -dDatenschutz. Das Abfrageprotokoll speichert, welches Gerät welche Domain angefragt hat – das ist für die Fehlersuche Gold wert, aber auch sensibel. Unter Einstellungen → Allgemeine Einstellungen kannst du die Aufbewahrungsdauer des Protokolls verkürzen oder das Logging ganz abschalten. Gerade wenn andere Personen deinen DNS mitnutzen, ist eine kurze Aufbewahrung fair.
Feedback per E-Mail: feedback@serverkueche.de
Das könnte dir auch schmecken

Docker-Netzwerke verstehen: bridge, internes DNS & das proxy-Netz
Warum deklariert jedes App-Rezept ein proxy-Netz? Dieser Guide erklärt Docker-Netzwerke, das interne DNS und …

Die eigene Website mit Hugo hosten – wie die Serverküche selbst
Statische Website mit Hugo bauen und im Docker-Container hinter Traefik ausliefern – schnell, sicher, ohne Datenbank. …

Immich optimieren: Handy-Backup, deutsche KI-Suche & Familien-Betrieb (Teil 2)
Immich Teil 2: Handy-Backup zuverlässig machen, die KI-Suche auf Deutsch umstellen, Bestandsfotos als externe Bibliothek …