Werbeblocker und sicheres DNS mit einem SBC Pi

 In Internet

Seit längerem liegt auf meinem Schreibtisch ein ungenutzter Embedded-Einplatinencomputer (SBC) vom Typ Banana Pi M2+. Es ist an der Zeit für eine neue Aufgaben, welche dieses kleine Gerät meistern soll. Das Ziel wird es sein die Internetsicherheit zu erhöhen und diesen als Werbeblocker sowie sicheren DNS-Resolver zu nutzen. Dafür kommen als Software Pi-Hole sowie Unbound und als Betriebssystem CentOS zum Einsatz.

Mit Pi-Hole lässt sich bereits auf DNS-Ebene Werbe- und Tracking-Seiten mit unterschiedlichen Blocklisten filtern. Ein idealer Werbeblocker und das nicht nur für zu Hause. Unbound sorgt als DNS-Resolver und DNS-Cache dafür, dass Anfragen und Antworten für die DNS-Namensauflösung sicher an das eigentliche Ziel gelangen. Für Sicherheit sorgen DNSSEC und eine verschlüsselte Kommunikation (DNS-over-TLS) zwischen Unbound und den DNS-Forwarder.

Was ist DNSSEC? Mit DNSSEC wird sichergestellt, dass die Antwort eines Nameservers echt und komplett sind. Dank der Signierung von DNS-Antworten werden manipulierte Daten erkannt und können so abgewiesen werden.

Was ist DNS-over-TLS (DoT)? Hierbei handelt es sich um ein Protokoll zur verschlüsselten Übertragung der DNS-Namensauflösung. DNS-Informationen sind dadurch vor Manipulationen und unbefugtem Mitlesen geschützt. Die meisten DNS-Server mit DoT-Unterstützung verwenden hier den standardisierten Port 853.

Nun lasst uns loslegen!

Folgende Voraussetzungen sind zu erfüllen

  • Ein Embedded-Einplatinencomputer (SBC). Hierfür gut geeignet sind Raspberry Pi, Banana Pi oder Orange Pi.
  • Eine SD-Karte mit mindestens Class10 und 8 GB Größe.
  • Das CentOS ISO Image für die Armhfp Architektur (Download: http://isoredirect.centos.org/altarch/7/isos/armhfp/)
  • Für Windows-Anwender:
    Um das ISO Image auf die SD-Karte zu übertragen, wird hierfür das Tool Etcher benötigt (Download: https://www.balena.io/etcher/)

 

Vorbereitungen

Lade das CentOS ISO Image (CentOS-Userland-7-armv7hl-generic-Minimal) und das Tool Etcher herunter und installiere Etcher unter Windows. In Etcher wähle das ISO Image aus und übertrage es auf die leere SD-Karte. Im Anschluss muss nur mehr die SD-Karte in das Pi eingeschoben werden. Das Pi sollte hier bereits automatisch von der SD-Karte starten.

Die Bootstrap-Software U-Boot war für meinen Banana Pi M2+ nicht zwingend erforderlich. Ist doch eine Installation von U-Boot gewünscht, muss dies über ein anderes Linux System direkt auf die SD-Karte erfolgen.

Erste Schritte und Anpassungen

Nach dem Systemstart ist eine Anmeldung mit dem Benutzer root und dem Passwort centos problemlos möglich. Das Passwort lässt sich mit dem Befehl passwd ändern.

Aktuell wird nicht die gesamte Kapazität der SD-Karte genutzt. Mit dem nachfolgenden Befehl lässt sich dies sehr einfach ändern.

/usr/bin/rootfs-expand

Ebenfalls der Hostname sollte geändert werden und in der /etc/hosts mit der statischen IP-Adresse stehen.

hostnamectl set-hostname FQDN

Achtet bitte darauf eine statische IP-Adresse zu vergeben. Dies ist entweder per DHCP oder über den Befehl nmtui direkt in CentOS möglich.

Die Sprache und Zeitzone lässt sich mit nachfolgenden Befehlen ändern.

localectl set-locale LANG=de_AT.utf8
localectl set-keymap de
timedatectl set-timezone Europe/Vienna

Einige Dienste werden nicht benötigt und können deaktiviert werden.

systemctl disable kdump.service
systemctl mask kdump.service
systemctl disable tuned.service
yum -y remove irqbalance

Der Werbeblocker Pi-Hole unterstützt leider kein SELinux. Dies muss daher deaktiviert werden.

vi /etc/selinux/config

...
SELINUX=disabled
...

Mit folgendem Befehl lässt sich sehr einfach das Verzeichnis /tmp in den RAM-Speicher legen (tmpfs). Es erhöht die Geschwindigkeit und schont die SD-Karte. Dabei werden standardmäßig maximal 512 MB genutzt.

systemctl enable tmp.mount

Damit die Einstellungen für das Verzeichnis /tmp und SELinux aktiv werden, ist spätestens hier ein Neustart vom System erforderlich.

Updates, Pakete und Zeit

Nach einem Neustart sind die neuesten Updates zu installieren. Zusätzlich werden noch nützliche Pakete mitinstalliert.

yum -y update
yum -y install net-tools wget NetworkManager-tui bind-utils htop
yum -y groupinstall 'Development Tools'

Ich lasse wichtige Updates für das System gerne automatisch installieren. Die Installation der erforderlichen Pakete und eine Aktivierung erfolgt über diese beiden Befehle.

yum -y install yum-cron yum-utils
sed -i 's/^apply_updates.*/apply_updates = yes/' /etc/yum/yum-cron.conf

Für Pi-Hole wird das EPEL Repo benötigt. Hier gibt es bereits von der CentOS Community ein Rebuild für Armhfp. Zusätzlich wird noch das Testing Repo für PHP 7.2 hinzugefügt.

cat > /etc/yum.repos.d/epel.repo << EOF
[epel]
name=Epel rebuild for armhfp
baseurl=https://armv7.dev.centos.org/repodir/epel-pass-1/
enabled=1
gpgcheck=0
EOF

cat > /etc/yum.repos.d/php72-testing.repo << EOF
[php72-testing]
name=Remi php72 rebuild for armhfp
baseurl=https://armv7.dev.centos.org/repodir/community-php72-testing/
enabled=1
gpgcheck=0
EOF

Eine korrekte Uhrzeit ist für das System wichtig. Daher wird für die Zeitsynchronisation NTP genutzt.

yum -y install ntp
systemctl disable chronyd
systemctl enable ntpd.service
systemctl start ntpd.service

rm -f /etc/adjtime; hwclock --systohc --utc -D

Unbound – Der DNS-Resolver und DNS-Cache

Die Installation von Unbound ist rasch erledigt. Leider unterstützt die derzeitige Version, welche über EPEL verfügbar ist, keine Überprüfung der Zertifikate für DNS-over-TLS. Ist dies gewünscht, muss Unbound eigenständig kompiliert werden.

yum -y install unbound bind-utils

systemctl enable unbound
systemctl start unbound

unbound-control-setup

Nun werden folgende Einstellungen in der Conf-Datei angepasst. DNSSEC ist bei Unbound standardmäßig aktiv. Der Port wird auf 5353 geändert und durch die Option qname-minimisation die Privatsphäre für DNS-Abfragen erhöht.

vi /etc/unbound/unbound.conf

...
port: 5353

qname-minimisation: yes
...

Zuletzt sind der Conf-Datei noch die erforderlichen Zeilen für die Weiterleitung auf die Quad9 und Cloudflare DNS-Server per DNS-over-TLS hinzuzufügen.

...
#Adding DNS-Over-TLS support
server:
#tls-cert-bundle: /etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem
forward-zone:
name: "."
forward-ssl-upstream: yes
# Quad9
forward-addr: 2620:fe::fe@853
forward-addr: 9.9.9.9@853
forward-addr: 2620:fe::9@853
forward-addr: 149.112.112.112@853
# Cloudflare DNS
forward-addr: 2606:4700:4700::1111@853
forward-addr: 1.1.1.1@853
forward-addr: 2606:4700:4700::1001@853
forward-addr: 1.0.0.1@853

Zum Abschluss noch ein Neustart des Dienstes und ein sofortiges Update der aktuellen Keys für DNSSEC. Die Keys für DNSSEC werden bereits regelmäßig und automatisch vom System über einen eigenen Dienst aktualisiert.

systemctl restart unbound
unbound-anchor

Bei einem Neustart des Systems hatte ich öfters das Problem, dass der Unbound-Dienst nicht gestartet wurde. Der Grund hierfür war der DefaultTimeoutStartSec Wert von 90 Sekunden.

vi /etc/systemd/system.conf

[Manager]
...
DefaultTimeoutStartSec=180s
...

Mit dem Befehl dig und den untenstehenden DNS-Namen kann getestet werden, ob DNSSEC über Unbound funktioniert.

dig sigok.verteiltesysteme.net @127.0.0.1 -p 5353
dig sigfail.verteiltesysteme.net @127.0.0.1 -p 5353

Pi-Hole – Der Werbeblocker

Die Installation von Pi-Hole ist für CentOS bei Nutzung der Armhfp Architektur etwas aufwendiger. Das standardmäßige Installations-Skript funktioniert hier nicht, da EPEL nicht installiert werden kann und bei den Abhängigkeiten ein Paket einen anderen Namen trägt. Hier muss also das Installations-Skript erst heruntergeladen und angepasst werden.

cd /tmp
wget -O basic-install.sh https://install.pi-hole.net

Nun wird die Datei editiert und nachfolgende Zeilen angepasst.

vi /tmp/basic-install.sh

...
PIHOLE_DEPS=(cron curl dnsutils iputils-ping lsof nmap-ncat psmisc sudo unzip wget idn2 sqlite3 libcap2-bin dns-root-data resolvconf libcap2)

# on CentOS we need to add the EPEL repository to gain access to Fedora packages
#EPEL_PKG="epel-release"
#rpm -q ${EPEL_PKG} &> /dev/null || rc=$?
#if [[ $rc -ne 0 ]]; then
# printf " %b Enabling EPEL package repository (https://fedoraproject.org/wiki/EPEL)\\n" "${INFO}"
# "${PKG_INSTALL[@]}" ${EPEL_PKG} &> /dev/null
# printf " %b Installed %s\\n" "${TICK}" "${EPEL_PKG}"
#fi
...

Jetzt kann der Webserver lighttpd für Pi-Hole installiert werden.

yum -y install lighttpd lighttpd-fastcgi spawn-fcgi

Erst ab hier ist es möglich die Installation für Pi-Hole über das Skript zu starten. Bitte achtet darauf die Remi PHP nicht zu installieren. Die Installation schlägt ansonsten fehl.

sudo bash basic-install.sh

Folgt hier nun den Anweisungen im Setup. Das meiste kann auf Standard belassen werden.

Nach einer erfolgreichen Installation von Pi-Hole müssen in der webbasierten Admin Console die bestehenden Upstream DNS Server gelöscht und durch die Localhost-IP für IPv4 und IPv6 mit dem Port 5353 ersetzt werden. Ab diesem Zeitpunkt werden DNS-Anfragen innerhalb von Pi-Hole an den Unbound Dienst weitergereicht. Die Option DNSSEC muss hierfür in Pi-Hole selbst nicht aktiviert werden und dient nur der Protokollierung. Unbound prüft DNSSEC unabhängig.

Hinweise zur Einrichtung von Pi-Hole sind unter folgender URL zu finden.
https://docs.pi-hole.net

Sehr nützliche und gute Blocklisten für Pi-Hole sind hier aufgelistet.
https://v.firebog.net/hosts/lists.php?type=tick

Werbeblocker Pi-Hole DNS

DNS-Einstellungen für das Pi

Die genaue Bezeichnung für die Schnittstelle lässt sich mit dem Befehl nmcli device finden. Die IPv4 und IPv6 Einstellungen für DNS-Server werden auf die Localhost-IP geändert.

nmcli con mod "Kabelgebundene Verbindung 1" ipv4.ignore-auto-dns yes
nmcli con mod "Kabelgebundene Verbindung 1" ipv4.dns 127.0.0.1
nmcli con mod "Kabelgebundene Verbindung 1" ipv6.method auto
nmcli con mod "Kabelgebundene Verbindung 1" ipv6.dns "::1"

grep DNS /etc/sysconfig/network-scripts/ifcfg-*

Fazit

Wenn alles richtig gemacht wurde, sollte Pi-Hole bereits laufen und kann nun als zentraler Werbeblocker für das Netzwerk zum Einsatz kommen. Setzt die IP-Adresse eures Pi einfach als einziger DNS-Server. Dies ist in den DHCP-Server Einstellungen oder Global direkt auf dem Router und Firewall zu konfigurieren.

Wo sollte das Pi bzw. Pi-Hole im Netzwerk stehen? Ganz klar – im internen Netzwerk und nicht direkt im Internet. Betrachtet Pi-Hole als ein Dienst für das eigene Netzwerk. Bitte bedenkt, DNSSEC macht DNS-Abfragen spürbar langsamer aber dafür sicherer.

Seit der Nutzung von Pi-Hole als Werbeblocker ist auf Internetseiten spürbar weniger Werbung zu sehen. Auch der lokale Internetanbieter hat dank DNS-over-TLS nicht mehr die Möglichkeit meine DNS-Informationen zu analysieren. Mich freut es und es ist genau das, was sich viele von uns wünschen.

Banana Pi M2+ Werbeblocker

Für weitere Informationen und Fragen, besuchen Sie bitte die Kontakt-Seite.

Do NOT follow this link or you will be banned from the site! Nextcloud Talk App