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 minicomputer voor het DNS-filter Pi-hole om schadelijke code, reclame en trackers buiten de deur te houden. We laten zien hoe je dat filter goed bijhoudt en uitbreidt met DNS-versleuteling en verbeterde bescherming tegen uitval.
Bij het begin van bijna elke internetverbinding 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 domeinnamen omzet naar de bijbehorende IP-adressen.
Oorspronkelijk werd voor het DNS-verkeer geen versleuteling gespecificeerd.
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 versleutelen van het DNS-verkeer. De belangrijkste 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 uitvalrisico van de Pi-hole te minimaliseren, moet Stubby ondersteuning krijgen van de eveneens versleutelende 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ïnstalleerd hebt [2]. Om de handelingen in dit artikel uit te kunnen voeren, heb je alleen wat basiskennis nodig van het werken met de commandline.
Tijdelijk stoppen
Voordat je iets gaan wijzigen, moet je eerst een image van de SD-kaart maken. Afhankelijk 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-configuratie 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 standaardinstelling van de router.
Daarna kun je de Pi uitzetten met
sudo shutdown -h now
Haal de voedingsstekker 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 bovenstaande voorbeeld haalt het dd-commando de data van de schijf sdb. Onder welke schijfbenaming de kaart op je Mac of Linux-pc toegankelijk is, kun je achterhalen met het commando sudo fdisk - l. Voor het terugzetten van een back-up kun je dezelfde tools gebruiken.
Is hij up-to-date?
Als je een back-up gemaakt hebt, stop je de geheugenkaart 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 versienummer 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 waarschijnlijk een paar minuten en zorgt ervoor dat er een aardig aantal statusmeldingen over je scherm heenlopen. Aan het eind moet dan het geïnstalleerde versienummer 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 loggegevens van het updaten. Items die met 'error' of 'fail' gemarkeerd zijn, moeten het makkelijker maken om te zoeken waar de fouten zitten.
Meer DNS-versleutelingen
Pi-hole gebruikt voor de DNS-communicatie de compacte DNS- en DHCP-server Dnsmasq. Dat programma zal binnen afzienbare tijd vermoedelijk geen DoH of DoT bevatten [3]. Als je het DNS-verkeer desondanks toch wilt versleutelen, 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 verwerkingsstation bij op de weg naar de DNS-server. Bovendien communiceren versleutelende proxy's in principe niet meer via UDP, maar met TCP/TLS, wat de latentie sowieso al enigszins verhoogt.
De versleutelende DNS-proxy Stubby zet een aangevraagde domeinnaam niet zelf om in een IP-adres, maar laat dat over aan de voorgeschakelde DNS-server. Het gaat dus duidelijk om een stub-resolver – vandaar vermoedelijk ook de naam.
Veel gebruikers zouden in plaats van Stubby liever een resolver met wat meer functies voor de Pi-hole zetten, bijvoorbeeld Unbound of BIND. Dat moet je echter niet doen. Unbound is bijvoorbeeld geschikt voor caching, resolving, DNSover-TLS, DNSSEC-validering, ad-blocking en voor de lokale DNS-data van een klein netwerk. Maar Dnsmasq is met uitzondering van DoT geschikt voor dezelfde toepassingen, 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 beschikbaarheid van de DNSdienst te verhogen, moet je in de router naast Pi-hole nog een andere DNS-server invullen – bijvoorbeeld van de DNS-dienst van je provider. Om de beschikbaarheid van de Pi-hole met het gelijktijdig versleutelen te verhogen, kun je nog een andere versleutelende proxy op de Raspberry Pi installeren.
Maar als je je privacy toch zoveel mogelijk wilt behouden, kun je beter een proxy gebruiken die ook met niet-commerciële DNS-servers kan communiceren. Een goed alternatief is bijvoorbeeld 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 betrouwbaar. Je kunt als alternatief ook de DoH-proxy cloudflared installeren. Die communiceert wel alleen maar met DNSresolvers van de commerciële aanbieder Cloudflare. Maar als noodmaatregel, dus als Stubby uitvalt of bijgewerkt moet worden, voldoet cloudflared prima.
DNS-over-HTTPS toevoegen
De producent biedt cloudflared aan ter download als voorgecompileerde binary. Je kunt het op de volgende manier in de map /usr/local/bin installeren:
wget https://bin.equinox.io/c/: VdrWdbjqyF/cloudflared-stable-:
linux-arm.tgz
tar -xvzf
cloudflared-stable-linux-arm.tgz sudo cp ./cloudflared /usr/local/bin
Test of de tool goed loopt met het commando cloudflared -v. Om ervoor te zorgen dat de software na elke reboot automatisch opstart, voeg je aan de wachtwoordendatabase de user cloudflared toe:
sudo useradd -s /usr/sbin/nologin
-r -M cloudflared
Maak een configuratiebestand met het commando touch /etc/default/cloudflared. Open dat bestand met een editor naar keuze en voeg daaraan de volgende inhoud toe:
CLOUDFLARED_OPTS=—port 5053
—upstream https://1.1.1.1/dns-query -upstream https://1.0.0.1/dns-query
Stel de juiste toegangsrechten in met
sudo chown cloudflared:cloudflared
/etc/default/cloudflared sudo chown cloudflared:cloudflared
/usr/local/bin/cloudflared
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 cloudflared
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 cloudflared sudo systemctl status cloudflared
Met het dig-commando kun je controleren 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-instellingen 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 bijvoorbeeld Stubby of een andere DNSserver naar keuze.
Stubbiliseren
Stubby kun je inmiddels met de pakketmanager installeren (zie het onderdeel Pakketontvangst). Als je Stubby handmatig gecompileerd hebt, kun je die installatie verwijderen en dan het Stubby-pakket installeren met behulp van apt-get. Maar dat is wel gevoelig voor fouten, zodat het eenvoudiger 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 vooringestelde upstreamresolvers, bijvoorbeeld 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 bibliotheken-cache bij met het commando sudo /sbin/ldconfig.
Controleer vervolgens op welke poort Stubby op binnenkomende DNS-requests wacht (listen-addresses). Open daarvoor het configuratiebestand 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 voorbehouden aan de Avahi-daemon voor de lokale multicast-DNS-communicatie. Zet daarnaast een commentaarteken 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 verschillende loopback-adressen, zodat ze elkaar niet in de weg zitten. Nu je toch bent waar je bent, activeer in het deel eronder meteen de beveiligingstechniek DNSSEC door het commentaarteken voor deze regel te verwijderen:
dnssec: GETDNS_EXTENSION_TRUE
Sla de wijzigingen op met Ctrl+X en y. Dan kan Stubby gesigneerde DNS-reply's controleren op echtheid en de vertrouwenswaardigheid van de bron testen. De totale DNSSEC-installatie 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 zelfstandig binnen. Als bij een reply het valideren mocht mislukken, dan moet Stubby uitgaan van een aanval en mag het meegeleverde IP-adres niet doorgegeven worden. Een browser meldt dan dat hij het aangevraagde domein niet kan bereiken.
Als DNSSEC eenmaal ingeschakeld is, moet je de niet-validerende resolvers uit de betreffende configuraties verwijderen (Pihole, router, computers, …). Anders wordt er bij een beveiligingsprobleem met DNSSEC teruggevallen op onbeveiligde DNS, wat de DNSSEC-bescherming zou omzeilen. Als Stubby een keer een DNS-reply schuldig moet blijven, dan moet je in elk geval controleren waar dat aan ligt voordat je via een niet-validerende resolver met een vervalste DNS-reply komt te zitten.
Laat de rest van de instellingen 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 antwoordende 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 testdoeleinden en het commando moet de foutcode SERVFAIL opleveren. Als je in plaats daarvan een NOERROR met een IPv4-adres terugkrijgt, dan werkt de DNS-beveiliging niet. Controleer dan de configuratie van Stubby.
Met dit commando moet Stubby daarentegen meteen de correct ondertekende DNS-reply's krijgen en valideren:
dig @127.0.0.2 belastingdienst.nl
In het bovenste deel moet status: NOERROR getoond worden en daaronder in het veld flags de extra flag ad staan (authenticated data). Als dat het geval is, dan heeft Stubby een ondertekende 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 versleuteld verder doorstuurt.
Pakketontvangst
Als je Stubby nog niet voor Pi-hole gebruikt, kun je deze tool met de pakketmanager apt-get installeren. 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 configuratiebestand.
We hebben in plaats daarvan dan ook de op 11 januari verschenen Stubby-versie 0.25 uit de Buster-repository succesvol geinstalleerd weten te krijgen op een Raspberry Pi 3B. Buster bevindt zich echter nog in een teststadium.
Als je Stubby 0.25 wilt uitproberen, maak dan een back-up van de Raspberry Pi en voeg de bronnen van de Busterrepository toe (nano /etc/apt/sources. list). Voeg aan de eerste regel testing toe, zodat die er als volgt uitziet:
deb http://raspbian.raspberrypi.org/: raspbian/ testing main contrib
non-free rpi
Werk de pakketlijst bij met apt-get update en installeer vervolgens Stubby met aptget install stubby. Afhankelijk van wat er allemaal al bij je Raspbian geïnstalleerd staat, komen daar met apt-get nog een handvol pakketten bij. Bij een aantal laat de installer wat begeleidende informatie zien, maar bij andere moet je er genoegen mee nemen dat eventueel draaiende services onderbroken worden (bijvoorbeeld bij OpenSSL-updates).
Meteen na het installeren moet Stubby automatisch als service gestart zijn. Dat kun je controleren 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 listenadres 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 DNSresolver opgegeven is. Normaal gesproken zullen er zelfs meerdere aanwezig en ook actief zijn. Meer voorstellen 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 commentaartekens # te verwijderen. Hou er wel rekening mee dat servers van commerciële aanbieders zoals Cloudflare (1.1.1.1) wel snel antwoorden, maar de verbindingslogs opslaan en analyseren. Als je dat wilt vermijden, laat je het commentaarteken voor de betreffende regel gewoon staan. Sla de veranderingen 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 admininterface 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 beveiligingstechniek ook benut gaat worden. Klik rechtsonder op Save om de veranderingen op te slaan en meteen te activeren.
Daarmee zijn Pi-hole en Stubby dan geïnstalleerd en geconfigureerd. Pi-hole moet op zijn dashboard dan laten zien dat er DNS-requests binnenkomen en verwerkt worden. Mocht Stubby een keer uitvallen, dan deactiveer je de desbetreffende DNS-instelling bij Pi-hole en activeer je de hulp-proxy dnss om het probleem zonder tijdsdruk te kunnen verhelpen. (nkr)