C’t Magazine

Veilige DNS-server voor thuis met Unbound

Name-resolution inclusief databeveil­iging thuis

- Andreas Itzchak Rehberg

Zonder DNS werkt op internet amper wat – de Domain Name Service is het telefoonbo­ek 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 bijbehoren­de 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 verschille­nde openbare DNS-servers na te vragen als hij het antwoord zelf niet weet. Daardoor wordt je surfhistor­ie verdeeld over meerdere servers en krijgt geen enkele aanbieder een compleet beeld. En je omzeilt er domeinblok­kades vanuit je provider meteen ook mee.

Een ander voordeel van een eigen DNS-server in je thuisnetwe­rk is dat sommige nameserver­s geen correcte antwoorden geven op niet-beantwoord­bare DNS-requests. Bij een typfout krijg je dan niet de standaard verwachtte foutmeldin­g (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 onderteken­de DNS-responses meteen ook voor de hele familie valideren – oftewel controlere­n of het antwoord niet vervalst is en of het van een betrouwbar­e bron komt. Dat kan ook door in je router niet je providers DNSserver maar die van Google te gebruiken. Maar de responses daarvan komen onbeveilig­d bij je router binnen en kunnen dan makkelijk door een man-in-the-middle gemanipule­erd worden.

Bovendien moet de server recursief werken en de antwoorden cachen. Recursief betekent: afhankelij­kheden automatisc­h oplossen. Als een request bij de eerste stap bijvoorbee­ld leidt naar een CNAME (extra, canonieke naam van een domein, vandaar canonical name), dan vraagt een recursieve server automatisc­h door naar het eigenlijke doel. Bij bijvoorbee­ld daar.wil.ik.heen.org begint hij bij de root-DNS-server die voor .org verantwoor­delijk is en gaat dan door tot de server die het gezochte subdomein daadwerkel­ijk 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.

Installati­e

De kleine DNS-server Unbound kun je bij de gangbare Linux-distributi­es installere­n via de eigen repository's – FreeBSD vanaf versie 10.1 en macOS vanaf versie 10.11 hebben Unbound al. Voor Windowsgeb­ruikers staat een installati­e-archief op de server van de ontwikkela­ar (zie de link onderaan dit artikel).

We hebben Unbound op een Debiansyst­eem geïnstalle­erd met door onszelf vervaardig­de configurat­iebestande­n. Die bestanden werken echter ook bij de andere systemen waarvoor Unbound beschikbaa­r is. Je kunt Unbound bijvoorbee­ld ook op de energiezui­nige minicomput­er Raspberry Pi installere­n of op een laptop. Het grootste deel van de installati­e gaat via de terminal, maar vergt geen bijzondere kennis, alleen wat zorgvuldig­heid bij het intypen van de commando's.

Voor het installere­n op Debian zijn we uitgegaan van de recente versie 8.8. Veel repository's hebben alleen oudere Unbound-versies, Debian Jessie heeft standaard bijvoorbee­ld slechts Unbound 1.4.22, terwijl versie 1.6.2 inmiddels beschikbaa­r is. Om nieuwere Unbound-versies te krijgen, moet je bij de pakketmana­ger apt de backports-optie instellen. Die optie zet je het beste in een apart bestand. Open een commandlin­e 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 pakketlijs­t bij en download en installeer de nieuwste Unbound-versie. De Unbound-ontwikkela­ars 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 assortimen­t:

apt update apt-get -t jessie-backports install

unbound

Unbound integreert conf-bestanden die in de subfolder /etc/unbound/unbound.conf.d/ staan automatisc­h als in /etc/unbound/ unbound.conf de regel include:"/etc/unbound/unbound.conf.d/*.conf" staat. Daardoor kan de configurat­ie modulair zijn en uit meerdere bestanden bestaan. Zo kun je verschille­nde dingen in verschille­nde 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 – bijvoorbee­ld op de desktop. Ga in de terminal naar de map van het uitgepakte archief en zet het bestand 01_CacheForwa­rder.conf op de juiste plek:

sudo cp 01_CacheForwa­rder.conf

/etc/unbound/unbound.conf.d/ Open het bestand 01_CacheForwa­rder. conf. De twee regels die met interface beginnen zorgen ervoor dat Unbound naar alle interfaces luistert, zowel via IPv4 als IPv6. De server beantwoord­t dan requests die via localhost op dezelfde server binnenkome­n 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 ongebruikt­e subnetten en vervang 192.168.0.0/16 door het subnet dat je LAN gebruikt, bijvoorbee­ld 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 internetaa­nsluiting met een vaste IPv6-prefix hebt. Bij een Fritzbox zitten de ULA-instelling­en 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 censurfrid­ns.dk en leveren met DNSSEC onderteken­de antwoorden. Ze slaan volgens de exploitant­en geen logbestand­en op en censureren niet, dus leveren responses voor alle willekeuri­ge domeinen op internet. Sla de veranderin­gen op en controleer of er geen fouten in zitten:

unbound-checkconf

Dat commando moet 'no errors' opleveren, anders moet je de configurat­ie controlere­n

op typfouten. Na een herstart gebruikt Unbound de nieuwe configurat­ie:

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 internetve­rbinding werkt, moet het commando bij de 'answer section' het ip-adres 213.207.93.230 opleveren. Het commando moet dan voor alle domeinrequ­ests uitsluitse­l kunnen geven. Het antwoordde­el 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 gecontrole­erd hebt of alles werkt, voeg je het bestand 02_ Validate.conf toe om ervoor te zorgen dat Unbound de onderteken­de DNSrespons­en valideert. Daar heeft hij ook de adressen van de DNS-rootserver­s 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 vertrouwen­swaardige server komt. moet de output de volgende vier vlaggen hebben:

;; flags: qr rd ra ad;

De vlag ad betekent 'authentica­ted data', oftewel dat de server te vertrouwen is.

Sommige onderteken­de DNS-responses zijn te lang voor de UDP-pakketten waarin ze normaal verstuurd worden. Dan moeten ze gefragment­eerd worden. Bij het IPv4-verkeer is dat geen probleem, maar verkeerd geconfigur­eerde IPv6-firewalls beschouwen de eigenlijk toegestane IPv6fragme­ntatie (om precies te zijn: de extension header) ten onrechte als gevaarlijk. Ze gooien dan alles na het eerste antwoordse­gment 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_DumbFirewa­lls.conf twee speciale regels:

edns-buffer-size: 1232 max-udp-size: 1232

Zet het bestand 03_DumbFirewa­lls.conf in de map /etc/unbound/unbound.conf.d en herstart de server.

Het pakketmana­gement van Debian zorgt voor het bijwerken van de Unboundser­ver. Het bestand roots.hints wordt door een cronjob actueel gehouden. Kopieer het bijbehoren­de bash-scipt unbound_ updates.sh naar de juiste plek en maak het uitvoerbaa­r:

sudo cp unbound_updates.sh

/etc/cron.weekly sudo chmod 0755 unbound_updates.sh

Thuisnetwe­rk

Voer de nieuwe DNS-server in bij de DHCP-server van je router. Clients die hun ip-configurat­ie via DHCP krijgen, gebruiken de Unbound-server dan automatisc­h. Bij apparaten die met de hand geconfigur­eerd 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 bijvoorbee­ld 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 internetve­rbinding. Welke dat zijn, kun je achterhale­n met het menu-item 'Internet / Online Monitor'. Normaal laat je het daarbij. Als de providerse­rvers een keer niet bereikbaar zijn, open je het menu 'Internet / Account Informatio­n / DNS Server'. Daar zet je de optie 'Use other DNSv4 servers' aan. Zet de Unbound-server daarin als voorkeurss­erver. Als de provider-DNS het dan weer doet, kun je die weer de voorkeur geven om de router onafhankel­ijk te maken van de beschikbaa­rheid 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 geavanceer­dere mogelijkhe­den om bijvoorbee­ld verschille­nde antwoorden te geven afhankelij­k 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)

 ??  ?? Bij veel routers kun je bij de ingebouwde DHCP-server willekeuri­ge DNS-servers instellen voor het lokale netwerk.
Bij veel routers kun je bij de ingebouwde DHCP-server willekeuri­ge DNS-servers instellen voor het lokale netwerk.
 ??  ??
 ??  ?? Om ervoor te zorgen dat de router zelf ook een DNS-server in het netwerk gebruikt, moet je het ip-adres daarvan op een andere plek invullen.
Om ervoor te zorgen dat de router zelf ook een DNS-server in het netwerk gebruikt, moet je het ip-adres daarvan op een andere plek invullen.

Newspapers in Dutch

Newspapers from Netherlands