unbound ist ein ziemlich schmaler DNS-Resolver, der sich perfekt dafür eignet einen lokalen Resolver/Cache für das eigene Netz zur Verfügung zu stellen. Natürlich ist das Teil nicht so mächtig wie der bind, aber dafür schmaler und damit ressourcenschonender. Ich setze bei mir den unbound als Resolver auf jedem meiner DNS Server ein. So ist bind dafür zuständig authorativ für meine Zonen zu antworten und unbound erledigt die externen Auflösungen der Server selber.
Diese Trennung hat einen entscheidenden Vorteil wenn man seine Zonen mit DNSSec geschützt hat. Macht nämlich der bind, neben den authorativen Antworten, auch den Resolver, dann kann bind die DNSSec Signaturen bei Anfragen für die eigenen Domains nicht validieren. Das geht vom Prinzip von DNSSec her nicht, dass ein Resolver DNSSec validieren kann, wenn er selber authorativ für die angefragte Zone antwortet.
Im folgenden möchte ich kurz die Installation von unbound zeigen und eine einfache Basiskonfiguration erstellen. Zum Schluss erwähne ich noch kurz die Stolperfallen über welche ich geflogen bin
Die meisten Paketverwaltungen bieten bereits fertige Pakete für unbound. Man kann ihn sich jedoch auch sehr einfach aus den Quellen bauen.
Der normale apt-Zwei(Drei)satz
apt-get update #ein Upgrade ist nie eine verkehrte Idee ;-) apt-get upgrade apt-get install unbound
Auch hier „the same procedure as every time“
#Updaten ist nie eine dumme Idee ;-) yum update yum install unbound
Bei FreeBSD geht es am schnellsten via die Ports in /usr/ports/
Als erstes sollte man sicherstellen, dann man eine gegen Heartbleed gesicherte OpenSSL Version hat. Sonst erst die Ports updaten und openssl bauen.
#Zuerst mal updaten, wie immer :-) freebsd-update fetch freebsd-update install portsnap fetch update #openssl bauen falls nötig cd /usr/ports/security/openssl make install clean #und zum Schluss den unbound cd /usr/ports/dns/unbound make install clean
Auch das Bauen aus den Quellen ist recht einfach. Je nachdem muss man ebenfalls zuerst eine aktuelle Version von openssl-1.0.1g bauen. CentOS hat in 6.5 die Version 1.0.1e über yum.
cd /tmp wget https://www.openssl.org/source/openssl-1.0.1g.tar.gz tar xvzf ./openssl-1.0.1g.tar.gz cd ./openssl-1.0.1g ./config --prefix=/opt/openssl --openssldir=/opt/local/openssl shared make #der folgende Test darf keine Feher werfen #sonst kein make install machen make test make install clean
–openssldir und –prefix sollten auf jeden Fall angegeben werden. Sonst wird in die default Pfade installiert und das wird das openssl der Paketverwaltung u.U. totschiessen!
cd /tmp wget http://unbound.net/downloads/unbound-latest.tar.gz tar xvzf ./unbound-latest.gz cd ./unbound-VERSION ./configure --prefix=/opt/unbound make install clean
Die ganze Konfiguration erfolgt zentral in einem File. Wenn man via Paketverwaltung installiert hat, dann meist /etc/unbound/unbound.conf
server:
#Anker für DNSSec
#wird per default installiert
auto-trust-anchor-file: "/var/lib/unbound/root.key"
#IP Adresse welche die Anfragen entgegennimmt
interface: 127.0.0.1
#IP Adresse über welche mit der Aussenwelt (auch LAN) kommuniziert wird
outgoing-interface: LAN.IP.ADDR
#nur localhost Anfragen erlauben
access-control: 127.0.0.0/8 allow
#IPv4 anbieten
do-ip4: yes
#Port
port: 53
#kein IPv6
do-ip6: no
#kein TCP da keine Zonentranfers
do-tcp: no
#Optionen für das Caching
prefetch: yes
prefetch-key: yes
#nur sinnvoll bei aktiviertem DNSSec
#hat den "Nachteil" dass wesentlich mehr Anfragen produziert werden
#für die Validierung der Antworten.
#letztlich wird für jede Anfrage mit DNSSEc bei den authorativen NS nachgefragt
harden-referral-path: yes
#diese Option erschwert das Cache-Poisoning
#es werden zufällig Zeichen Upper/Lower case gemacht
#es gilt aber als experimentell
use-caps-for-id: yes
das ist eine Basiskonfig für ein System mit einem Resolver für den localhost
Kurz etwas zur letzten Option oben:
Das Einstreuen von Gross/Kleinschreibung bei den Anfragen soll für mehr Entropie sorgen.
Ein korrekter Nameserver wird sowohl für example.tld als auch ExAMple.tld mit derselben IP Adresse antworten. Er schickt aber in seiner Antwort den angefragten Namen genau so wie er ihn erhalten hat. Damit kann der unbound dann feststellen ob die Antwort zu einer offenen Anfrage gehören kann (legitime Antwort) oder nicht (gespoofte Antwort meist mit dem Zweck den DNS-Cache zu verseuchen). Diese Option macht es einem Angreifer wesentlich schwieriger „korrekte“ Antworten erzeugen zu können, welche auf eine falsche IP-Adresse auflösen würden.
Mehr gibt's im RFC
Leider gibt es Nameserver welche mit solchen Anfragen nicht umgehen können. Da gibt es zwei Problemfälle
Ersteres verhindert die Erkennung gespoofter Pakete. Letzteres jedoch verunmöglicht eine Auflösung der Hostnamen, wenn dns-0x20 aktviert ist, komplett gute Beschreibung bei Google
Wenn man dieses Feature also aktiviert sollte man bei Problemen mit der Auflösung daran denken
Per default verwirft unbound Reverse Anfragen für lokale Netze nach RFC1918. Wenn man also DNS für's LAN braucht gibt es zwei Wege:
local-zone: "168.192.in-addr.arpa." static
local-data-ptr "192.168.100.54 86400 meinHost.meinLan."
local-zone: "meinHost.meinLan." static
local-data: "meinHost.meinLan. IN A 192.168.100.54"
local-zone: "168.192.in-addr.arpa." nodefault
local-zone: "meinHost.meinLan.* nodefault
#aktivieren falls man dnssec-Validierung
#auf dem Resolver aktviert hat
insecure-domain: "meinHost.meinLan"
stub-zone:
name: "168.192.in-addr.arpa."
stub-addr: IP.ADDR.DNS.SRV
stub-prime: no
stub-zone:
name: "meinHost.meinLan"
stub-addr: IP.ADDR.DNS.SRV
stub-prime: no
Ich bevorzuge 2) weil ich eh den bind am laufen habe für meine Zonen (auch für's LAN). Das spart das doppelte Führen der IP/Namen. Aber jeder wie er/sie will
Für den unbound ist es von Vorteil (aus Sicht der Performance) für Anfragen nach extern Forward-Server zu definieren. Es ist aber nicht zwingend notwendig, da unbound ohne Forwarder sich einfach von der root-Zone zu der gesuchten Zone durchfragt.
Das dauert aber deutlich länger und kann zum Problem werden wenn verschiedene Dienste auf dem Server (z.B. Mailserver) viel DNS-Anfragen erzeugen und durch die langsameren Antwortzeiten des DNS ausgebremst werden.
forward-zone:
name: "."
forward-addr: 8.8.8.8
forward-addr: 8.8.4.4
hier werden also die schnellen Google-DNS Server abgefragt für externe Anfragen. Ja ich weiss Google ist eine Datenkrake, aber sie haben nun mal die potentesten Server und antworten unter diesen beiden IPs immer extrem schnell. Alternativ kann man auch die NS des eigenen Providers eintragen.
Alle möglichen Konfigparameter werden hier beschrieben
Falls man bereits einen DNS Server einsetzt muss man diesen erst noch anpassen, damit unbound starten kann. Da unbound ja an 127.0.0.1 und Port 53 binden will, muss dieser erst freigemacht werden. Dazu muss man die 127.0.0.1 aus der listen-on port 53 Direktive entfernt werden z.B.
listen-on port 53 { LAN.IP.ADD.RES; };
nach einem service bind9 restart sollte sich service unbound start problemlos ausführen lassen.
Testet es am besten mit ein paar DNS Abfragen
dig @127.0.0.1 meinHost.meinLan dig @127.0.0.1 -x 192.168.100.54 dig @127.0.0.1 google.ch
Wenn die Tests oben geklappt haben, kann man systemweit den Resolver anpassen. Dazu in /etc/resolv.conf als ersten Nameserver
nameserver 127.0.0.1 [alle anderen Nameserver]
eintragen
Zum Schluss also noch die Fettnäpfchen wo man reintreten kann.
server:
verbosity: 2
[Rest der Konfig]
local-zone immer sicher, dass sie entweder static oder nodefault sindinsecure-domain eingetragen sind. Bei mehreren Domains den insecure-domain Eintrag einfach wiederholenstub-zone können nur Zonen angelegt werden, bei denen stub-addr authorativ für die Zone antwortet. Andernfalls muss man die Zone(n) als forward-zone anlegenAn unforeseen error has occured. This is most likely a bug somewhere. It might be a problem in the discussion plugin.
More info has been written to the DokuWiki error log.