PiHole mit DNSCrypt-Proxy und ODoH

8 Oktober 2022 - Lesezeit: 10 Minuten

Ich nutze meinen Raspberry Pi ja nun schon eine ganze Zeit mit PiHole und bin damit auch sehr zufrieden. Allerdings habe ich mich auch nebenher mit verschlüsselten DNS-Anfragen beschäftigt was mich dazu bewogen hat, die Möglichkeiten des PiHole zu erweitern.

Dabei ist rausgekommen, dass man seine DNS-Anfragen nicht nur per PiHole filtern lassen, um nervige Werbung und Tracker loszuwerden, sondern über DNSCrypt-Proxy auch anonymisieren kann.

Also habe ich mich rangesetzt und mir die Möglichkeiten genauer angeschaut. DNSCrypt-Proxy kann u.a. DNS-over-HTTPS, DNS-over-TLS, DNSCrypt und Oblivious DNS-over-HTTPS, wobei ich speziell ODoH sehr interessant fand und mir dies genauer anschauen wollte.

Was ist Oblivious DNS-over-HTTPS?

Kurz und knapp gesagt, werden eure DNS-Anfragen an einen Relay gesendet, was eure Absenderadresse kennt. Dieses Relay wiederum sendet mit seiner öffentlichen IP die DNS-Anfrage an einen Resolver und dieser fragt die gewünschte Domain dann bei öffentlichen DNS-Servern an. Die Antwort gibt der Resolver dann an das Relay zurück und dieses sendet euch dann die Antwort.

Bedeutet, dass die öffentlichen DNS-Server eure IP-Adresse nicht kennen und daraus auch kein Profil bilden können. Hinzu kommt noch, dass die Anfrage per HTTPS-Verbindung verschlüsselt ist, so dass diese auch nicht mitgelesen werden kann.

DECATEC hat dies sehr genau und mit guten grafischen Darstellungen beschrieben.

Einrichtung von PiHole und ODoH

Um es kurz zu machen... Es gibt mehr als genug Anleitungen, wie man PiHole installiert und konfiguriert. U.a. hat DECATEC eine derartige Anleitung veröffentlicht, weswegen ich mir das hier spare.

Selbiges gilt für die Einrichtung von ODoH mit Hilfe von DNSCrypt-Proxy. Auch hier hat DECATEC eine sehr gute Anleitung geschrieben, mit deren Hilfe man schnell und unkompliziert DNSCrypt-Proxy einrichten kann.

Ich möchte an dieser Stelle eher auf bei mir entstandene Probleme eingehen.

Konfiguration von PiHole und DNSCrypt-Proxy

PiHole

Die im PiHole nach der Installation hinterlegten AdLists sind zwar gut, aber mit ein bisschen Suche kann man PiHole noch deutlich verbessern. So habe ich explizit nach der Möglichkeit gesucht, alle Tracker und Telemetriedaten abzufangen.

Dabei rausgekommen ist eine lange Liste mit aktuell 65 AdLists und rund 11.500.000 gesperrten DNS-Einträgen. Um den Beitrag von der Länge nicht zu sprengen, habe ich euch die Liste bei GitHub hinterlegt. Ich pflege diese Liste auch regelmäßig, wenn ich Server hinzufüge oder entferne (z.B. weil diese nicht mehr funktionieren).

Außerdem musste ich feststellen, dass bei deaktiviertem IPv6 im Heimnetz PiHole manchmal komisches Verhalten an den Tag legt. So haben z.B. die Radiosender bei Apple Music immer wieder massive Aussetzer gehabt mit der Meldung, dass der Server nicht gefunden werden konnte. Lustigerweise konnte ich Playlists und einzelne Songs aber ohne Probleme hören.

Die Lösung war, einfach den Eintrag Custom 3 (IPv6) unter Settings -> DNS zu deaktivieren und nur Custom 1 (IPv4) aktiviert zu lassen. Wenn nur IPv4 aktiviert ist, gab es mit Apple Music überhaupt keine Probleme mehr.

DNSCrypt-Proxy

Im Bereich DNSCrypt-Proxy waren meine Anpassungen der von DECATEC bereitgestellten Konfiguration deutlich größer.

Meine aktuelle Konfiguration mit ODoH, DNSSec, u.a. Einstellungen findet ihr bei GitHub.

Im Folgenden kurz meine Anpassungen:

##################################

#         Global settings        #

##################################

server_names = ['odoh-cloudflare']

-------

## Require servers (from remote sources) to satisfy specific properties

# Use servers reachable over IPv4

ipv4_servers = true

# Use servers reachable over IPv6 -- Do not enable if you don't have IPv6 connectivity

ipv6_servers = false ## Habe ich auf Grund meiner Apple Music Probleme deaktiviert

# Use servers implementing the DNSCrypt protocol

dnscrypt_servers = true

# Use servers implementing the DNS-over-HTTPS protocol

doh_servers = true

# Use servers implementing the Oblivious DoH protocol

odoh_servers = true

-------

## Require servers defined by remote sources to satisfy specific properties

# Server must support DNS security extensions (DNSSEC)

require_dnssec = true

# Server must not log user queries (declarative)

require_nolog = true

# Server must not enforce its own blocklist (for parental control, ads blocking...)

require_nofilter = true

# Server names to avoid even if they match all criteria

disabled_server_names = []

-------

## Load-balancing strategy: 'p2' (default), 'ph', 'p<n>', 'first' or 'random'

## Randomly choose 1 of the fastest 2, half, n, 1 or all live servers by latency.

## The response quality still depends on the server itself.

lb_strategy = 'p2'

## Set to `true` to constantly try to estimate the latency of all the resolvers

## and adjust the load-balancing parameters accordingly, or to `false` to disable.

## Default is `true` that makes 'p2' `lb_strategy` work well.

lb_estimator = true

-------

## Bootstrap resolvers

##

bootstrap_resolvers = ['9.9.9.11:53', '1.1.1.1:53'] ## Hier ist im Standard Google eingetragen. Quad9 und Cloudflare sind daher sinniger

-------

## Address and port to try initializing a connection to, just to check

## if the network is up. It can be any address and any port, even if

## there is nothing answering these on the other side. Just don't use

## a local address, as the goal is to check for Internet connectivity.

## On Windows, a datagram with a single, nul byte will be sent, only

## when the system starts.

## On other operating systems, the connection will be initialized

## but nothing will be sent at all.

netprobe_address = '9.9.9.9:53' ## Ebenfalls im Standard Google

-------

#########################

#        Servers        #

#########################

[sources]

  ### An example of a remote source from https://github.com/DNSCrypt/dnscrypt-resolvers

  [sources.public-resolvers]

    urls = ['https://raw.githubusercontent.com/DNSCrypt/dnscrypt-resolvers/master/v3/public-resolvers.md', 'https://download.dnscrypt.info/resolvers-list/v3/public-resolvers.md', 'https://ipv6.download.dnscrypt.info/resolvers-list/v3/public-resolvers.md']

    cache_file = 'public-resolvers.md'

    minisign_key = 'RWQf6LRCGA9i53mlYecO4IzT51TGPpvWucNSCh1CBM0QTaLn73Y7GFO3'

    refresh_delay = 72

    prefix = ''

  ### Anonymized DNS relays

  [sources.relays]

    urls = ['https://raw.githubusercontent.com/DNSCrypt/dnscrypt-resolvers/master/v3/relays.md', 'https://download.dnscrypt.info/resolvers-list/v3/relays.md', 'https://ipv6.download.dnscrypt.info/resolvers-list/v3/relays.md']

    cache_file = 'relays.md'

    minisign_key = 'RWQf6LRCGA9i53mlYecO4IzT51TGPpvWucNSCh1CBM0QTaLn73Y7GFO3'

    refresh_delay = 72

    prefix = ''

  ### ODoH (Oblivious DoH) servers and relays

  [sources.odoh-servers]

    urls = ['https://raw.githubusercontent.com/DNSCrypt/dnscrypt-resolvers/master/v3/odoh-servers.md', 'https://download.dnscrypt.info/resolvers-list/v3/odoh-servers.md', 'https://ipv6.download.dnscrypt.info/resolvers-list/v3/odoh-servers.md']

    cache_file = 'odoh-servers.md'

    minisign_key = 'RWQf6LRCGA9i53mlYecO4IzT51TGPpvWucNSCh1CBM0QTaLn73Y7GFO3'

    refresh_delay = 24

    prefix = ''

  [sources.odoh-relays]

    urls = ['https://raw.githubusercontent.com/DNSCrypt/dnscrypt-resolvers/master/v3/odoh-relays.md', 'https://download.dnscrypt.info/resolvers-list/v3/odoh-relays.md', 'https://ipv6.download.dnscrypt.info/resolvers-list/v3/odoh-relays.md']

    cache_file = 'odoh-relays.md'

    minisign_key = 'RWQf6LRCGA9i53mlYecO4IzT51TGPpvWucNSCh1CBM0QTaLn73Y7GFO3'

    refresh_delay = 24

    prefix = ''

-------

################################

#        Anonymized DNS        #

################################

routes = [

   { server_name='odoh-cloudflare', via=['odohrelay-crypto-sx', 'odohrelay-surf'] }

    ]

## Skip resolvers incompatible with anonymization instead of using them directly

skip_incompatible = true

Der Bereich "DNS cache" ist etwas, wo sich die Geister scheiden können. Grundsätzlich hält PiHole ja einen Cache vor. Wozu also im DNSCrypt-Proxy auch noch einen Cache vorhalten?

Ich habe tatsächlich keinen Unterschied bei den Latenzen feststellen können, wenn man cache = false einstellt. Ich hab den Cache trotzdem wieder aktiviert da ich der Meinung bin, dass es nicht schaden kann wenn DNSCrypt-Proxy ebenfalls einen Cache vorhält.

###########################

#        DNS cache        #

###########################

## Enable a DNS cache to reduce latency and outgoing traffic

cache = true

Wenn man alle Schritte aus den Anleitungen von DECATEC durchgeführt hat, kann man über sudo systemctl status dnscrypt-proxy schnell rausfinden, welcher DNS-Server für ODoH genutzt wird:

User@Server:/opt/dnscrypt-proxy$ sudo systemctl status dnscrypt-proxy

dnscrypt-proxy.service - Encrypted/authenticated DNS proxy

     Loaded: loaded (/etc/systemd/system/dnscrypt-proxy.service; enabled; vendor preset: enabled)

     Active: active (running) since Sat 2022-10-08 17:53:05 CEST; 32s ago

   Main PID: 41694 (dnscrypt-proxy)

      Tasks: 9 (limit: 4429)

     Memory: 4.7M

        CPU: 568ms

     CGroup: /system.slice/dnscrypt-proxy.service

             └─41694 /opt/dnscrypt-proxy/dnscrypt-proxy -config dnscrypt-proxy.toml

Oct 08 17:53:10 Server dnscrypt-proxy[41694]: [2022-10-08 17:53:10] [NOTICE] Anonymizing queries for [dnscrypt-de-blahdns-ipv4] via [anon-cs-dus4]

Oct 08 17:53:10 Server dnscrypt-proxy[41694]: [2022-10-08 17:53:10] [NOTICE] [dnscrypt-de-blahdns-ipv4] OK (DNSCrypt) - rtt: 32ms

Oct 08 17:53:11 Server dnscrypt-proxy[41694]: [2022-10-08 17:53:11] [NOTICE] Anonymizing queries for [odoh-koki-ams] via [odohrelay-surf]

Oct 08 17:53:12 Server dnscrypt-proxy[41694]: [2022-10-08 17:53:12] [NOTICE] [odoh-koki-ams] OK (ODoH) - rtt: 29ms

Oct 08 17:53:12 Server dnscrypt-proxy[41694]: [2022-10-08 17:53:12] [NOTICE] Sorted latencies:

Oct 08 17:53:12 Server dnscrypt-proxy[41694]: [2022-10-08 17:53:12] [NOTICE] -    25ms odoh-cloudflare

Oct 08 17:53:12 Server dnscrypt-proxy[41694]: [2022-10-08 17:53:12] [NOTICE] -    29ms odoh-koki-ams

Oct 08 17:53:12 Server dnscrypt-proxy[41694]: [2022-10-08 17:53:12] [NOTICE] -    32ms dnscrypt-de-blahdns-ipv4

Oct 08 17:53:12 Server dnscrypt-proxy[41694]: [2022-10-08 17:53:12] [NOTICE] Server with the lowest initial latency: odoh-cloudflare (rtt: 25ms)

Oct 08 17:53:12 Server dnscrypt-proxy[41694]: [2022-10-08 17:53:12] [NOTICE] dnscrypt-proxy is ready - live servers: 3

Nun nutzt man die Vorteile von PiHole und gleichzeitig bleiben die DNS-Anfragen vor neugierigen Blicken und Tracking geschützt.

Ich bin von der Konfiguration begeistert und kann dies nur jedem empfehlen.

Nachtrag

Ich musste bis auf Cloudflare alle anderen Resolver entfernen, da damit wieder die Probleme mit Apple Music aufgetreten sind.

Über

Hier soll es um Technik, Politik und meine persönliche Meinung gehen. Da ich meinen RaspberryPi mit PiHole sehr mag und daran gerne bastle, versuche ich hier auch immer Neuigkeiten darum zu teilen.

Politisch links-neutral und ich glaube fest daran, dass alle Menschen einfach nur Menschen sind.