AdGuard Home im Netzwerk implementieren

Vielen Leuten ist das Projekt Pi-hole ein Begriff. Damit verbunden wird primär das Blockieren von Werbung für Produkte. Und zwar für alle Geräte, die den Server auf dem die Applikation läuft, als DNS-Server nutzen.

Ein vergleichsweises relativ unbekanntes Projekt ist AdGuard Home. Die technische Architektur ist die gleiche wie bei Pi-Hole. Der Mehrwert liegt meines Erachtens nach an dem expliziten Familienschutzfilter, keine wesentlichen Abhängigkeiten zu anderen Paketen. Damit verbunden erhöht sich auch die Stabilität/Zuverlässigkeit.

Funktionsumfang

Nachstehend eine Übersicht des Funktionsvergleich:

Die Gegenüberstellung der Funktionen ist zum Zeitpunkt des Schreibens aktuell. Natürlich hängt eure Entscheidung auch davon ab, welche Anforderungen und Wünsche ihr umsetzen dürft/sollt/müsst. Darum soll es auch in diesen Artikel nicht gehen.

Installation

Nachstehend beschreibe ich die Installation von AdGuard Home unter Ubuntu Server 20.04 LTS. Es geht sowohl um die klassische Installation als auch die Nutzung eines Docker Containers.

Native Installation

Download der aktuellen Installationsskripts.

curl -sSL https://raw.githubusercontent.com/AdguardTeam/AdGuardHome/master/scripts/install.sh | sh

Ausgabe:

[info] Starting AdGuard Home installation script
[info] Channel release
[info] Script called with root privileges
[info] AdGuard Home will be installed to /opt/AdGuardHome
[info] Downloading package from https://static.adguard.com/adguardhome/release/AdGuardHome_linux_amd64.tar.gz -> AdGuardHome_linux_amd64.tar.gz
[info] Unpacking package from AdGuardHome_linux_amd64.tar.gz -> /opt
2020/12/26 11:01:21 [info] Service control action: install
2020/12/26 11:01:22 [info] Service has been started
2020/12/26 11:01:22 [info] Almost ready!
AdGuard Home is successfully installed and will automatically start on boot.
There are a few more things that must be configured before you can use it.
Click on the link below and follow the Installation Wizard steps to finish setup.
2020/12/26 11:01:22 [info] AdGuard Home is available on the following addresses:
2020/12/26 11:01:22 [info] Go to http://127.0.0.1:3000
2020/12/26 11:01:22 [info] Go to http://[::1]:3000
2020/12/26 11:01:22 [info] Go to http://159.69.118.129:3000
2020/12/26 11:01:22 [info] Go to http://[2a01:4f8:c17:dd5d::1]:3000
2020/12/26 11:01:22 [info] Action install has been done successfully on linux-systemd
[info] AdGuard Home is now installed and running.
[info] You can control the service status with the following commands:
[info]   sudo /opt/AdGuardHome/AdGuardHome -s start|stop|restart|status|install|uninstall

Die Installation ist erfolgreich durchgeführt. Das wir vermutlich daran liegen, dass die Applikation aus einer Datei besteht.

Somit gibt es wie bereits eingangs geschrieben keine Abhängigkeiten zu erfüllen und zu installieren. Damit ein Problem weniger…

Konfiguration der Firewall.

ufw allow ssh
ufw allow 53/tcp
ufw allow 53/udp
#ufw allow 67/udp
#ufw allow 68/udp
ufw allow http
ufw allow https
ufw allow 853/tcp
ufw allow 3000/tcp

echo y | ufw enable
ufw status

Docker Installation

Betriebssystem und installierte Pakete aktualisieren

apt update && apt upgrade -y

Installation von Docker.

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add -
apt-key fingerprint 0EBFCD88

add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
apt-get update
apt install docker-ce docker-ce-cli containerd.io -y

Installation Docker Compose.

curl -L "https://github.com/docker/compose/releases/download/1.25.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
docker-compose --version

Docker Container herunterladen.

docker pull adguard/adguardhome

Konfiguration für Docker-Compose anlegen.

mkdir -p /home/docker/adguard-home/{work,conf}

cat << EOF > /home/docker/adguard-home/docker-compose.yml
version: '3.7'
services:
  adguardhome:
    container_name: adguardhome
    image: adguard/adguardhome:latest
    restart: unless-stopped

    volumes:
      - ./work:/opt/adguardhome/work
      - ./conf:/opt/adguardhome/conf

    # Uncomment when you want to setup a DHCP server as well
    # network_mode: "host"

    ports:
      - "53:53/tcp"
      - "53:53/udp"
      #- "67:67/udp"
      #- "68:68/tcp"
      #- "68:68/udp"
      - "80:80/tcp"
      - "443:443/tcp"
      - "853:853/tcp"
      - "3000:3000/tcp"

volumes:
  dbinit:
    driver: local

EOF

DNSStubListener deaktivieren / DNS Serveradresse aktualisieren.

mkdir -p /etc/systemd/resolved.conf.d/
cat << EOF > /etc/systemd/resolved.conf.d/adguardhome.conf
[Resolve]
DNS=127.0.0.1
DNSStubListener=no
EOF

mv /etc/resolv.conf /etc/resolv.conf.backup
ln -s /run/systemd/resolve/resolv.conf /etc/resolv.conf

systemctl reload-or-restart systemd-resolved

Container/Applikation starten.

cd /home/docker/adguard-home
docker-compose config
docker-compose up -d
docker ps

Einrichten der Firewall.

ufw allow ssh
echo y | ufw enable
ufw status

wget -O /usr/local/bin/ufw-docker https://github.com/chaifeng/ufw-docker/raw/master/ufw-docker
chmod +x /usr/local/bin/ufw-docker
ufw-docker install
systemctl restart ufw

ufw-docker allow adguardhome 53/tcp
ufw-docker allow adguardhome 53/udp
#ufw-docker allow adguardhome 67/udp
#ufw-docker allow adguardhome 68/udp
ufw-docker allow adguardhome 80/tcp
ufw-docker allow adguardhome 443/tcp
ufw-docker allow adguardhome 853/tcp
ufw-docker allow adguardhome 3000/tcp

Initiale Einrichtung der Applikation

Unabhängig von der Installationsmethode sind insgesamt 5 Einrichtungsschritte notwendig. Danach ist die AdGuard Home vollständig nutzbar für die Geräte im Netzwerk.

Nach der erfolgreichen Anmeldung wir das Dashboard von AdGuard Home angezeigt.

Das Dashboard wirkt aufgeräumt und damit übersichtlich. Die Navigation befindet sich an der

Administration des AdGuard Home Dienstes

Die Applikation wird während der Installation automatisch als Dienst eingerichtet. Die Verwaltung des Dienstes kann mit folgenden Befehlen erfolgen:

sudo /opt/AdGuardHome/AdGuardHome -s start|stop|restart|status|install|uninstall

Änderung der Upstream DNS-Server

Standardmäßig sind nach der initialen Konfiguration die DNS-Server „xxx“ hinterlegt. Dabei erfolgt die Abfrage über „xxx“.

Wer es so wie ich gerne datenschutzfreundlich habe möchte, kann problemlos andere DNS-Server eintragen. Für diesen Artikel greife ich auf DNS.WATCH zurück.

Durch die Nutzung der regulären DNS-Abfragen erfolgen natürlich die DNS Abfragen auch deutlich schneller als in der Standardkonfiguration.

Nicht vergessen die Änderungen explizit über die Schaltfläche „Anwenden“ zu speichern.

Kindersicherung aktivieren

Gerade mit Home Schooling waren in vergangenen 10 Monate viele Kinder und Jugendliche (alleine) zu Hause. Damit verbunden müssen sich verantwortungsvolle Eltern gezwungenermaßen mit dem Jugendschutz Ihrer Kinder am Tablet/Notebook/Smartphone beschäftigen.

Hierfür sind in AdGuard Home alle notwendigen Mechanismen integriert. Die notwendige Konfiguration erfolgt einfach über das Dashboard unter Einstellungen -> Allgemeine Einstellungen.

Die Einstellung „AdGuard Webservice für Kindersicherung verwenden“ aktivieren. Dazu mit der Maus auf das Kästchen klicken. Das Gleiche noch einmal für „SafeSearch“ wiederholen. Letztes filtert auch entsprechende Suchergebnisse auf den Internetseiten der genannte Internetkonzerne. Die Änderung wird sofort gespeichert und wirksam.

Erfolgt nun der Aufruf einer Internetseite, die als FSK18 kategorisiert wurde, wird im Browser der entsprechende Hinweis angezeigt.

Kindersicherung pro Gerät aktivieren

Im Gegensatz zu Pi-Hole gibt es in AdGuard die Möglichkeit pro Gerät die Konfiguration vorgenommen werden kann. Die Kindersicherung nicht global sondern pro Gerät zu konfigurieren, ist zu Hause durch aus sinnvoller. Denn somit können Eltern mit ihren Smartphone weiterhin uneingeschränkt bewegen.

Zuerst die evtl. obengetätigen Konfiguration für die Kindersicherung rückgängig machen. Danach die Konfiguartion die Einstellungen -> Client Einstellungen aufrufen.

Ein neues Gerät kann über „Client hinzufügen“ angelegt werden.

Neben den Filter Einstellungen können auch diverse Dienste freigeben/gesperrt werden. Dazu auf die Registerkarte „Bestimmte Dienste sperren“ wechseln.

Mit „Speichern“ werden die Änderungen übernommen und wirksam. Änderungen für den Client sind natürlich jederzeit möglich.

Beim Aufruf eines Dienstes (z.B. www.amazon.de) wird im Browser des Clients folgende Fehler ausgegeben. 

In der Weboberfläche von AdGuard unter Anfrageprotokoll kann der gesperrte Dienst kontrolliert werden. In diesen Fall ist der Aufruf von Amazon durch AdGuard geblockt wurde.

Verschlüsselungseinstellungen

Standardmäßig wird AdGuard Home ohne SSL Zertifikat ausgeliefert. Damit verbunden sind folgende Funktionen deaktivert:

  • Nutzung der Weboberfläche über HTTPS
  • DNS-over-HTTPS
  • DNS-over-TLS

Seit geraumer Zeit gibt es mit Let’s Encrypt einen Anbieter in dem Bereich, bei dem man kostenlos SSL-Zertifikate abrufen kann. In diesen Szenario kann allerdings nicht wie oft genutzt, auf die HTTP-01 challenge zurückgegriffen werden. Grund dafür ist, dass der Port 80 (HTTP) und Port 443 (HTTPS) bereits bzw. zukünftig durch AdGuard Home verwendet werden. Daher bleibt nur die alternative Methode DNS-01 challenge über.

Die Besonderheit bei DNS-01 challenge ist, dass keine Ports vom Internet auf den Server (Port Forwarding), auf dem Adguard bzw. Certbot installiert sind, geöffnet werden müssen. Zumal viele Internetanschlüsse heutzutage von dem Internet Service Provider (ISP) als DualStack Lite bereitgestellt werden und daher technisch ohne weiteres nicht umsetzbar ist.

>> Achtung, ich berücksichtige bis dato ausschließlich die native Installation von AdGuard! <<

Die Herausfordung ist in diesen Fall, dass aus dem lokalen Netzwerk raus, bei dem entsprechenden Abruf des SSL-Zertifikats in der entsprechenden DNS Zone (z.B. wydler.eu) sogenannte TXT Einträge temporär erstellt werden müssen. Alle Anbieter, die keine API anbieten, sind an dieser Stelle nicht nutzbar.

Ich greife für den Abruf des SSL-Zertifikats auf das Tool certbot zurück. Es gibt dafür aktuell von der Community eine sehr große Anzahl von Bibliotheken für die verschiedestens Webhoster auf der Welt. In meinen Fall liegt die Domain wydler.eu bei dem Webhoster Core Networks.

Installation von certbot und Plugin

apt install python3-pip
pip3 install cryptography==3.2
pip3 install certbot-dns-corenetworks

Konfiguration des Plugins

Zuerst muss im Kundenmenü des Webhosters evtl. die API freigeschaltet werden. Bei meinem Webhoster ist dies nicht erforderlich. Daher habe ich gleich einen Benutzerkonto für AdGuard erstellt.

Danach muss laut der Dokumentation für die Bibliothek eine Datei mit dem Zugangsdaten auf dem Server angelegt werden. Ich nutze dazu ein separates Verzeichnis, falls zukünftig weitere/andere Bibliotheken dazu kommen sollten.

mkdir /etc/certbot

cat << EOF > /etc/certbot/corenetworks.ini
dns_corenetworks_username = api-username
dns_corenetworks_password = api-password
EOF

chmod 750 /etc/certbot/corenetworks.ini

Abruf eines SSL Zertifikats

Damit sind alle Voraussetzungen geschaffen, so dass nun endlich das SSL Zertifikat abgerufen werden kann. Wie immer gilt: Zuerst wird  ein Testlauf durchgeführt, um evtl. (logische) Fehler zu finden.

certbot certonly \
 --authenticator dns-corenetworks \
 --dns-corenetworks-credentials /etc/certbot/corenetworks.ini \
 --domain adguard01.wydler.eu \
 -m webmaster@wydler.eu \
 --agree-tos \
 --dry-run

Ausgabe:

Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator dns-corenetworks, Installer None

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. You must
agree in order to register with the ACME server. Do you agree?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: y

Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator dns-corenetworks, Installer None
Account registered.
Simulating a certificate request for adguard01.wydler.eu
Performing the following challenges:
dns-01 challenge for adguard01.wydler.eu
Waiting 60 seconds for DNS changes to propagate
Waiting for verification...
Cleaning up challenges

IMPORTANT NOTES:
 - The dry run was successful.

Der Test war erfolgreich. In diesen Fall kann der Befehl ohne den Parameter –dry-run wiederholt werden. Somit erfolgt der Abruf des Zertifikats produktiv.

Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator dns-corenetworks, Installer None

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Would you be willing, once your first certificate is successfully issued, to
share your email address with the Electronic Frontier Foundation, a founding
partner of the Let's Encrypt project and the non-profit organization that
develops Certbot? We'd like to send you email about our work encrypting the web,
EFF news, campaigns, and ways to support digital freedom.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: y
Account registered.
Requesting a certificate for adguard01.wydler.eu
Performing the following challenges:
dns-01 challenge for adguard01.wydler.eu
Waiting 60 seconds for DNS changes to propagate
Waiting for verification...
Cleaning up challenges
Subscribe to the EFF mailing list (email: webmaster@wydler.eu).

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/adguard01.wydler.eu/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/adguard01.wydler.eu/privkey.pem
   Your certificate will expire on 2021-05-22. To obtain a new or
   tweaked version of this certificate in the future, simply run
   certbot again. To non-interactively renew *all* of your
   certificates, run "certbot renew"
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

Perfekt, das neue Zertifikat ist erfolgreich abgerufen und unter „/etc/letsencrypt/live/adguard01.wydler.eu/“ abgelegt.

Damit das Zertifikat auch vor Ablauf (innerhalb von 30 Tagen) automatisch verlängert wird, greife ich auf einen Cronjob zurück.

cat << EOF > /etc/cron.d/certbot
# /etc/cron.d/certbot: crontab entries for the certbot package
#
# Upstream recommends attempting renewal twice a day
#
# Eventually, this will be an opportunity to validate certificates
# haven't been revoked, etc.  Renewal will only occur if expiration
# is within 30 days.
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# m h DoM Mon DoW        command:
  0 0 *   *   *          /usr/local/bin/certbot renew
  
EOF

Für die Nutzung von DNS-over-TLS muss noch ein weiterer Port in der Firewall geöffnet werden.

ufw allow 853/tcp

Konfiguration in AdGuard Home

Zu guter letzt muss die Nutzung der Verschlüsselung in der Weboberfläche aktiviert und konfiguriert werden.

Bitte nicht vergessen, dass der Pfad natürlich an eure Umgebung bzw. Servernamen anzupassen ist. Die Dateinamen fullchain.pem und privkey.pem ändern sich nicht. Die Änderungen mit Konfiguration speichern übernehmen.

Damit auch die Anfragen von AdGuard zu dem Upstream Server verschlüsselt werden, müssen die hinterlegten Adressen unter Einstellungen -> DNS-Server geändert werden.

Nachstehend die einzelnen Adressen nochmals zum Kopieren (Copy & Paste).

https://dns.switch.ch/dns-query
tls://dns.switch.ch
https://doh.ffmuc.net/dns-query
tls://dot.ffmuc.net
https://dns.digitale-gesellschaft.ch/dns-query
tls://dns.digitale-gesellschaft.ch
84.200.69.80
84.200.70.40
2001:1608:10:25::1c04:b12f
2001:1608:10:25::9249:d69b

Abschlusstest

Nach dem die Änderungen erfolgreich gespeichert wurden, wechselt die Weboberfläche automatisch von HTTP auf HTTPs.

Zum Testen von DNS over HTTPS ist ein aktueller Browser (z.B. Google Chrome, Microsoft Edge oder Mozialle Firefox) notwnedig, der die Technik bereits unterstützt.

Firefox

Hier bin ich so frei und verweise auf die Hilfe von Mozilla.

Microsoft Edge

Google Chrome

Leider keinen zur Hand.

Ergebnis

Die Änderung mit „OK“ speichern. Diese wird auch sofort wirksam. Neuer TAB öffnen und eine beliebige Seite (z.B. de.wikipedia.org) aufrufen. Danach die Weboberfläche von AdGuard und in den Reiter „Anfragenprotokoll“ wechseln. Dort sieht man ua. folgende Einträge:

Viel Spaß beim Ausprobieren. 🙂

Abonnieren
Benachrichtige mich bei
21 Comments
neueste
älteste
Inline Feedbacks
View all comments
Johannes
22.04.2021 08:33

Hallo,

super Artikel zur Adguard:

Gibt es einen Grund warum Du die ufw auch als Docker Container installierst und die Firewall regeln für Adguard dort erstellst?

Kann man nicht einfach die ufw nutzen die auf dem System außerhalb von Docker installiert ist?

Danke & Grüße

Johannes

Johannes
Reply to  Daniel Wydler
03.05.2021 12:51

Ja, aber in Deinem Beispiel hat mean nun 2x ne UFW auf dem System. Die „normale“ und die in Docker…
Und nutzt Du dann die UFW in Docker auch für andere Docker Container? Ich glaube, dass solltest Du noch etwas präzisieren:)

Grüße

Johannes

Tumtrah
18.04.2021 19:40

Hi zusammen,

danke für die schnelle Hilfe bei meinen ersten beiden Fragen. Nun habe ich noch eine Frage.
Wenn eine Seite gesperrt wird bekomme ich folgende Meldung im Browser „Die Website ist nicht erreichbarmusterseite.com hat die Verbindung abgelehnt.Versuchen Sie Folgendes:

ERR_CONNECTION_REFUSED“

Da dies unschön ist, würde ich gerne die Seiten, die gesperrt werden auf eine eigene Seite weiterleiten wo z.b. drin steht: „Die Seite wird durch Adguard Home geblockt“ oder so ähnlich.

Ist das möglich?

Tumtrah
11.04.2021 20:31

Hallo zusammen,

ich habe eine falsche Seite ausversehen geblockt.
Wie kann ich generell manuell erstellte Filter komplett entfernen?

Martin
11.04.2021 12:04

Edit zu meinem letzten Kommentar:
War wirklich ein einfacher Denkfehler. Jetzt läuft alles 🙂 Vielen Dank für die tolle Anleitung.

Martin
Reply to  Daniel Wydler
11.04.2021 14:50

Hallo Daniel. Gerne. Der Fehler lag aber definitiv auf meiner Seite, kommt trotzdem gleich. Aus Sicht eines Linux-Noobs würde ich vielleicht etwas deutlicher darstellen, wo du Adguard installiert hast (lokal oder auf deinem Webspace bzw. Vserver. Da kommt auch etwas überraschend bzw. ohne weitere Erklärung oder Einführung die Subdomain adguard01 zu wydler.eu ins Spiel). In meinem Fall war das Problem, dass ich das Zertifikat eben für meinen Desec.io-Account angelegt hatte (den ich nur für diesen Zweck erstellt hatte) aber Adguard lokal lief, also auf 192.168.178.X. Als ich Adguard dann jedoch über xxx.dedyn.io aufgerufen hatte, klappte es auch mit dem Zertifikat.… Weiterlesen »

Martin
11.04.2021 11:29

Hallo Daniel, ich schreibe dir mal, weil ich mich für die Verschlüsselungseinstellungen an Deinem Beitrag orientiert habe. Vermutlich habe ich es mir irgendwo zu einfach gemacht oder einen Denkfehler: Ich habe AdGuard Home auf einem Raspi in meinem lokalen Netzwerk installiert. Für das Letsencrypt Zertifikat habe ich den DynDNS-Dienst desec.io verwendet. Einen eigenen Webserver o.ä. habe ich (bislang) nicht Adguard akzeptiert das erstellte Zertifikat. Der Browser zeigt aber „nicht sicher“ an. Das dürfte daran liegen, dass Adguard eben über eine lokale IP-Adresse und nicht dedyn.io aufgerufen wird. Als DNS-Server habe ich analog Deiner Anleitung nur solche mit DoT oder DNS… Weiterlesen »

Tumtrah
11.04.2021 00:39

Hi zusammen,

wie kriege ich es hin, dass ich z.B auf meinen Router mit der Adresse -> fritz.box zugreifen?
Ich habe in der Fritbox als DNS die IP vom Adguard Home eingetragen. Die lokale Namensauflösung funktioniert leider nicht mehr…

Hartmut
05.04.2021 17:34

Hallo Daniel, nachdem mein pihole verstorben war (SD Karte defekt) habe ich mit deiner Anleitung AdGuard installiert und werde mal sehen wie es damit läuft. Allerdins habe ich noch eine Frage
Ich stelle AdGuard im Netzwerk bereit indem ich es als DNS-Server inder Fritzbox eingetragen habe.
Müßte ich, damit alle Anfragen über AdGuard laufen, nicht auch ein IPv6 DNS in der Fritzbox eingetragen werden?

rar9
25.03.2021 13:31

Was muss man anstellen um auch noch Unbound als DNS mit Adguard zu integrieren?

Michael
21.02.2021 12:14

Hi,

interessant. Das mit dem dedizierten Blocken von Domains für Clients, wie z.B. Kinderschutz, funktioniert aber nur wenn der DNS Server auf jedem Gerät explizit eingegeben wurde da ja sonst alle Anfragen immer über den Router kommen. Oder täusche ich mich da?

Frank
20.02.2021 08:23

Danke für die Anleitung für die Installation von Adguard. Ich komme bei der nativen Installation der Firewallregeln nicht weiter. Im Terminal macht er noch die ufw SSH, aber ufw allow adguardhome 53/tcp kommt diese Fehlermeldung –> ERROR: Need ‚to‘ or ‚from‘ clause Leider find eich dazu nichts. Danke für einen Tipp.