Zum Inhalt springen
Serverküche
Suche

Die Suche wird geladen … (nur in der veröffentlichten Seite verfügbar).

Anwendungen Schwierigkeit: Fortgeschritten

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.

· 8 Min. Lesezeit ·Dauer: ca. 45 Minuten
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 wg0 unter 10.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.

🍳 Empfehlung Anzeige

VPS 1000 G12

4 vCore · 8 GB RAM · 256 GB NVMe

ab 10,36 €/Monat

Für AdGuard Home mehr als ausreichend.

Zu netcup →

💶 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:

Terminal
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"):

Terminal
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-resolved

resolv.conf nicht vergessen

Schaltest du den Stub-Listener ab, zeigt /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:

Terminal
mkdir -p /opt/adguardhome/work /opt/adguardhome/conf && cd /opt/adguardhome

Erstelle die compose.yaml:

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: true

Das Wichtigste:

  • ports: "10.8.0.1:53:53" – der DNS-Port wird nur an die WireGuard-Adresse gebunden, nicht an 0.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_DOMAIN mit TLS veröffentlicht. Ersetze DEINE_DOMAIN durch deine echte Domain.
  • Beide volumes (work, conf) machen Konfiguration und Statistik dauerhaft.

Starte den Container:

Terminal
docker compose up -d

Prüfe, dass er läuft:

Terminal
docker compose ps

Du solltest Up sehen und dass Port 53 an 10.8.0.1 gebunden ist.

Niemals Port 53 offen ins Internet

Schreib nie - "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.

Der Willkommensbildschirm des AdGuard-Home-Einrichtungsassistenten.
Der Einrichtungsassistent begrüßt dich – die Sprache stellst du unten rechts um.

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.

Das AdGuard-Home-Dashboard mit Anfrage-Statistik und Top-Domains.
Das Dashboard zeigt live, wie viele Anfragen ankommen und wie viele gesperrt werden.

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.

Die Verwaltung der DNS-Sperrlisten in AdGuard Home.
Die Standard-Sperrliste ist aktiv; weitere Listen aktivierst oder ergänzt du hier.

Ü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

Es ist verlockend, zehn aggressive Listen zu stapeln. Das führt aber zu Overblocking: Login-Seiten, Bilder oder Warenkörbe funktionieren plötzlich nicht mehr, und die Fehlersuche ist mühsam. Fang mit der Standard-Liste an und ergänze gezielt.

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:

INI
[Interface]
# ... deine bestehenden Zeilen ...
DNS = 10.8.0.1

Sobald 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:

Terminal
dig @10.8.0.1 +short example.com
Ausgabe
172.66.147.243

Eine bekannte Tracking-Domain muss geblockt werden – AdGuard antwortet dann mit 0.0.0.0:

Terminal
dig @10.8.0.1 +short doubleclick.net
Ausgabe
0.0.0.0

Zur Gegenprobe, dass der Resolver nicht offen lauscht, fragst du ihn über die Loopback-Adresse an – das muss scheitern:

Terminal
dig @127.0.0.1 +time=2 +tries=1 example.com
Ausgabe
;; communications error to 127.0.0.1#53: connection refused

Genau 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:

Das Abfrageprotokoll von AdGuard Home mit erlaubten und gesperrten Anfragen.
Das Abfrageprotokoll: gesperrte Domains (rot) mit der Liste, die sie blockiert 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:

Terminal
cd /opt/adguardhome
docker compose pull && docker compose up -d

Datenschutz. 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