Obwohl es diesen Mini-Computer schon seit geraumer Zeit gibt, bin ich erst vor kurzem auf ihn aufmerksam geworden und bin über die Einsatzmöglichkeiten erstaunt.
Ich habe aktuell zwei "Projekte", einen "MP3-Server" für die Stereoanlage sowie einen eigenen lokalen DNS-Server. Hier geht es um den DNS-Server, primär als Filter gegen Werbung und Tracking im internen Netzwerk. Grundlage ist das Projekt "Pi-Hole®". Es gibt auch eine Dokumentation dazu.
Mein Heimnetzwerk läuft unter 192.168.178.x. Der Router, eine FritzBox 7560 als Standard-Gateway, auch als Zeitserver und als (weiterer) DNS-Server ist die 192.168.178.1.
Ich verwende hier einen Raspberry Pi 3B in dem originalen weiß/himbeerfarbenen Gehäuse und eine Micro-SD-Karte Sandisk Ultra 32GB (SDHC, UHS-1, Class 10) sowie das originale Raspberry-Pi-Netzteil in Weiß. Das ist eine ungefähre Investition von 65 Euro (Stand 01/2019).
dtoverlay=pi3-disable-wifi
dtoverlay=pi3-disable-bt
arm_freq_min=500
sdram_freq_min=200
gpu_freq_min=100
temp_limit=75
never_over_voltage=1
NTP=192.168.178.1
FallbackNTP=0.de.pool.ntp.org 1.de.pool.ntp.org
Nun die Installation des Pi-Hole starten, dabei wird ein umfangreiches Installationsmenu durchlaufen (auch in der SSH):
Mit der bis hierhin beschriebenen Konfiguration hat man einen hervorragend funktionierenden Werbefilter, der zwischen 10% und 50% Traffic schon vor den Clients im Heimnetz filtert. Wenn man noch einen Schritt weitergehen möchte, kann man (ebenfalls auf demselben Raspberry Pi) einen eigenen DNS-Server aufsetzen, den Pi-Hole zuerst anfragt und der erst wenn er keine Antwort kennt, externe DNS-Server abfragt. Dies erhöht die Sicherheit noch einmal einen Schritt, obwohl dadurch (vor allem anfangs) die Netzwerkabfragen etwas verlangsamt. Dieser weitere Schritt wird auch in einer speziellen Pi-Hole-Dokumentation auf Basis des DNS-Servers Unbound separat erklärt.
Hier ebenfalls Schritt für Schritt:
Auf Debian 9 wird die Version 1.6.0 von Unbound installiert, für die es ein vorgefertigtes Installationspaket gibt, die keine Verbindung mittels DNS over TLS zu externen DNS-Servern über Port 853 herstellen kann. Mit Version 1.9.0, die aber nur für Debian 10 vorliegt, kann dagegen DNS over TLS und damit eine verschlüsselte DNS-Übertragung verwendet werden.
server:
# If no logfile is specified, syslog is used
# logfile: "/var/log/unbound/unbound.log"
verbosity: 0
# Port for Usage in Pi-Hole as 127.0.0.1#5353 - port 5353 is used by mDNS, for example Avahi inside Openmediavault, recommended is port 5335
port: 5335
do-ip4: yes
do-udp: yes
do-tcp: yes
# May be set to yes if you have IPv6 connectivity
do-ip6: no
# Use this only when you downloaded the list of primary root servers!
root-hints: "/var/lib/unbound/root.hints"
tls-cert-bundle: "/etc/ssl/certs/ca-certificates.crt"
# Trust glue only if it is within the servers 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
# TTL bounds for cache
cache-min-ttl: 3600
cache-max-ttl: 86400
# 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
num-threads: 1
# Cache Memory rrset should have double size as msg
msg-cache-size: 50m
rrset-cache-size: 100m
# Accelerate UDP with multithreading
so-reuseport: yes
# Ensure kernel buffer is large enough to not loose 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
access-control: 192.168.0.0/16 allow
forward-zone:
name: "."
#Folgende Zeile aktivieren für Version 1.9.0, sowie für Version 1.9.0 das '@53' ersetzen durch '@853', das ist der jeweilige Port ohne bzw. mit DNSSEC
#forward-tls-upstream: yes
forward-addr: 1.1.1.1@53#one.one.one.one
forward-addr: 1.0.0.1@53#one.one.one.one
forward-addr: 84.200.69.80@53#resolver1.dns.watch
forward-addr: 84.200.70.40@53#resolver2.dns.watch
forward-addr: 46.182.19.48@53#dns2.digitalcourage.de
forward-addr: 9.9.9.9@53#dns.quad9.net
forward-addr: 8.8.8.8@53#dns.google
Nun müsste alles laufen wie zuvor, nur dass (seit Aktivierung des Unbound) das erste Mal aufgerufene Seiten etwas länger benötigen, bis sie geladen werden. Dies ist ein gutes Zeichen dafür, dass Unbound arbeitet!
Auf dem "einfachen Weg" haben wir die Standardversion von Unbound installiert, für die es ein vorgefertigtes Installationspaket gibt. Leider wird damit (unter Debian 9) nur Version 1.6.0 installiert, die keine Verbindung mittels DNS over TLS zu externen DNS-Servern über Port 853 herstellen kann.
Links für den schwierigen Weg:
Ich habe sehr lange suchen und probieren müssen, um es zu schaffen, auf dem Raspberry Pi "from scratch" die allerneueste Unbound-Version 1.9.1 (vom 11.3.2019) installieren und aktivieren zu können:
server:
# If no logfile is specified, syslog is used
# logfile: "/var/log/unbound/unbound.log"
verbosity: 0
username: ""
chroot: ""
# Port for Usage in Pi-Hole as 127.0.0.1#5353 - port 5353 is used by mDNS, for example Avahi inside Openmediavault, recommended is port 5335
port: 5335
do-ip4: yes
do-udp: yes
do-tcp: yes
# May be set to yes if you have IPv6 connectivity
do-ip6: no
# Use this only when you downloaded the list of primary root servers!
root-hints: "/var/lib/unbound/root.hints"
tls-cert-bundle: "/etc/ssl/certs/ca-certificates.crt"
# Trust glue only if it is within the servers 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
# TTL bounds for cache
cache-min-ttl: 3600
cache-max-ttl: 86400
# 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
num-threads: 1
# Cache Memory rrset should have double size as msg
msg-cache-size: 50m
rrset-cache-size: 100m
# Accelerate UDP with multithreading
so-reuseport: yes
# Ensure kernel buffer is large enough to not loose 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
access-control: 192.168.0.0/16 allow
forward-zone:
name: "."
forward-tls-upstream: yes
forward-addr: 1.1.1.1@853#one.one.one.one
forward-addr: 1.0.0.1@853#one.one.one.one
forward-addr: 84.200.69.80@853#resolver1.dns.watch
forward-addr: 84.200.70.40@853#resolver2.dns.watch
forward-addr: 46.182.19.48@853#dns2.digitalcourage.de
forward-addr: 9.9.9.9@853#dns.quad9.net
forward-addr: 8.8.8.8@853#dns.google
Nun müsste alles laufen wie zuvor, nur dass (seit Aktivierung des Unbound) das erste Mal aufgerufene Seiten etwas länger benötigen, bis sie geladen werden. Dies ist ein gutes Zeichen dafür, dass Unbound arbeitet!
Unter Heimnetz / Netzwerkeinstellungen / Weitere Einstellungen / IPV4-Einstellungen unter den DHCP-Adressbereichen die Adresse des Pi-Hole (hier 192.168.178.2) als lokaler DNS-Server eintragen. Damit verteilt das DHCP den lokalen DNS-Server automatisch mit im Netz und man muss nichts an den Clients einstellen!
WPAD steht für Web Proxy Autodiscovery Protocol ist ein Protokoll, mit dem Web-Clients zu verwendende Web-Proxys innerhalb eines Computernetzwerkes automatisch finden können, indem eine Proxy autoconfiguration-Datei unter einer URL gespeichert wird. Dazu legt man eine Datei wpad.dat sowie proxy.pac (jeweils mit identischem Inhalt) an, um solche Client-Anfragen korrekt zu handhaben und um Missbrauch vorzubeugen.
Man sollte so vorgehen:
So werden dann zahlreiche Anfragen im internen Netzwerk nach der wpad.dat nicht (erfolglos) nach außen geleitet, sondern werden intern im Pi-Hole korrekt beantwortet.
Nicht nur das Pi-Hole, sondern auch das darunterliegende Raspbian sollte regelmäßig aktualisiert werden.
Raspbian aktualisiert man mit:
Pi-Hole aktualisiert man einfach mit pihole -up.
Unbound muss man manuell aktualisieren, weil man es auch manuell installiert (kompiliert etc.) hat. Dazu wiederholt man die wesentlichen Schritte oben. Beispielsweise wurde Anfang März 2019 die Version 1.9.1 bereitgestellt. Außerdem gibt es auch ein neues Bootscript. Man führt durch:
Seit Anfang Juli 2019 gibt es die neue Systemversion von Debian, die Raspbian zugrundeliegt. Obwohl es nicht empfohlen wird "in-place" von einer großen Version zur anderen zu wechseln und lieber frisch anzufangen, habe ich es trotzdem probiert und es ist geglückt. Nach dem Systemupdate musste ich noch Unbound neu installieren (siehe oben). Weitere Anpassungen waren nicht nötig.
Ich bin so vorgegangen:
Bei den zwischendrin auftretenden Fragen habe ich SMB aktualisieren lassen, die Gruppe und den Benutzer "unbound" bestehen lassen, die Dienste automatisch starten lassen, lighthttpd in der alten Version belassen und dhcpd aktualisieren lassen.
Danach habe ich Unbound entfernt und neu installiert in Version 1.9.2 (siehe oben die Anleitung für 1.9.1, entsprechend anpassen).
Insgesamt hat die Prozedur etwa 1 Stunde gedauert.
Aktuell kann ich keine negativen Effekte feststellen, aber das System läuft erst seit kurzer Zeit.
Aus mir unbekannten Gründen hat Unbound (mittlerweile aktualisiert auf Version 1.9.6) unter Debian 10 aufgehört zu funktionieren. Ich habe die Ursache trotz intensiver Suche nicht gefunden.
Aus diesem Grund habe ich Debian 10 ganz neu aufgesetzt, dann Pi-Hole neu installiert und dann Version 1.9.0 über apt, d.h. über den oben beschriebenen "einfachen Weg" installiert. Das System lief auf Anhieb wieder.