Veilige DNS-server voor thuis met Unbound
Name-resolution inclusief databeveiliging thuis
Zonder DNS werkt op internet amper wat – de Domain Name Service is het telefoonboek van internet. Maar de exploitant van een DNSserver weet ook waar jij op internet geweest bent. Daar helpt alleen een eigen DNS-server tegen. En als je die toch al hebt, kun je hem meteen ook een paar andere nuttige dingen laten doen.
Om je browser een website als ct.nl te kunnen laten openen, moet hij het bijbehorende ip-adres hebben. Dat krijgt hij normaal gesproken van een Domain Name System-server van je provider (DNS-server). Dan weet je provider echter ook meteen op welke websites je geweest bent.
Een privé-DNS-server weet wel niet de ip-adressen van alle domeinen ter wereld, maar je kunt hem in ieder geval de opdracht geven ze bij verschillende openbare DNS-servers na te vragen als hij het antwoord zelf niet weet. Daardoor wordt je surfhistorie verdeeld over meerdere servers en krijgt geen enkele aanbieder een compleet beeld. En je omzeilt er domeinblokkades vanuit je provider meteen ook mee.
Een ander voordeel van een eigen DNS-server in je thuisnetwerk is dat sommige nameservers geen correcte antwoorden geven op niet-beantwoordbare DNS-requests. Bij een typfout krijg je dan niet de standaard verwachtte foutmelding (NXDOMAIN), maar kom je terecht op een eigen zoekpagina met reclame.
En als je dan toch een eigen DNS-server gaat gebruiken, dan kun je ondertekende DNS-responses meteen ook voor de hele familie valideren – oftewel controleren of het antwoord niet vervalst is en of het van een betrouwbare bron komt. Dat kan ook door in je router niet je providers DNSserver maar die van Google te gebruiken. Maar de responses daarvan komen onbeveiligd bij je router binnen en kunnen dan makkelijk door een man-in-the-middle gemanipuleerd worden.
Bovendien moet de server recursief werken en de antwoorden cachen. Recursief betekent: afhankelijkheden automatisch oplossen. Als een request bij de eerste stap bijvoorbeeld leidt naar een CNAME (extra, canonieke naam van een domein, vandaar canonical name), dan vraagt een recursieve server automatisch door naar het eigenlijke doel. Bij bijvoorbeeld daar.wil.ik.heen.org begint hij bij de root-DNS-server die voor .org verantwoordelijk is en gaat dan door tot de server die het gezochte subdomein daadwerkelijk beheert. Cachen betekent dat de server de antwoorden lokaal buffert. Komt er uit je netwerk dan weer een request naar hetzelfde domein, dan beantwoord je eigen server die meteen zelf.
Installatie
De kleine DNS-server Unbound kun je bij de gangbare Linux-distributies installeren via de eigen repository's – FreeBSD vanaf versie 10.1 en macOS vanaf versie 10.11 hebben Unbound al. Voor Windowsgebruikers staat een installatie-archief op de server van de ontwikkelaar (zie de link onderaan dit artikel).
We hebben Unbound op een Debiansysteem geïnstalleerd met door onszelf vervaardigde configuratiebestanden. Die bestanden werken echter ook bij de andere systemen waarvoor Unbound beschikbaar is. Je kunt Unbound bijvoorbeeld ook op de energiezuinige minicomputer Raspberry Pi installeren of op een laptop. Het grootste deel van de installatie gaat via de terminal, maar vergt geen bijzondere kennis, alleen wat zorgvuldigheid bij het intypen van de commando's.
Voor het installeren op Debian zijn we uitgegaan van de recente versie 8.8. Veel repository's hebben alleen oudere Unbound-versies, Debian Jessie heeft standaard bijvoorbeeld slechts Unbound 1.4.22, terwijl versie 1.6.2 inmiddels beschikbaar is. Om nieuwere Unbound-versies te krijgen, moet je bij de pakketmanager apt de backports-optie instellen. Die optie zet je het beste in een apart bestand. Open een commandline en typ het volgende in (en daarna het root-wachtwoord):
sudo echo "deb http://ftp.debian.org/— debian jessie-backports main" >
/etc/apt/sources.list.d/— debian-jessie-backports.list
Werk de pakketlijst bij en download en installeer de nieuwste Unbound-versie. De Unbound-ontwikkelaars zijn inmiddels zoals gezegd bij versie 1.6.2 aangekomen, maar de Debian-repository had op het moment van het schrijven van dit artikel alleen nog versie 1.6.0 in het assortiment:
apt update apt-get -t jessie-backports install
unbound
Unbound integreert conf-bestanden die in de subfolder /etc/unbound/unbound.conf.d/ staan automatisch als in /etc/unbound/ unbound.conf de regel include:"/etc/unbound/unbound.conf.d/*.conf" staat. Daardoor kan de configuratie modulair zijn en uit meerdere bestanden bestaan. Zo kun je verschillende dingen in verschillende bestanden met eenduidige namen zetten. Dat is bij de door ons gemaakte bestanden in ieder geval zo.
Downloadt het archief bij de link onderaan dit artikel op je computer en pak het uit – bijvoorbeeld op de desktop. Ga in de terminal naar de map van het uitgepakte archief en zet het bestand 01_CacheForwarder.conf op de juiste plek:
sudo cp 01_CacheForwarder.conf
/etc/unbound/unbound.conf.d/ Open het bestand 01_CacheForwarder. conf. De twee regels die met interface beginnen zorgen ervoor dat Unbound naar alle interfaces luistert, zowel via IPv4 als IPv6. De server beantwoordt dan requests die via localhost op dezelfde server binnenkomen en requests van andere computers in het netwerk.
Daarna komt de optie access-control, waarmee je de subnetten aangeeft die de name-service mogen gebruiken. In het voorbeeld worden requests van de lokale machines en uit de subnetten 10.x, 192.168.x.x en 2001:DB8:: beantwoord. Verwijder de ongebruikte subnetten en vervang 192.168.0.0/16 door het subnet dat je LAN gebruikt, bijvoorbeeld 192.168.188.0/16. Hetzelfde geldt voor 2001:DB8::, als je router een ULA-prefix gebruikt tenminste (Unique Local Adresses, fd00::/8) of als je een internetaansluiting met een vaste IPv6-prefix hebt. Bij een Fritzbox zitten de ULA-instellingen in het menu 'Home Network / Home Network Overview / Network settings / IPv6 Addresses'.
In het deel forward-zone staan de adressen van de forward-servers. De in het voorbeeld genoemde zijn van DNS Watch, Xiala.net en censurfridns.dk en leveren met DNSSEC ondertekende antwoorden. Ze slaan volgens de exploitanten geen logbestanden op en censureren niet, dus leveren responses voor alle willekeurige domeinen op internet. Sla de veranderingen op en controleer of er geen fouten in zitten:
unbound-checkconf
Dat commando moet 'no errors' opleveren, anders moet je de configuratie controleren
op typfouten. Na een herstart gebruikt Unbound de nieuwe configuratie:
sudo service unbound restart
Sneltest voor IPv6 en IPv4
Je kunt Unboud op dezelfde computer testen met het commando dig:
dig @localhost ct.nl
Als de internetverbinding werkt, moet het commando bij de 'answer section' het ip-adres 213.207.93.230 opleveren. Het commando moet dan voor alle domeinrequests uitsluitsel kunnen geven. Het antwoorddeel voor ct.nl ziet er zo uit:
;; ANSWER SECTION: ct.nl. 3600 IN A 213.207.93.230
Op deze manier test je Unbound via IPv6: dig @::0 ct.nl. Dat commando moet hetzelfde IPv4-adres opleveren. Zo vraag je het IPv6-adres op: dig @::0 ct.nl aaaa.
Valideren
Als je op die manier gecontroleerd hebt of alles werkt, voeg je het bestand 02_ Validate.conf toe om ervoor te zorgen dat Unbound de ondertekende DNSresponsen valideert. Daar heeft hij ook de adressen van de DNS-rootservers voor nodig. Die adressen haal je van internic. net en sla je op in het bestand root. hints:
curl -o /etc/unbound/root.hints https://www.internic.net/domain/—
named.cache
Unbound vindt root.hints aan de hand van deze definitie:
root-hints: "/etc/unbound/root.hints"
Zorg ervoor dat de openbare sleutel van de root-zone op de juiste plek staat:
unbound-anchor -v
Als dat niet zo is, haalt unbound-anchor de root-trust-anchors door TLS beveiligd van de IANA-website. Het valideren kun je zo testen:
dig @localhost dnssec.works
Als het antwoord van een vertrouwenswaardige server komt. moet de output de volgende vier vlaggen hebben:
;; flags: qr rd ra ad;
De vlag ad betekent 'authenticated data', oftewel dat de server te vertrouwen is.
Sommige ondertekende DNS-responses zijn te lang voor de UDP-pakketten waarin ze normaal verstuurd worden. Dan moeten ze gefragmenteerd worden. Bij het IPv4-verkeer is dat geen probleem, maar verkeerd geconfigureerde IPv6-firewalls beschouwen de eigenlijk toegestane IPv6fragmentatie (om precies te zijn: de extension header) ten onrechte als gevaarlijk. Ze gooien dan alles na het eerste antwoordsegment weg. In die gevallen levert Unbound helemaal geen antwoord op een request. Bij de test zagen we dat bij een paar websites gebeuren.
Daar is echter wat tegen te doen: aan het eind van de server:-definities, na de regel num-threads: 2, staan in het bestand 03_DumbFirewalls.conf twee speciale regels:
edns-buffer-size: 1232 max-udp-size: 1232
Zet het bestand 03_DumbFirewalls.conf in de map /etc/unbound/unbound.conf.d en herstart de server.
Het pakketmanagement van Debian zorgt voor het bijwerken van de Unboundserver. Het bestand roots.hints wordt door een cronjob actueel gehouden. Kopieer het bijbehorende bash-scipt unbound_ updates.sh naar de juiste plek en maak het uitvoerbaar:
sudo cp unbound_updates.sh
/etc/cron.weekly sudo chmod 0755 unbound_updates.sh
Thuisnetwerk
Voer de nieuwe DNS-server in bij de DHCP-server van je router. Clients die hun ip-configuratie via DHCP krijgen, gebruiken de Unbound-server dan automatisch. Bij apparaten die met de hand geconfigureerd zijn, moet je de DNS-server zelf aanpassen.
Bij een Fritzbox met recente firmware kan dat op twee plekken. Open het menu 'Home Network / Home Network Overview / Network Settings / IPv4 Addresses' en typ in het veld 'Local DNS server' het ip-adres van je Unbound-server in, dus bijvoorbeeld 192.168.188.111 als hij op dat ip-adres te vinden is. De router geeft dat ip-adres dan mee als DNS-server bij het ophalen van adressen door clients via DHCP.
De router zelf gebruikt dan nog steeds de DNS-servers die je provider toewijst bij het tot stand komen van de internetverbinding. Welke dat zijn, kun je achterhalen met het menu-item 'Internet / Online Monitor'. Normaal laat je het daarbij. Als de providerservers een keer niet bereikbaar zijn, open je het menu 'Internet / Account Information / DNS Server'. Daar zet je de optie 'Use other DNSv4 servers' aan. Zet de Unbound-server daarin als voorkeursserver. Als de provider-DNS het dan weer doet, kun je die weer de voorkeur geven om de router onafhankelijk te maken van de beschikbaarheid van je Unbound-server.
In een van de volgende c't-uitgaven laten we zien hoe je Unbound kunt leren om eigen domeinen te beheren, inclusief geavanceerdere mogelijkheden om bijvoorbeeld verschillende antwoorden te geven afhankelijk van het netwerk waar de request vandaan komt – dan kunnen clients een interne server via zijn interne adres aanspreken, terwijl externe clients naar het juiste DynDNS-adres omgeleid worden. (nkr)