Adblocking mit RaspberryPi und FreeBSD

Der Versuch einer möglichst stolperfreien Anleitung für einen RaspberryPi Model B als Adblocker auf einem FreeBSD-System.

Seit geraumer Zeit nervte RaspianOS auf einem ca. 10 Jahre alten RaspberryPi. Jedes Kernel-Update führte zu nicht bootbaren SD Cards. Locales wurden nicht erkannt oder akzeptiert. Der Workaround mit zwei identen Systemen, dem Kopieren des Bootloaders von Firmware-Masters und ein nachfolgendes -reconfigure waren zeitraubend und eben keine Lösung.

DietPi als alternatives OS vereinfacht Vieles. Um den Preis geringerer Kontrolle. Das Update der August-Version am Raspi endete mit einem blank screen in der bash.

Also keine Alternative.

FreeBSD statt RaspianOS

Der Start des RPIB Images von FreeBSD läuft relativ schnell (nicht alle SD cards werden erkannt, eine 16 GB card klappte nicht, eine 8 GB des selben Herstellers hingegen schon).

Anschließend können mit bsdconfig, das an raspiconfig angelehnt ist, grundlegende Einstellungen festgelegt werden. Die Anmeldung via ssh erfolgt, falls nicht später explizit für root zugelassen, mit der Standard User_in freebsd. Beispielsweise local_unbound_enable kann an dieser Stelle sofort aktiviert werden. Ebenso ist vorerst ein externer DNS Nameserver, wie der von dns3.digitalcourage.de notwendig.

Die richtige Zeit

Die korrekte Zeit ist für die Sicherheit im Betrieb UNIXoider Betriebssysteme essenziell. Allerdings fehlt sie bei einer frischen Installation. Die Tipps von /var/logs/paulooi.log helfen weiter. Zusätzlich kann die Angabe eines LAN-internen NTP-Servers (Modem, Router) sinnvoll sein:

# If a server loses sync with all upstream servers, NTP clients
# no longer follow that server. The local clock can be configured
# to provide a time source when this happens, but it should usually
# be configured on just one server on a network. For more details see
# http://support.ntp.org/bin/view/Support/UndisciplinedLocalClock
# The use of Orphan Mode may be preferable.
#
server IP-Des-LAN-NTP-Servers iburst

Unbound für mehr Privacy

Mit unbound werden DNS-Anfragen nicht oder nur, wenn keine Antwort verfügbar ist, an externe DNS-Server weiter geleitet. Wie vertrauenswürdig diese Antworten sind, wird mittels DNSSEC gewährleistet. DNSSEC braucht dafür aber eine verlässliche und korrekte Zeit. Siehe oben und siehe die Antwort weit unten hier: https://blog.des.no/2013/09/local-caching-resolver-in-freebsd-10/

Die erste Antwort in diesem Blog ist eine der zentralen: Externe DNS Nameserver in /etc/resolv.conf untergraben die Validierung von DNSSEC.

Hinweis: Eingefügte externe DNS werden durch die Ausführung eines Scripts auskommentiert: Die Reihenfolge
options edns0
nameserver 127.0.0.1

klappte bei nicht. Die Reihenfolge musste umgedreht werden:
nameserver 127.0.0.1
options edns0

Die weitere Konfiguration von unbound ist an vielen Stellen nachlesbar. Erwähnenswert

deutsch: https://obsigna.com/articles/1408390004.html (Der Abschnitt root-hints.zones ist leider rudimentär und führte zu Fehlerausgaben beim restart des local_unbound server.)
englisch: https://dan.langille.org/2015/07/19/configuring-unbound-on-freebsd-10-x/
https://revprez.github.io/posts/2017-09-09-local_unbound-on-freebsd-11.html

Unbound sollte nun korrekt laufen, wie ein drill command mit der Ausgabe ;; SERVER: 127.0.0.1 zeigen sollte.

void-zones-tool als adblocking tool

Für FreeBSD scheint es keine Implementierung von Pi Hole zu geben. Adblocking auf LAN-Ebene ist auch aber auch bei der Verwendung von UNIXen möglich.

Dafür muss im Router/Modem die fixe IP des RaspberryPi als lokaler DNS Nameserver notiert werden, wie auch bei Pi Hole btw.

Zwei Möglichkeiten.

Das Script adblock-unbound implementiert auf unbound-Ebene Adblock-Listen auf Basis von Pi Hole. Auf dem RasperryPi Model B allerdings mit geringem Erfolg. Ein Blick auf https://github.com/xpcom-bsd/adblock-unbound , ein fork, könnte lohnen, allerdings müssen vermutlich das build.sh und welche adblock-Listen verwendet werden sollen, modifiziert werden.

Schneller zum Ziel kommt man mit dem void-zones-tool, das die Aufnahme in das FreeBSD-Projekt geschafft hat.

Wie das Durchlesen der (gelösten) Issues https://github.com/cyclaero/void-zones-tools kommt es mit dem in die Jahre gekommenen RaspberryPi zu einem Problem mit dem Bus. Nicht bei der Installation des Binärpakets für armv6-Geräten via pkg install void-zones-tool, sondern beim Ausführen des Scripts void-zones-update.sh -> Bus error (core dumped).

Das Löschen der eventuell bereits installierten Binärdatei und die Neu-Installation via git macht den alten Raspi zu einem effizienten und unkomplizierten netzwerkweiten Adblocker.

Ein allerletzter Hinweis: Die automatisch generierte Datei resolvconf.conf sollte nun den Eintrag
resolv_conf=“/dev/null“ # prevent updating /etc/resolv.conf

aufweisen. Wie beschrieben, soll damit verhindert werden, dass bei zukünftigen Updates die /etc/resolv.conf wieder DNS-Anfragen nach extern weiter leitet.

Vorwärts. Und nicht vergesen: Jede verworfene, blockierte unnötige und unverlangte IP-Adressen-Auflösung spart Energie und reduziert den CO2-Ausstoß.

Abolish the klimaschädliche Werbe- und Tracking-Industrie.

Links:
https://www.nlnetlabs.nl/documentation/unbound/unbound.conf/
https://github.com/StevenBlack/hosts/wiki/Unbound
https://github.com/cyclaero/void-zones-tools