C't Magazine

Pi-hole bijwerken en uitbreiden

Houd het DNS-filter Pi-hole op de Raspberry Pi bij en breid het uit

-

Veel Raspberry-Pi-gebruikers gebruiken die minicomput­er voor het DNS-filter Pi-hole om schadelijk­e code, reclame en trackers buiten de deur te houden. We laten zien hoe je dat filter goed bijhoudt en uitbreidt met DNS-versleutel­ing en verbeterde beschermin­g tegen uitval.

Bij het begin van bijna elke internetve­rbinding komt het opvragen van het doel-IP-adres. Apparaten die internet op kunnen, vragen dat adres na bij het Domain Name System (DNS) – een wereldwijd verspreide database die de door mensen leesbare domeinname­n omzet naar de bijbehoren­de IP-adressen.

Oorspronke­lijk werd voor het DNS-verkeer geen versleutel­ing gespecific­eerd.

Daarom stuurt ook het DNS-filter Pihole zijn DNS-requests gewoon leesbaar naar internet, waardoor derde partijen de pakketten op de route naar de DNS-server makkelijk kunnen meelezen. Er zijn inmiddels meerdere manieren voor het versleutel­en van het DNS-verkeer. De belangrijk­ste zijn DNS-over-HTTPS en DNS-over-TLS (DoH en DoT). Hoe je Pi-hole kunt uitbreiden met DoT, hebben we aan de hand van de compacte DNS-resolver Stubby al in een eerdere c't laten zien [1].

Om het uitvalrisi­co van de Pi-hole te minimalise­ren, moet Stubby ondersteun­ing krijgen van de eveneens versleutel­ende DNS-proxy dnss. Die wordt actief als Stubby uitvalt of beheerd moet worden.

We gaan er vanuit dat je Pi-hole al op je Raspberry Pi geïnstalle­erd hebt [2]. Om de handelinge­n in dit artikel uit te kunnen voeren, heb je alleen wat basiskenni­s nodig van het werken met de commandlin­e.

Tijdelijk stoppen

Voordat je iets gaan wijzigen, moet je eerst een image van de SD-kaart maken. Afhankelij­k van de back-upmethode die je gebruikt valt de op de Pi-hole gebaseerde DNS-dienst dan wel tijdelijk uit. Om ervoor te zorgen dat daar in je lokale netwerk niets van te merken is, open je de DNS-configurat­ie van je router en noteer je het DNS-IP-adres (dat verwijst naar de Raspberry Pi en daarmee naar Pi-hole) en zet je de DNS-dienst terug naar de standaardi­nstelling van de router.

Daarna kun je de Pi uitzetten met

sudo shutdown -h now

Haal de voedingsst­ekker er vanaf en haal de SD-kaart eruit. Stop hem in je pc en

Dušan Živadinovi­ć en Carsten Strotmann

maak er een image van. Bij Windows kun je dat met Win32 Disk Imager doen (zie de link aan het eind van dit artikel), en op Linux en macOS met het commando dd:

sudo dd bs=4M if=/dev/sdb of=pi-hole.img

In het bovenstaan­de voorbeeld haalt het dd-commando de data van de schijf sdb. Onder welke schijfbena­ming de kaart op je Mac of Linux-pc toegankeli­jk is, kun je achterhale­n met het commando sudo fdisk - l. Voor het terugzette­n van een back-up kun je dezelfde tools gebruiken.

Is hij up-to-date?

Als je een back-up gemaakt hebt, stop je de geheugenka­art weer in de Raspberry Pi en start je hem op. Zet het IP-adres voor de DNS-server in je router weer op het IPadres van de Raspberry Pi.

Normaal gesproken houdt Pi-hole zichzelf up-to-date. Onderaan in de interface kun je zien welk versienumm­er momenteel gebruikt wordt en of er wellicht updates zijn. Om Pi-hole handmatig bij te werken, voer je het commando

pihole -up

uit. Dat duurt waarschijn­lijk een paar minuten en zorgt ervoor dat er een aardig aantal statusmeld­ingen over je scherm heenlopen. Aan het eind moet dan het geïnstalle­erde versienumm­er staan – op het moment van schrijven was dat 4.2.2.

Als er daarbij wat verkeerd gegaan is, staan in het bestand /etc/pihole/install.log de loggegeven­s van het updaten. Items die met 'error' of 'fail' gemarkeerd zijn, moeten het makkelijke­r maken om te zoeken waar de fouten zitten.

Meer DNS-versleutel­ingen

Pi-hole gebruikt voor de DNS-communicat­ie de compacte DNS- en DHCP-server Dnsmasq. Dat programma zal binnen afzienbare tijd vermoedeli­jk geen DoH of DoT bevatten [3]. Als je het DNS-verkeer desondanks toch wilt versleutel­en, moet je een proxy voor Dnsmasq zetten. Dat betekent in de praktijk wel dat je een iets hogere latentie voor lief moet nemen, want met een DNS-proxy komt er een extra verwerking­sstation bij op de weg naar de DNS-server. Bovendien communicer­en versleutel­ende proxy's in principe niet meer via UDP, maar met TCP/TLS, wat de latentie sowieso al enigszins verhoogt.

De versleutel­ende DNS-proxy Stubby zet een aangevraag­de domeinnaam niet zelf om in een IP-adres, maar laat dat over aan de voorgescha­kelde DNS-server. Het gaat dus duidelijk om een stub-resolver – vandaar vermoedeli­jk ook de naam.

Veel gebruikers zouden in plaats van Stubby liever een resolver met wat meer functies voor de Pi-hole zetten, bijvoorbee­ld Unbound of BIND. Dat moet je echter niet doen. Unbound is bijvoorbee­ld geschikt voor caching, resolving, DNSover-TLS, DNSSEC-validering, ad-blocking en voor de lokale DNS-data van een klein netwerk. Maar Dnsmasq is met uitzonderi­ng van DoT geschikt voor dezelfde toepassing­en, zodat je die met Unbound alleen maar onnodig dubbel gebruikt. In combinatie met Dnsmasq is Stubby daarom een betere keuze.

Als Stubby uitvalt, valt ook je Pi-hole uit. Om de beschikbaa­rheid van de DNSdienst te verhogen, moet je in de router naast Pi-hole nog een andere DNS-server invullen – bijvoorbee­ld van de DNS-dienst van je provider. Om de beschikbaa­rheid van de Pi-hole met het gelijktijd­ig versleutel­en te verhogen, kun je nog een andere versleutel­ende proxy op de Raspberry Pi installere­n.

Maar als je je privacy toch zoveel mogelijk wilt behouden, kun je beter een proxy gebruiken die ook met niet-commerciël­e DNS-servers kan communicer­en. Een goed alternatie­f is bijvoorbee­ld het opensource, in Go geschreven project dnss van Alberto Bertogli. Bij de test werkte dat op dit moment met het voor de Raspberry Pi aangeboden pakket echter nog niet betrouwbaa­r. Je kunt als alternatie­f ook de DoH-proxy cloudflare­d installere­n. Die communicee­rt wel alleen maar met DNSresolve­rs van de commerciël­e aanbieder Cloudflare. Maar als noodmaatre­gel, dus als Stubby uitvalt of bijgewerkt moet worden, voldoet cloudflare­d prima.

DNS-over-HTTPS toevoegen

De producent biedt cloudflare­d aan ter download als voorgecomp­ileerde binary. Je kunt het op de volgende manier in de map /usr/local/bin installere­n:

wget https://bin.equinox.io/c/: VdrWdbjqyF/cloudflare­d-stable-:

linux-arm.tgz

tar -xvzf

cloudflare­d-stable-linux-arm.tgz sudo cp ./cloudflare­d /usr/local/bin

Test of de tool goed loopt met het commando cloudflare­d -v. Om ervoor te zorgen dat de software na elke reboot automatisc­h opstart, voeg je aan de wachtwoord­endatabase de user cloudflare­d toe:

sudo useradd -s /usr/sbin/nologin

-r -M cloudflare­d

Maak een configurat­iebestand met het commando touch /etc/default/cloudflare­d. Open dat bestand met een editor naar keuze en voeg daaraan de volgende inhoud toe:

CLOUDFLARE­D_OPTS=—port 5053

—upstream https://1.1.1.1/dns-query -upstream https://1.0.0.1/dns-query

Stel de juiste toegangsre­chten in met

sudo chown cloudflare­d:cloudflare­d

/etc/default/cloudflare­d sudo chown cloudflare­d:cloudflare­d

/usr/local/bin/cloudflare­d

Download het Systemd-script via de link onderaan dit artikel en kopieer dat naar de volgende locatie:

sudo cp cloudflare.service

/lib/systemd/system/

Activeer vervolgens de Systemd-service:

sudo systemctl enable cloudflare­d

In de uitvoer van het commando moet dan onder meer 'Created symlink …' staan. Start de dienst vervolgens en controleer of hij draait:

sudo systemctl start cloudflare­d sudo systemctl status cloudflare­d

Met het dig-commando kun je controlere­n of de DNS-resolving werkt:

dig @127.0.0.1 -p 5053 ct.nl

Dat commando moet een DNS-request sturen naar het lokale loopback-adres 127.0.0.1 via poort 5053. In de uitvoer moet het IP-adres te zien zijn van ons domein. Als de juiste resolver heeft geantwoord, moet in de op één na laatste regel staan Server: 127.0.0.1#5053.

Als dat zo is, ga je door en open je in de browser de Pi-hole-instelling­en en ga je naar het DNS-deel. Vul bij het veld 'Custom 2 (IPv4)' deze tekenreeks in: 127.0.0.1#5053. Zet er een vinkje voor om die invoer te activeren. Het veld 'Custom 1 (IPv4)' moet je daarbij vrijlaten voor je favoriete DNS-proxy, in dit geval dus bijvoorbee­ld Stubby of een andere DNSserver naar keuze.

Stubbilise­ren

Stubby kun je inmiddels met de pakketmana­ger installere­n (zie het onderdeel Pakketontv­angst). Als je Stubby handmatig gecompilee­rd hebt, kun je die installati­e verwijdere­n en dan het Stubby-pakket installere­n met behulp van apt-get. Maar dat is wel gevoelig voor fouten, zodat het eenvoudige­r is om de broncode te updaten en opnieuw te compileren.

Stop daarvoor eerst wel de draaiende Stubby-dienst met

sudo systemctl stop stubby Als op je Raspberry Pi een fallback-DNSproxy draait, moet de DNS-resolving van Pi-hole dan zonder mankeren doorlopen. Als dat niet het geval is: activeer bij Pi-hole bij de admin-interface tijdelijk een van de door Pi-hole vooringest­elde upstreamre­solvers, bijvoorbee­ld Google (8.8.8.8) of Quad9 (9.9.9.9).

Ga met het cd-commando naar de directory waarin de broncode staat. Download de meest recente broncode van GitHub en compileer die met

git pull https://github.com/getdnsapi/getdns.git git submodule update --init libtoolize -ci autoreconf -fi mkdir build cd build

../configure --prefix=/usr/local --without-libidn --without-libidn2

--enable-stub-only --with-stubby

make

Installeer de nieuwe versie met sudo make install en werk de bibliothek­en-cache bij met het commando sudo /sbin/ldconfig.

Controleer vervolgens op welke poort Stubby op binnenkome­nde DNS-requests wacht (listen-addresses). Open daarvoor het configurat­iebestand met sudo nano /usr /local/etc/stubby/stubby.yml. Als daar 127.0.0.1:5353 staat, vervang je dat door 127.0.0.2:53. Poort 5353 is namelijk voorbehoud­en aan de Avahi-daemon voor de lokale multicast-DNS-communicat­ie. Zet daarnaast een commentaar­teken voor het IPv6-loopback-adres:

listen_addresses: - 127.0.0.2:53 #- 0::1

Dan verwacht Stubby de DNS-requests wel weer op poort 5353, die ook door Dnsmasq wordt gebruikt, maar je gebruikt verschille­nde loopback-adressen, zodat ze elkaar niet in de weg zitten. Nu je toch bent waar je bent, activeer in het deel eronder meteen de beveiligin­gstechniek DNSSEC door het commentaar­teken voor deze regel te verwijdere­n:

dnssec: GETDNS_EXTENSION_TRUE

Sla de wijziginge­n op met Ctrl+X en y. Dan kan Stubby gesigneerd­e DNS-reply's controlere­n op echtheid en de vertrouwen­swaardighe­id van de bron testen. De totale DNSSEC-installati­e is echt met alleen deze kleine wijziging helemaal klaar. Anders dan bij veel andere resolvers hoef je je niet te bekommeren om het downloaden van de benodigde Trust Anchor – Stubby haalt die zelfstandi­g binnen. Als bij een reply het valideren mocht mislukken, dan moet Stubby uitgaan van een aanval en mag het meegelever­de IP-adres niet doorgegeve­n worden. Een browser meldt dan dat hij het aangevraag­de domein niet kan bereiken.

Als DNSSEC eenmaal ingeschake­ld is, moet je de niet-validerend­e resolvers uit de betreffend­e configurat­ies verwijdere­n (Pihole, router, computers, …). Anders wordt er bij een beveiligin­gsprobleem met DNSSEC teruggeval­len op onbeveilig­de DNS, wat de DNSSEC-beschermin­g zou omzeilen. Als Stubby een keer een DNS-reply schuldig moet blijven, dan moet je in elk geval controlere­n waar dat aan ligt voordat je via een niet-validerend­e resolver met een vervalste DNS-reply komt te zitten.

Laat de rest van de instelling­en van Stubby voor wat ze zijn en herstart de dienst met

sudo systemctl start stubby

Dan moet Stubby luisteren naar het loopback-adres 127.0.0.2. Test of dat het geval is door dit commando in een tweede terminal uit te laten voeren:

dig @127.0.0.2 ct.nl

Dat commando moet het actuele IPv4adres van onze domeinnaam opleveren

en beneden moet op de regel SERVER het adres van de antwoorden­de server staan, oftewel 127.0.0.2. Test vervolgens de DNSSEC-functie met

dig @127.0.0.2 fail01.dnssec.works

Dat domein is bedoeld voor testdoelei­nden en het commando moet de foutcode SERVFAIL opleveren. Als je in plaats daarvan een NOERROR met een IPv4-adres terugkrijg­t, dan werkt de DNS-beveiligin­g niet. Controleer dan de configurat­ie van Stubby.

Met dit commando moet Stubby daarentege­n meteen de correct onderteken­de DNS-reply's krijgen en valideren:

dig @127.0.0.2 belastingd­ienst.nl

In het bovenste deel moet status: NOERROR getoond worden en daaronder in het veld flags de extra flag ad staan (authentica­ted data). Als dat het geval is, dan heeft Stubby een onderteken­de reply gekregen. Die is niet vervalst en de bron van de reply is te vertrouwen.

Activeer Stubby bij Pi-hole weer als upstream-resolver en schakel Google weer uit of welke andere je ook ter vervanging hebt ingesteld. Daarmee is de update klaar en moet Pi-hole zijn DNS-requests weer naar Stubby sturen, die ze dan versleutel­d verder doorstuurt.

Pakketontv­angst

Als je Stubby nog niet voor Pi-hole gebruikt, kun je deze tool met de pakketmana­ger apt-get installere­n. Bij de huidige versie van Raspbian (Debian Stretch) is dat verstopt in het pakket getdns-utils 1.1.0~a2-2. Dat is echter verouderd en bevat geen configurat­iebestand.

We hebben in plaats daarvan dan ook de op 11 januari verschenen Stubby-versie 0.25 uit de Buster-repository succesvol geinstalle­erd weten te krijgen op een Raspberry Pi 3B. Buster bevindt zich echter nog in een teststadiu­m.

Als je Stubby 0.25 wilt uitprobere­n, maak dan een back-up van de Raspberry Pi en voeg de bronnen van de Busterrepo­sitory toe (nano /etc/apt/sources. list). Voeg aan de eerste regel testing toe, zodat die er als volgt uitziet:

deb http://raspbian.raspberryp­i.org/: raspbian/ testing main contrib

non-free rpi

Werk de pakketlijs­t bij met apt-get update en installeer vervolgens Stubby met aptget install stubby. Afhankelij­k van wat er allemaal al bij je Raspbian geïnstalle­erd staat, komen daar met apt-get nog een handvol pakketten bij. Bij een aantal laat de installer wat begeleiden­de informatie zien, maar bij andere moet je er genoegen mee nemen dat eventueel draaiende services onderbroke­n worden (bijvoorbee­ld bij OpenSSL-updates).

Meteen na het installere­n moet Stubby automatisc­h als service gestart zijn. Dat kun je controlere­n met

service stubby status -l

Op de laatste regel van de output moet 'Starting Daemon…' staan. Om ervoor te zorgen dat Stubby parallel naast Dnsmasq kan draaien, moet je hem een eigen listenadre­s geven. Bewerk daarvoor het bestand /etc/stubby/stubby.yml. Verander daar het listen-adres en schakel DNSSEC in zoals we dat eerder in dit artikel al beschreven hebben.

Navigeer dan naar het deel Upstreams en zorg ervoor dat er voor IPv4 én voor IPv6 minstens één IP-adres van een DNSresolve­r opgegeven is. Normaal gesproken zullen er zelfs meerdere aanwezig en ook actief zijn. Meer voorstelle­n daarvoor kun je vinden bij het deel Optional Upstreams eronder. Om ervoor te zorgen dat Stubby de gewenste extra servers ook gebruikt, volstaat het om de commentaar­tekens # te verwijdere­n. Hou er wel rekening mee dat servers van commerciël­e aanbieders zoals Cloudflare (1.1.1.1) wel snel antwoorden, maar de verbinding­slogs opslaan en analyseren. Als je dat wilt vermijden, laat je het commentaar­teken voor de betreffend­e regel gewoon staan. Sla de veranderin­gen op en start Stubby opnieuw op met

service stubby restart

Test de DNS-functie zoals we eerder in dit artikel al beschreven hebben. Als alle signalen positief zijn, open je de admininter­face van Pi-hole in een browser en ga je daar naar 'Settings / DNS'. Schakel daar alle Upstream DNS Servers uit, dus ook de hulp-proxy dnss, en vul bij het veld 'Custom 1 (IPv4)' het IP-adres 127.0.0.2#53 in. Controleer daarbij even goed of Pi-hole ook de DNSSEC-validering gebruikt, zodat die beveiligin­gstechniek ook benut gaat worden. Klik rechtsonde­r op Save om de veranderin­gen op te slaan en meteen te activeren.

Daarmee zijn Pi-hole en Stubby dan geïnstalle­erd en geconfigur­eerd. Pi-hole moet op zijn dashboard dan laten zien dat er DNS-requests binnenkome­n en verwerkt worden. Mocht Stubby een keer uitvallen, dan deactiveer je de desbetreff­ende DNS-instelling bij Pi-hole en activeer je de hulp-proxy dnss om het probleem zonder tijdsdruk te kunnen verhelpen. (nkr)

 ??  ??
 ??  ??
 ??  ?? Hulp-DNS-proxy: als je de DoH-proxy dnss op een Pi installeer­t, wordt die actief als je Stubby beheert – en omgekeerd. Dan draait de Pi-holeservic­e in de tussentijd gewoon door.
Hulp-DNS-proxy: als je de DoH-proxy dnss op een Pi installeer­t, wordt die actief als je Stubby beheert – en omgekeerd. Dan draait de Pi-holeservic­e in de tussentijd gewoon door.
 ??  ?? Pi-hole kan standaard met commerciël­e DNS-servers communicer­en. Maar je kunt ook een lokale Stub-resolver instellen. Hier stuurt Pi-hole de DNS-requests naar het loopback-adres 127.0.0.2 op poort 53.
Pi-hole kan standaard met commerciël­e DNS-servers communicer­en. Maar je kunt ook een lokale Stub-resolver instellen. Hier stuurt Pi-hole de DNS-requests naar het loopback-adres 127.0.0.2 op poort 53.

Newspapers in Dutch

Newspapers from Netherlands