UDM Pro 3: pihole im Container installieren - Teil 3

Um die Sicherheit bei der Namensauflösung weiter zu verbessern, soll auf dem Pi-hole auch ein unbound DNS-Resolver eingerichtet werden. Dabei kann man sich im Wesentlichen an die Anleitung von pi-hole.net orientieren (https://docs.pi-hole.net/guides/dns/unbound/). Dort wird auch ausführlich erklärt, welche Vor- und Nachteile ein lokaler Resolver hat.

Damit die hier beschriebene Unbound integration gelingt, muss vorher ein entsprechender nspawn-Container mit Pi-hole eingerichtet werden. Anleitungen dafür findet sich im ersten und im  zweiten Teil dieser Artikelserie.

Ist man per SSH mit der UDM Pro verbunden, wird zunächst eine Shell im Container geöffnet:

machinectl shell pihole

01| Unbound installieren

Am einfachsten wird unbound mit dem Debian Paket Manager apt installiert. Dann werden automatisch auch die erforderlichen Abhängigkeiten mit installiert.

apt install unbound

02| Unbound konfigurieren

Jetzt muss noch die Konfiguration von unbound angepasst werden. Dazu wird die Datei /etc/unbound/unbound.conf.d/pi-hole.confmit folgendem Inhalt angelegt;

cat <<EOF >> /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
EOF

03| dnsmasq anpassen

Wenn Pi-hole den lokalen unbound Resolver nutzt, so erfolgt dies über da Loopback-Interface lo. In der Standardeinstellung können dabei größere DNS-Pakete (4096 Bytes) versendet werden als über ein normales Netzwerkinterface (1232 Bytes). Das kann zu Problemen führen. Daher sollte für die lokalen DNS-Requests an unbound die maximale Paket-Größe in der dnsmasq-Konfiguration angepasst werden:

cat <<EOF >> /etc/dnsmasq.d/99-edns.conf
edns-packet-max=1232
EOF

04| openresolv deaktivieren

Für den Fall, dass unter Debian das openresolv installiert ist, so ist sicherzustellten, dass an der resolv.conf keine automatischen Änderungen durch den unbound-resolvconf.service vorgenommen werden. Ansonsten kann es dazu kommen, das die lokale Namensauflösung auf dem Pi-hole Container nicht mehr richtig funktioniert. Dazu ist zunächst der unbound-resolvconf.service zu deaktivieren:

sudo systemctl disable --now unbound-resolvconf.service

Für den Fall, dass der unbound-resolvconf.service manuell oder von einem anderen Prozess aufgerufen wird, sollte auch die resolvconf.conf angepasst werden, damit die Datei /etc/unbound/unbound.conf.d/resolvconf_resolvers.conf nicht neu erzeugt wird: 

sed -Ei 's/^unbound_conf=/#unbound_conf=/' /etc/resolvconf.conf
rm /etc/unbound/unbound.conf.d/resolvconf_resolvers.conf

Damit die Konfiguration aktiv wird muss der unbound Service neu gestartet werden:

systemctl restart unbound

05| Testen

Jetzt sollte die Namensauflösung über unbound schon funktionieren. Das kann mit dig einfach überprüft werden:

dig nerdig.es @127.0.0.1 -p 5335

Auch DNSSEC Validierung sollte mit unbound funktionieren. Das Kommando 

dig fail01.dnssec.works @127.0.0.1 -p 5335

sollte zu einer Fehlermeldung führen oder zumindest keine Antwort zurückliefern, da es einen ungültigen DNSSEC-Record hat. Die Abfrage 

dig dnssec.works @127.0.0.1 -p 5335

sollte dagegen problemlos funktionieren.

06| Pi-hole konfigurieren

In der Pi-hole Admin-Oberfläche muss der lokale unbound-Server 127.0.0.1#5353 als Upstream DNS Server unter  Settings > DNS eingetragen werden:

Unbound als Upstream DNS konfigurieren

Herzlichen Glückwunsch: Pi-hole nutzt jetzt den lokalen Resolver um externe DNS-Namen aufzulösen.

07| Links

[01] unifios-utilities - How to Create a Custom Container on UnifiOS 3.x+
[02] unifios-utilities - How to Install Pi-Hole in Container
[03] Pi-hole 
[04] Pi-hole - Unbound

Kommentare

PostadresseE-MailadresseFestnetzMobiltelefonSMS/SignalThreemaTwitter DirektnachrichtFAXWeb Page