Mit Unbound sorgen Sie für blitzschnelle Antworten auf DNS-Anfragen – und sperren bei Bedarf lästige Web-Werbung aus.
Das Domain Name System fungiert quasi als Telefonbuch des Internets. Mit Unbound [1] auf einem Raspberry Pi optimieren Sie den Einsatz des Protokolls für die Geräte im LAN. So sorgen Sie für kürzere Antwortzeiten, mehr Privatsphäre und schützen die Clients vor unerwünschter Werbung. Dabei steht der Dienst zentral für alle Geräte bereit.
Bei der Einwahl ins Internet schicken Provider in der Regel die Einträge für DNS-Server mit, die die Router automatisch übernehmen. Das genügt normalen Anwendern, die lediglich mit dem Browser unterwegs sind.
Wer jedoch die Grenzen des Möglichen austesten will, stößt schnell auf Probleme – etwa wenn die DNS-Server der Telekom für einen nicht existierenden Namen auf ihre Suchseite umleiten, anstatt die korrekte Fehlermeldung (NX_NODOMAIN) zu liefern. Was für einen surfenden Anwender praktisch erscheint, ist für einen automatischen Dienst nicht unbedingt erwünscht.
Solche Probleme lassen sich umgehen, indem Sie einfach die entsprechenden Einträge im Router ersetzen. Trotzdem müssen Sie weiterhin für jede Anfrage eine Verbindung zum externen DNS-Server aufbauen – obwohl vielleicht ein anderer Rechner im LAN dieselbe Abfrage zuvor bereits gestellt hat.
Hier hilft Unbound als DNS-Server mit eigenem Cache dabei, das Auflösen der Namen auf Trab zu bringen. Die Möglichkeit, beliebig viele Upstream-Server zu konfigurieren, bietet dabei mehr Sicherheit gegen Ausfälle.
Darüber hinaus dient das dem Schutz der Privatsphäre: Da die konfigurierten Server im Round-Robin-Verfahren zum Einsatz kommen, streuen Sie so die Abfragen über verschiedene Anbieter. Auf diese Weise erhält niemand einen vollständigen Überblick über abgefragten Adressen. Verwenden Sie ausschließlich DNSSEC-fähige Upstream-Server, sind Sie außerdem gut geschützt gegen gefälschte Antworten.
Unsere Schwesterzeitschrift Raspberry Pi Geek hat mit Pi-hole bereits ein ähnliches Projekt vorgestellt, dessen Fokus auf dem Blockieren von Werbung auf Webseiten liegt [2]. Diesen Teil deckt Unbound ebenfalls mit ab; eine entsprechende Liste mit zu blockierenden Einträgen aktualisieren Sie bei Bedarf sogar automatisch.
Im Vergleich zu Pi-hole kommt Unbound jedoch wesentlich schlanker daher: Es gibt keine grafische Oberfläche, die Konfiguration findet mit dem Editor statt. Die Abhängigkeiten fallen daher deutlich geringer aus.
Installation
Da sich Unbound in den Repos aller gängigen Distributionen findet, gelingt die Installation üblicherweise mithilfe der entsprechenden Werkzeuge zur Paketverwaltung. Fehlende Abhängigkeiten installiert das Paketmanagement dabei automatisch mit.
Im Verzeichnis /etc/unbound finden Sie die Konfiguration. Für dynamische und modulare Bestandteile lädt die Software alle Dateien aus dem Verzeichnis /etc/unbound/unbound.conf.d automatisch nach, was Sie sich im Folgenden zunutze machen.
Um das Programm als einfachen, puffernden DNS-Server nutzen zu können, bedarf es lediglich einer simplen Konfiguration, wie sie Listing 1 zeigt. Über interface: 0.0.0.0 weisen Sie die Software an, auf allen Schnittstellen zu lauschen, also sowohl Anfragen an localhost beziehungsweise 127.0.0.1 als auch von anderen Rechnern im Netz anzunehmen (Zeile 5).
Listing 1
## Simple recursive caching DNS
## unbound.conf -- https://calomel.org
#
server:
interface: 0.0.0.0
access-control: 10.0.0.0/16 allow
access-control: 127.0.0.0/8 allow
access-control: 192.168.0.0/16 allow
verbosity: 1
forward-zone:
name: "."
# definitely censor free & log free with DNSSEC Support:
forward-addr: 84.200.69.80 # DNS Watch
forward-addr: 84.200.70.40 # DNS Watch
forward-addr: 77.109.148.136 # Xiala.net
forward-addr: 77.109.148.137 # Xiala.net
forward-addr: 91.239.100.100 # censurfridns.dk
forward-addr: 89.233.43.71 # censurfridns.dk
Mit access-control legen Sie fest, wer den Dienst benutzen darf. Je nachdem, welcher Adressbereich in Ihrem Netz zum Einsatz kommt, passen Sie hier die Daten an (Zeilen 6 bis 8).
Im Abschnitt forward-zone definieren Sie mit name: "." die Upstream-Server (Zeile 11ff.). Alle hier festgelegten Rechner kommen im Round-Robin-Verfahren zum Einsatz. Die drei Dienste im Beispiel (DNS Watch, Xiala.net, Censurfridns.dk) erfüllen wichtige Kriterien: Sie unterstützen DNSSEC, speichern keine Logs und zensieren keine Abfragen.
Mit dieser Konfiguration wären, abgesehen vom Blockieren der Werbung, alle eingangs genannten Kriterien abgedeckt. Um DNSSEC zu aktivieren und Unbound als verantwortlichen Server für das LAN zu nutzen, sind jedoch noch weitere Schritte notwendig. Zuerst einmal konfigurieren Sie Unbound mit den zentralen Root-Servern des DNS:
$ curl -o /etc/unbound/root.hints https://www.internic.net/domain/named.cache
Außerdem benötigt die Software den Schlüssel für den Root-Server, den sie laut /etc/unbound/unbound.conf.d/root-auto-trust-anchor-file.conf in der Datei /var/lib/unbound/root.key erwartet. Existiert diese Datei noch nicht oder bleibt sie leer, sollte sie initial den Inhalt aus Listing 2 erhalten.
Listing 2
. IN DS 19036 8 2 49AAC11D7B6F6446702E54A1607371607A1A41855200FD2CE1CDDE32F24E8FB5
Sie verifizieren diesen Eintrag über die Webseite der Internet Assigned Numbers Authority (IANA) [3]. Außerdem fügen Sie noch ein, wo sich die root.hints befinden (Listing 3, Zeile 14). Die Konfigurationsdatei fällt nun ein wenig komplexer aus (Listing 3).
Listing 3
server:
verbosity: 1
interface: 0.0.0.0
port: 53
do-ip4: yes
do-ip6: no
do-udp: yes
do-tcp: yes
access-control: 10.0.0.0/16 allow
access-control: 127.0.0.0/8 allow
access-control: 192.168.0.0/16 allow
root-hints: "/etc/unbound/root.hints"
hide-identity: yes
hide-version: yes
harden-glue: yes
harden-dnssec-stripped: yes
use-caps-for-id: yes
cache-min-ttl: 300
cache-max-ttl: 86400
prefetch: yes
num-threads: 2
forward-zone:
name: "."
# definitely censor free & log free with DNSSEC Support:
forward-addr: 84.200.69.80 # DNS Watch
forward-addr: 84.200.70.40 # DNS Watch
forward-addr: 77.109.148.136 # Xiala.net
forward-addr: 77.109.148.137 # Xiala.net
forward-addr: 91.239.100.100 # censurfridns.dk
forward-addr: 89.233.43.71 # censurfridns.dk
Jetzt lässt sich Unbound als zentrale Verwaltungsstelle für Geräte im lokalen Netz einsetzen, indem Sie den Inhalt von Listing 4 in die Konfiguration integrieren.
Listing 4
server: local-zone: "home.lan." static local-data: "firewall.home.lan. IN A 10.0.0.1" local-data: "laptop.home.lan. IN A 10.0.0.2" local-data: "xboxone.home.lan. IN A 10.0.0.3" local-data: "ps4.home.lan. IN A 10.0.0.4" local-data-ptr: "10.0.0.1 firewall.home.lan" local-data-ptr: "10.0.0.2 laptop.home.lan" local-data-ptr: "10.0.0.3 xboxone.home.lan" local-data-ptr: "10.0.0.4 ps4.home.lan"
Mit local-zone legen Sie fest, für welche Domain der Block gilt. Im Beispiel kommt home.lan für ein lokales Netzwerk zum Einsatz. Für jeden Host legen Sie anschließend mittels local-data einen Eintrag für den Forward Lookup an, also das Auflösen eines Namens in eine IP-Adresse. Mittels local-data-ptr ergänzen Sie einen Eintrag für den Reverse Lookup, also das Auflösen einer IP-Adresse in einen Namen [4].
Adblocker
Den geforderten Adblocker rüsten Sie nun recht einfach nach. Dazu laden Sie zunächst eine entsprechende Liste von Hosts herunter (Listing 5). Anschließend binden Sie diese Datei über einen entsprechenden Eintrag in der Konfiguration ein (Listing 6). Jetzt noch ein beherztes service unbound restart getippt, und die Arbeit ist getan.
Listing 5
$ curl -sS -L --compressed "http://pgl.yoyo.org/adservers/serverlist.php?hostformat=unbound&showintro=0&mimetype=plaintext" > /etc/unbound/unbound.conf.d/unbound_ad_servers
Listing 6
include: "/etc/unbound/unbound.conf.d/unbound_ad_servers"
Zwei Varianten
Damit Sie nicht alles von Hand abtippen müssen, haben wir die oben vorgestellten Beispiele für die Konfiguration auf der Heft-DVD beigelegt. Je nach Ihren Bedürfnissen wählen Sie für den Start entweder das Verzeichnis simple (einfacher, cachender DNS-Server, siehe Listing 1) oder complex (hier ist die Konfiguration mit Kommentaren versehen, damit Sie sich leichter zurechtfinden).
Es besteht die Möglichkeit, beide Varianten zu kombinieren, indem Sie etwa die localzone.conf aus dem Verzeichnis complex der einfachen Konfiguration hinzufügen – für einen einfachen, puffernden Nameserver mit Auflösung der lokalen Rechner.
Aktualisierungen
Das Aktualisieren der Software selbst übernimmt die Paketverwaltung. Um die root.hints sowie die Liste für den Adblocker kümmert sich dagegen ein Skript (Listing 7), das Sie am einfachsten via Cronjob aufrufen.
Listing 7
#!/bin/bash
# Updating Unbound resources.
# Place this into e.g. /etc/cron.monthly or /etc/cron.weekly
###[ unbound_ad_servers ]###
curl -sS -L --compressed "http://pgl.yoyo.org/adservers/serverlist.php?hostformat=unbound&showintro=0&mimetype=plaintext" > /etc/unbound/unbound.conf.d/unbound_ad_servers.new
if [[ $? -eq 0 ]]; then
mv /etc/unbound/unbound.conf.d/unbound_ad_servers /etc/unbound/unbound.conf.d/unbound_ad_servers.bak
mv /etc/unbound/unbound.conf.d/unbound_ad_servers.new /etc/unbound/unbound.conf.d/unbound_ad_servers
unbound-checkconf >/dev/null
if [[ $? -eq 0 ]]; then
rm /etc/unbound/unbound.conf.d/unbound_ad_servers.bak
service unbound reload >/dev/null
else
echo "Warning: Errors in unbound configuration due to probably failed update of"
echo "/etc/unbound/unbound.conf.d/unbound_ad_servers:"
unbound-checkconf
mv /etc/unbound/unbound.conf.d/unbound_ad_servers /etc/unbound/unbound.conf.d/unbound_ad_servers.new
mv /etc/unbound/unbound.conf.d/unbound_ad_servers.bak /etc/unbound/unbound.conf.d/unbound_ad_servers
fi
else
echo "Download of unbound_ad_servers list failed!"
fi
###[ root.hints ]###
curl -o /etc/unbound/root.hints.new https://www.internic.net/domain/named.cache
if [[ $? -eq 0 ]]; then
mv /etc/unbound/root.hints /etc/unbound/root.hints.bak
mv /etc/unbound/root.hints.new /etc/unbound/root.hints
unbound-checkconf >/dev/null
if [[ $? -eq 0 ]]; then
rm /etc/unbound/root.hints.bak
service unbound reload >/dev/null
else
echo "Warning: Errors in newly downloaded root.hints file probably due to incomplete download:"
unbound-checkconf
mv /etc/unbound/root.hints /etc/unbound/root.hints.new
mv /etc/unbound/root.hints.bak /etc/unbound/root.hints
fi
else
echo "Download of unbound root.hints failed!"
fi
Diese Datei legen Sie einfach unter /etc/cron.weekly ab und vergeben entsprechende Rechte, damit das System sie ausführt (chmod 0755 unbound_updates.sh) – und schon gibt es wöchentlich frische Daten.
Wie Sie den neu eingerichteten Server im LAN bekannt machen, beschreibt der bereits erwähnte Artikel zu Pi-hole aus RPG 03-04/2017 ausführlich. Sie finden diesen Artikel auf der diesem Heft beiliegenden DVD als PDF.
Eine Besonderheit sei noch erwähnt: Verschiedene Modelle vom Typ Fritzbox des Anbieters AVM erlauben es nicht, wie im genannten Artikel beschrieben, einen lokalen DNS in den Haupteinstellungen festzulegen. Ein Beispiel dafür wäre die Fritzbox 7390 mit Firmware 6.51. Eine passende Einstellung findet sich hier dennoch, aber versteckt unter Heimnetz | Heimnetzübersicht | Netzwerkeinstellungen | IPv4 Adressen | Lokaler DNS-Server (Abbildung 1).

Abbildung 1: Obwohl die Fritzbox 7390 auf den ersten Blick keinen Eintrag für einen lokalen DNS-Server erlaubt, findet sich in den Tiefen der Oberfläche doch ein passender Punkt in der Konfiguration.
Fazit
Dank Unbound reduzieren Sie die Anzahl der DNS-Anfragen ins Netz, sorgen für mehr Datenschutz und sperren außerdem lästige Werbung aus dem lokalen Netzwerk aus. Dabei gestaltet sich die Konfiguration recht einfach, und mithilfe eines Mini-Rechners wie des Raspberry Pi lässt sich das Ganze bei Bedarf energiesparend ins LAN integrieren.
Glossar
-
Upstream-Server
-
Externer Server, den Unbound konsultiert, wenn er eine Anfrage nicht selbst (etwa aus dem Cache oder aufgrund der Konfiguration) beantworten kann.
-
Round-Robin-Verfahren
-
Im Kontext von Unbound: Bei jeder Abfrage, deren Antwort noch nicht im Cache liegt, nutzt die Software jeweils der Reihe nach den nächsten Upstream-Server für die Anfrage.
-
DNSSEC
-
Bei den Domain Name System Security Extensions handelt es sich um eine Reihe von Standards, um beim Domain Name System (DNS) die Authentizität und Integrität der Daten zu gewährleisten.
Infos
-
Unbound: http://unbound.net
-
Pi-hole: Christoph Langner, “Ausgesiebt”, RPG 03-04/2017, S. 46, http://www.raspi-geek.de/38303
-
Root-Anchors: https://data.iana.org/root-anchors/
-
Individuelle DNS-Einträge für Hosts im LAN: https://www.bentasker.co.uk/documentation/linux/279-unbound-adding-custom-dns-records





