Pihole mit eigenen recursive DNS Server (unbound) installieren (Raspberry Pi / etc.)

Grüzi liebe Freunde der gepflegten Unterhaltung,

hier findet ihr eine Anleitung, wie wir Pihole und unbound installieren z.b. auf einem Raspberry Pi der sich dafür super eignet. Aus eigener Erfahrung kann ich sagen: selbst der Pi der Gernation 1 reicht dafür völlig.

Kurze Frage: Ich weiß was Pi-hole ist aber was ist ein recursive DNS Servern bzw „unbound“ ?

Long Story short: normalerweise werden alle Internet Anfragen an ein DNS Server, z.b. Google 8.8.8.8 oder Cloudflare 1.1.1.1 gesendet (bzw oder auch den vom Provider automatisch zugewiesenen DNS Server). Ein DNS Server ist sowas wie ein Adressbuch für Computer wo zu einer Internet Adresse z.b. www.heise.de zur IP 193.99.144.80 nachgeschlagen kann.

Quelle:

https://www.giga.de/extra/internet/specials/was-ist-dns-dns-server-einfach-erklaert/

Hier mal 2 Gründe warum ihr einen eigenen DNS Server wollt:
Theoretisches Problem: Was ist wenn das Adresssbuch eine falsche Antwort liefert ?
Dann wäre die Seite über die URL nicht erreichbar. Genau das machen wir ja gezielt teilweise mit dem Pihole indem wir Webeadressen „umbiegen“
Ausserdem: Jede Internetanfrage die ihr macht gehr über den DNS Server mindestens 1x um nachzufragen wie die Adresse ist. Das heißt euer DNS Server weiß theoretisch eine Menge über euch.
weitere infos dazu gerne auch hier https://www.reddit.com/r/pihole/comments/dgc2io/what_is_unbound/

oder
https://docs.pi-hole.net/guides/dns/unbound/

Wovon ich hier ausgehen werde: Ihr habt bereits ein Raspberry OS (oder ähnliches) auf dem Zielsystem.

Schritt 1: Pihole installieren:
root@pihole:~# curl -sSL https://install.pi-hole.net | bash

Das wars auch schon, pihole ist installiert und kann eigentlich schon genutzt werden. Ggfs wollt ihr eigene blocklists noch einfügen, ist aber optional hier.
detailierte infos findet ihr u.a. hier:
https://www.heise.de/tipps-tricks/Pi-Hole-auf-dem-Raspberry-Pi-einrichten-so-geht-s-4358553.html

Schritt 2: unbound installieren
root@pihole:~# apt update && apt install unbound

hier noch die benötigte config für die /etc/unbound/unbound.conf.d/pi-hole.conf

server:
    # If no logfile is specified, syslog is used
    # logfile: "/var/log/unbound/unbound.log"
    verbosity: 0

    interface: 127.0.0.1
    port: 5335
    do-ip4: yes
    do-udp: yes
    do-tcp: yes

    # May be set to yes if you have IPv6 connectivity
    do-ip6: no

    # You want to leave this to no unless you have *native* IPv6. With 6to4 and
    # Terredo tunnels your web browser should favor IPv4 for the same reasons
    prefer-ip6: no

    # Use this only when you downloaded the list of primary root servers!
    # If you use the default dns-root-data package, unbound will find it automatically
    #root-hints: "/var/lib/unbound/root.hints"

    # Trust glue only if it is within the server's authority
    harden-glue: yes

    # Require DNSSEC data for trust-anchored zones, if such data is absent, the zone becomes BOGUS
    harden-dnssec-stripped: yes

    # Don't use Capitalization randomization as it known to cause DNSSEC issues sometimes
    # see https://discourse.pi-hole.net/t/unbound-stubby-or-dnscrypt-proxy/9378 for further details
    use-caps-for-id: no

    # Reduce EDNS reassembly buffer size.
    # IP fragmentation is unreliable on the Internet today, and can cause
    # transmission failures when large DNS messages are sent via UDP. Even
    # when fragmentation does work, it may not be secure; it is theoretically
    # possible to spoof parts of a fragmented DNS message, without easy
    # detection at the receiving end. Recently, there was an excellent study
    # >>> Defragmenting DNS - Determining the optimal maximum UDP response size for DNS <<<
    # by Axel Koolhaas, and Tjeerd Slokker (https://indico.dns-oarc.net/event/36/contributions/776/)
    # in collaboration with NLnet Labs explored DNS using real world data from the
    # the RIPE Atlas probes and the researchers suggested different values for
    # IPv4 and IPv6 and in different scenarios. They advise that servers should
    # be configured to limit DNS messages sent over UDP to a size that will not
    # trigger fragmentation on typical network links. DNS servers can switch
    # from UDP to TCP when a DNS response is too big to fit in this limited
    # buffer size. This value has also been suggested in DNS Flag Day 2020.
    edns-buffer-size: 1232

    # Perform prefetching of close to expired message cache entries
    # This only applies to domains that have been frequently queried
    prefetch: yes

    # One thread should be sufficient, can be increased on beefy machines. In reality for most users running on small networks or on a single machine, it should be unnecessary to seek performance enhancement by increasing num-threads above 1.
    num-threads: 1

    # Ensure kernel buffer is large enough to not lose messages in traffic spikes
    so-rcvbuf: 1m

    # Ensure privacy of local IP ranges
    private-address: 192.168.0.0/16
    private-address: 169.254.0.0/16
    private-address: 172.16.0.0/12
    private-address: 10.0.0.0/8
    private-address: fd00::/8
    private-address: fe80::/10
startet den Rechner danach neu und das wars zur installation schon. hier gibts keine fancy rückmeldung, es wird einfach installiert. damit wäre unbound an sich schon arbeitsfähig.

wollt ihr testen über welchen DNS Server die anfragen kommen ? okay:
rootdig pi-hole.net @127.0.0.1 -p 5335

root@pihole:~# dig torstenzimmermann.de @127.0.0.1 -p 5335

das ergebnis sieht dann so aus:

; <<>> DiG 9.16.33-Raspbian <<>> torstenzimmermann.de @127.0.0.1 -p 5335
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 10068
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
;; QUESTION SECTION:
;torstenzimmermann.de. IN A

;; ANSWER SECTION:
torstenzimmermann.de. 97 IN A 213.136.81.240

;; Query time: 0 msec
;; SERVER: 127.0.0.1#5335(127.0.0.1)
;; WHEN: Sun Dec 18 10:28:34 CET 2022
;; MSG SIZE rcvd: 65

wie ihr seht hat 127.0.0.1 geantwortet.

Ich würde zusätzlich noch gerne ein cronjob einrichten der in regelmässigen abständen die „root.hints“ von den internic DNS Servern abfragt und bei sich aktualisiert, an sich sollten diese aber vom paket unbound kommen:

root@pihole:~# crontab -e

55 3 * * 7 /usr/bin/wget https://www.internic.net/domain/named.root -qO- | sudo tee /var/lib/unbound/root.hints

Das bedeutet, das ihr jeden Sonntag um 3:55 die Daten aktualisiert. Euch passt die Zeit nicht ? Kein Problem, klickt euch euren eigenen cronjob zusammen:

https://www.bennetrichter.de/tools/crontab-generator/

der auszuführende Befehl ist im cronjob ist:
wget https://www.internic.net/domain/named.root -qO- | sudo tee /var/lib/unbound/root.hints

wobei hier vieleicht nochmal angemerkt werden sollte: so oft ändern sich die root server von denic nicht. 1x im monat wäre auch mehr als ausreichend.

Jetzt müssen wir nur noch Pihole selbst dazu bringen den unbound zu nutzen, das geht wie folgt:

Im „Pihole“ bei „Settings“ die „DNS“ auswählen und dort bei „Custom DNS 1“ den wert „127.0.0.1#5335“ ein.

Und das wars: ihr seid euer eigener DNS Server, keine dNS abfragen an Telekom, Google, Cloudflare oder was auch immer.

Frohe Weihnachten und guten Rutsch

Euer Rudi