Eigenen DoT/DoH DNS Resolver betreiben

Ich beschreibe euch wie ihr einen eigenen DNS Resolver inklusive DoT und DoH für die Namensauflösung im Internet aufsetzen könnt.

So wurde auch der adminForge Service: dnsforge.de konfiguriert.

Aufbau des Setups:

  • dnsdist – DNS Loadbalancer: DNS Port 53, DoT Port 853, DoH Port 443
  • Pi-hole – Werbeblocker: 127.0.0.1:53
  • PowerDNS Recursor – auflösender Nameserver: 127.0.0.1:5300

Punkt 1: PowerDNS Repositories hinzufügen

Zuerst fügen wir die beiden Repositories von dnsdist und PowerDNS Recursor hinzu: https://repo.powerdns.com/

Beispiel Debian 11:

Punkt 2: Pakete installieren

Wir installieren die beiden Pakete.

Punkt 3: Pi-hole installieren

Wir starten mit der Installation des Werbeblockers Pi-hole.

Wenn ihr die eine vollständige Pi-hole Installation haben möchtet, mit Webserver und Webinterface, dann drückt die Installation mit ENTER durch.

Das Pi-hole Admin Interface ist dann unter http://YOUR-IP/admin/ zu erreichen. Ich empfehle eine zusätzliche Absicherung des Webinterfaces!

Punkt 4: dnsdist konfigurieren

Kopiert diesen Text in die Konsole um eine dnsdist Konfiguration zu erstellen.

Ersetzt dann eure IPv4 und IPv6 Adressen in den markieten Zeilen.
Für einen öffentlichen Resolver könnt ihr diese Befehle verwenden:

Punkt 5: Let’s Encrypt

Für Let’s Encrypt verwende ich gerne acme.sh, ihr könnt aber auch gerne eigene Zertifikate oder andere Let’s Encrypt Scripte verwenden.

Einen Ordner für die Zertifikate legen wir in folgender Datei fest, ich empfehle den bereits vorhandenen Ordner /etc/ssl/private.

Nun holen wir uns ein Zertifikat.

WICHTIG: Eure Domain sollte bereits jetzt einen A-Record mit der IP-Adresse eures Servers haben und auflösen!

Variante 1 (Pi-hole mit Webserver):

Variante 2 (Pi-hole ohne Webserver):

Punkt 6: dnsdist DoT und DoH aktivieren

In der /etc/dnsdist/dnsdist.conf entfernen wir die -- und ersetzen domain.de mit unserer Domain YOUR-DOMAIN.de aus dem Schritt zuvor.

Änderungen sollten in etwa so ausschauen:

Punkt 7: Pi-hole anpassen

Wir erweitern die Adlist.

Passen /etc/pihole/setupVars.conf unseren Wünschen an: Lokale IP-Adresse, Loopback Interface, deaktivieren Querry logging, stellen Pihole DNS auf unseren PowerDNS Recursor.

Um sicher zu gehen, dass Pi-hole bei einem Update diese Variable nicht löscht, erstellen wir eine neue Datei um das Interface lo zu binden.

Punkt 8: PowerDNS Recursor konfigurieren

Jetzt gehen wir das letzte Element der Kette an – dem Recursor von PowerDNS. Das kleine Programm schickt sämtliche DNS-Anfragen direkt an die DNS-Rootserver und behilft sich der vorinstallierten DNS-Rootserver Datei /usr/share/dns/root.hints.

Punkt 9: Dienste starten

Nun ist es an der Zeit die Pi-hole Konfiguration zu übernehmen

und die Dienste neu zu starten.

WICHTIG: dnsdist zuletzt starten da wir ein checkInterval von 5 Minuten eingestellt haben! Ansonsten ist der downstream Server 127.0.0.1:53 nicht direkt up.

Punkt 10: DNS Auflösung testen

Zu guter Letzt überprüfen wir ob alle Dienste auf den korrekten Ports lauschen.

Soll:
dnsdist/tcp: 53, 443, 853
dnsdist/udp: 53
pihole/tcp+udp: 127.0.0.1:53, ::1:53
pdns_recursor/tcp+udp: 127.0.0.1:5300

Wenn alles stimmt können wir die ersten Namensauflösungen testen.

DNS:

Das Tool dig ist unter Debian vorinstalliert. Tragt hinter dem @ die öffentliche IP-Adresse des Servers ein.

DNS over TLS:

Da PHP dank Pi-hole bereits installiert ist, nutzen wir am einfachsten dnstls zum testen. Anstelle domain.de nehmt bitte eure Domain.

DNS over HTTPS:

Über einen kleinen curl Aufruf kann man prüfen ob DoH funktioniert. Angefragt wird hier example.com (verschlüsselt dns=q80BAAABAAAAAAAAB2V4YW1wbGUDY29tAAABAAE).

 

UnterstützenDas Betreiben der Dienste, Webseite und Server machen wir gerne, kostet aber leider auch Geld.
Unterstütze unsere Arbeit mit einer Spende.
1

dominion

Linux Systemadministrator

Das könnte dich auch interessieren …

16 Antworten

  1. Rayman sagt:

    Hallo Dominion,

    erstmal vielen Dank für die Anleitung. Ich habe in den letzten Tagen einen Pi-Hole mit DNSCrypt-Proxy (also DoH- und DNSCrypt-Forwarder) aufgesetzt.

    Deshalb wundert es mich, dass Du empfiehlst, die /etc/dnsmasq.d/01-pihole.conf anzupassen.

    In dieser Datei stehen folgende Hinweise:
    „ANY CHANGES MADE TO THIS FILE AFTER INSTALL WILL BE LOST ON THE NEXT UPDATE“

    „IF YOU WISH TO CHANGE THE UPSTREAM SERVERS, CHANGE THEM IN: /etc/pihole/setupVars.conf“

    „ANY OTHER CHANGES SHOULD BE MADE IN A SEPARATE CONFIG FILE WITHIN /etc/dnsmasq.d/yourname.conf“

    Habe ich hier etwas falsch verstanden oder übersehen?

    • Dominion sagt:

      Hallo Rayman,

      ja richtig. Dort sollten auch keine Änderungen vorgenommen werden die nicht sowieso schon in /etc/pihole/setupVars.conf stehen.
      In /etc/dnsmasq.d/01-pihole.conf mache ich nur Änderungen, da pihole -g nicht zu 100% alles übernimmt.

      Also keine Angst, ist alles korrekt so. Die wichtigste Einstellung ist in /etc/dnsmasq.d/02-bind.conf festgehalten. Denn bind-interfaces ist nicht Bestandteil der Hauptkonfiguration und würde somit beim Update gelöscht werden.

      Gruß
      Dominion

  2. san sagt:

    How can you get both dnsdist and pihole-ftl run on same port 53 ?

    dnsdist/tcp: 53, 443, 853
    dnsdist/udp: 53
    pihole/tcp+udp: 127.0.0.1:53, ::1:53

  3. LibertyX82 sagt:

    Hi,

    ich habe das so umgesetzt, nur nutze ich unbound als Upstream DNS, soweit funktioniert alles.

    Nur in Pi-Hole erscheinen alle Queries als „localhost“ auf euren Statistiken sieht man aber die IP der Clients.

    • Dominion sagt:

      Hallo LibertyX82,

      was meinst du? „QUERY_LOGGING=false“ schaltet das Logging aus, wir beschreiben hier nirgends wie du die IP Adressen der Clients sehen kannst.

      Gruß
      Dominion

      • Dirk sagt:

        Hi,
        Nein das meinte ich nicht, der dnsdist gibt die Client IP nicht an den Pi-Hole weiter, daher sieht es für den aus, als kommen alle Queries vom Localhost.

        Ich habe die Lösung auch gefunden .) dnsdist hat da eine Funktion für.

        Eure no logging Policy ist natürlich richtig, da mein Pi-hole allerdings nicht öffentlich sondern ausschließlich für mich ist, will ich das schon sehen 🙂

  4. Kai sagt:

    Hallo Dominion,
    tolle Anleitung, hat bei mir auch sehr gut funktioniert. leider scheitere ich aber beim aktivieren den dnsdist Dienstes.
    Ich hab bestimmt irgendwo einen Fehler beim eintragen gemacht sehe ihn aber nicht.
    Als Fehlermeldung erhalte ich den Hinweis das meine eigetragene IP bereits in Verwendung ist:

    localhost dnsdist: Fatal error: binding socket to 217.xxx.xxx.xxx:443: Address already in use

    kannst du mir weiter helfen.
    Mit freundlichen Grüßen

    • Dominion sagt:

      Hallo Kai,

      evtl. läuft auf dem Port bereits ein Webserver?
      Prüf das bitte mit netstat -ntpl.
      Sollte das der Fall sein müsstest du dnsdist auf einer anderen IP laufen lassen, das wäre zumindest das einfachste.

      Gruß
      Dominion

      • Kai Diemer sagt:

        Super vielen Dank.
        Klar das es nicht funktioniert wenn Lighttpd (PiHole Webserver) den Port 443 für die Weboberfläche bereits belegt.
        Ansonsten wirklich eine sehr gute Anleitung, echt Top!
        Mit freundlichen Grüßen
        Kai

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert