DNS-server Unbound privacyvriendelijk configureren en blokkades omzeilen

Noud van Kruysbergen
0

Op internet maakt iedereen dagelijks gebruik van DNS zonder er bij stil te staan. Het Domain Name System fungeert namelijk als het telefoonboek van het internet. Tegelijk weten exploitanten van een DNS-server precies welke sites je op op welk moment gebruikt. Dit is alleen te voorkomen door een eigen DNS-server op zetten. En als je dat toch doet, kun je hem meteen privacyvriendelijk configureren en een paar nieuwe vaardigheden bijbrengen. Zo kun je bijvoorbeeld eenvoudig blokkades omzeilen. Wij gingen hiervoor aan de slag met de DNS-server Unbound.

Als je via een browser een website als www.ct.nl wilt bezoeken, moet je browser het bijbehorende IP-adres achterhalen. Daarvoor stuurt hij normaal gesproken een verzoek aan je router, die het verzoek linea recta doorzet naar de DNS-server van je provider. Die heeft het adres soms al in zijn cache zitten. Is dat niet het geval, dan zet die het verzoek weer naar hogerhand door. Uiteindelijk komt er echter een IP-adres terug, waardoor je browser de webpagina kan ophalen. Dit gebeurt allemaal op de achtergrond, waardoor je er als gebruiker zelden tot nooit bij stilstaat. Door de manier waarop het systeem is opgezet, weet je provider echter precies welke websites je allemaal bezoekt. Daarnaast kunnen rechters providers dwingen om bepaalde sites op dns-niveau te blokkeren.

Natuurlijk weet ook een privé-DNS-server niet het IP-adres van alle domeinen in de wereld, maar je kunt hem in ieder geval zo instellen dat hij verzoeken verdeeld over verschillende publieke DNS-servers. Daardoor wordt je surfhistorie ook verspreid over meerdere servers en krijgt geen enkele aanbieder een compleet plaatje. Daarnaast omzeil je zo ook domeinblokkades van je provider.

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 typefout 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 DNS-server maar die van Google in te stellen. Maar de responses daarvan komen onbeveiligd bij je router binnen en kunnen dan eenvoudig 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 uit de repository’s van de distributie. Bij FreeBSD vanaf versie 10.1 en macOS vanaf versie 10.11 is Unbound standaard al geïnstalleerd. Windowsgebruikers halen Unbound op van bovenstaande website.

Wij installeerden en configureerden Unbound op een Debian-systeem. De configuratiebestanden werken echter ook op andere besturingssystemen. Je kunt Unbound bijvoorbeeld ook op een energiezuinige Raspberry Pi of een laptop installeren. Het meeste werk tijdens de installatie gaat via de terminal, maar vergt geen bijzondere kennis. Hooguit wat zorgvuldigheid bij het intypen van de commando’s.

Voor de installatie zijn we uitgegaan van Debian 8.8. Veel repository’s gaan nog uit van oudere Unbound-versies. Onze Debian 8.8 (“Jessie”) gebruikt standaard bijvoorbeeld Unbound 1.4.22, terwijl versie 1.6.2 inmiddels beschikbaar is. Om nieuwere Unbound-versies te gebruiken, moet je bij pakketmanager apt de backports-optie instellen. Die optie zet je het beste in een apart bestand. Open een commandline en typ het volgende in (gevolgd door het Administrator-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 alleen nog versie 1.6.0 in het assortiment:

apt update

apt-get -t jessie-backports install unbound

Unbound kan conf-bestanden in de subfolder /etc/unbound/unbound.conf.d/ automatisch verwerken. Voorwaarde hiervoor is wel dat in /etc/unbound/unbound.conf de regel include:”/etc/unbound/ unbound.conf.d/*.conf” staat en niet uitgecommentarieerd is. Dit heeft als grote voordeel dat de configuratie modulair is en uit meerdere bestanden kan bestaan. Zo kun je inhoudelijk verschillende zaken over verschillende bestanden met sprekende namen verdelen. Dat is bij de door ons gemaakte bestanden ook het geval.

Configuratie

Bij veel routers kun je bij de ingebouwde DHCP-server willekeurige DNS-servers instellen voor het lokale netwerk.

Downloadt het zip-archief op je computer en pak het uit. 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 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 vastlegt 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 van je LAN, 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 de sectie 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 typefouten. Na een herstart gebruikt Unbound de nieuwe configuratie:

sudo service unbound restart

Snelle test 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 DNS-responsen 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 publieke 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

Vlaggen

Als het antwoord van een betrouwbare 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 IPv6- fragmentatie (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 Unbound-server. 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

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.

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. 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. Dan is de router onafhankelijk van de beschikbaarheid van je Unbound-server.

(Andreas Itzchak Rehberg / Noud van Kruysbergen)

Meer over

Servers

Deel dit artikel

Lees ook

Een middenklasse laptop kiezen: tips en suggesties

Wil je een laptop met een goede prijs-prestatieverhouding? Een krachtiger model waarmee je behalve internetten ook prima kunt fotobewerken of andere s...

Koptelefoon vergelijken met software en testtonen

Wil je de ene hoofdtelefoon vergelijken met de andere, dan moet je systematisch te werk gaan. Dat kan met je eigen oren, gratis software en onze testt...

0 Praat mee

avatar
  Abonneer  
Laat het mij weten wanneer er