Ver­sleu­tel­de DNS-re­quests met Pi-ho­le en Stub­by

Ver­sleu­tel­de DNS-re­quests met Pi-ho­le

C’t Magazine - - Inhoud 9/2018 - Ro­nald Ei­ken­berg

Het groot­ste deel van het in­ter­net­ver­keer is in­mid­dels ver­sleu­teld. DNS-re­quests gaan ech­ter nog steeds ge­woon als lees­ba­re tekst via de ka­bels – en daar­door kun­nen der­den in­zicht krij­gen in je in­ter­net­ge­drag. Met een Rasp­ber­ry Pi, Pi-ho­le en Stub­by kun je ook dat pri­va­cy­lek dich­ten.

In de vo­ri­ge c't heb­ben we la­ten zien hoe je de Rasp­ber­ry Pi als DNS-fil­ter ge­bruikt om mal­wa­re, re­cla­me en trac­kers uit je he­le net­werk te hou­den [1]. Daar heb­ben we het to­taal­pak­ket Pi-ho­le bij ge­bruikt, dat mak­ke­lijk te in­stal­le­ren is en via zijn we­bin­ter­fa­ce een­vou­dig ge­con­fi­gu­reerd kan wor­den. De Rasp­ber­ry Pi loopt met en­kel die taak ze­ker niet te­gen zijn gren­zen aan, dus dat biedt mooi ge­le­gen­heid om hem ook te ge­brui­ken voor DNS over TLS (DoT). Dat is nog een ef­fec­tie­ve maat­re­gel ter be­scher­ming van je pri­va­cy. Hier­mee wor­den je DNSre­quests ver­sleu­teld ver­zon­den in plaats van als lees­ba­re tekst. In de vol­gen­de c't gaan we wat meer in op de ach­ter­gron­den daar­van, nu rich­ten we ons op de prak­tijk.

We gaan er van­uit dat je al een Rasp­ber­ry Pi met Pi-ho­le hebt draai­en. Als dat nog niet het ge­val is, volg dan eerst het ar­ti­kel uit de vo­ri­ge c't, waar het in­stal­le­ren stap voor stap wordt be­han­deld. Wil je niet een Rasp­ber­ry Pi als DNS-fil­ter ge­brui­ken, dan kun je met het con­cept dat we hier be­schrij­ven ook Win­dows-, Li­nux- en macOS-clients in­stru­e­ren om zelf de DNS-re­quests te ver­sleu­te­len (zie het ka­der 'Stub­by op de client').

Pi-ho­le ge­bruikt daar­bij de DNS­ser­ver dns­masq om de DNS-re­quests uit het lo­ka­le net­werk te be­ant­woor­den. Die stuurt het re­quest uit­ein­de­lijk ook al­leen maar door naar een an­de­re na­me­ser­ver – en dat in lees­ba­re tekst. Om er­voor te zor­gen dat de via Pi-ho­le af­ge­han­del­de com­mu­ni­ca­tie met de na­me­ser­ver op in­ter­net ver­sleu­teld wordt, heb je wat ex­tra hulp no­dig. Daar blijkt Stub­by goe­de dien­sten te kun­nen be­wij­zen. Die tool van het DNS Pri­va­cy Pro­ject be­ant­woordt DNSre­quests lo­kaal via UDP-poort 53, maar com­mu­ni­ceert naar bui­ten via DoT met DNS-ser­vers op in­ter­net (via TCP-poort 853). De dns­masq van Pi-ho­le stuurt zijn re­quests dan niet meer naar een ex­ter­ne na­me­ser­ver, maar naar de lo­ka­le Stub­by. Daar­door fil­tert Pi-ho­le de DNS-re­quests van clients in het lo­ka­le net­werk in eer­ste in­stan­tie net als voor­heen, voor­dat ze naar Stub­by wor­den ge­stuurd. Die stuurt ze ver­sleu­teld door naar na­me­ser­vers op in­ter­net.

Als je niet met een nieu­we Rasp­bi­an­in­stal­la­tie start, moet je een ima­ge van de sd-kaart in de Pi ma­ken voor­dat je be­gint. Bij Win­dows kan dat bij­voor­beeld met Win32 Disk Ima­ger, on­der Li­nux en macOS met het com­man­do dd. Dan kun je la­ter al­tijd nog de ou­de si­tu­a­tie her­stel­len als er iets mis­loopt of als je niet te­vre­den bent met de na­me-re­sol­ving via DoT.

Stub­by in­stal­le­ren

Toen we aan dit ar­ti­kel be­gon­nen, zat Stub­by nog niet in de Rasp­bi­an-re­po­si­to­ry – het goe­de nieuws is dat je de bron­co­de die op Git­hub staat mak­ke­lijk op de Rasp­ber­ry Pi kunt com­pi­le­ren. Daar­mee zorg je er­voor dat je al­tijd de laat­ste ver­sie krijgt. Voor het com­pi­le­ren heb je maar

een paar com­man­do's no­dig. Maak eerst via SSH ver­bin­ding met de Rasp­ber­ry Pi en in­stal­leer de be­no­dig­de pak­ket­ten met het vol­gen­de com­man­do:

su­do apt-get in­stall libtool au­to­conf

m4 libs­sl-dev li­by­aml-dev

Ver­vol­gens down­load je de co­de van Git­hub en be­gin je met het com­pi­le­ren:

git clo­ne htt­ps://git­hub.com/

get­d­nsapi/get­d­ns.git cd get­d­ns git sub­mo­du­le up­da­te --init libtooli­ze -ci au­to­re­conf -fi mk­dir build cd build

../con­fi­gu­re --pre­fix=/usr/lo­cal --wit­hout-li­bidn --wit­hout-li­bidn2

--ena­ble-stub-on­ly --with-stub­by

ma­ke

Daar­na start je het in­stal­le­ren met su­do ma­ke in­stall en werk je de bi­bli­o­theek­ca­che bij met su­do /bin/ld­con­fig.

Dan wordt het tijd al­les te gaan con­fi­gu­re­ren. Open het con­fi­gu­ra­tie­be­stand met su­do na­no /usr/lo­cal/etc/stub­by/stub­by.yml en ver­an­der bij 'LISTEN ADDRESS' het poort­num­mer waar Stub­by lo­kaal mee moet wer­ken. Stan­daard ge­bruikt de tool de DNS-poort 53 – maar die wordt al ge­bruikt door de DNS-ser­ver van Pi-ho­le. In plaats daar­van kun je bij­voor­beeld poort 5353 ge­brui­ken:

lis­ten_ad­dres­ses: - 127.0.0.1@5353 - 0::1@5353

Daar­na geef je bij 'UPSTREAMS' nog aan naar wel­ke DNS-ser­ver Stub­by de DNSre­quests via DoT moet stu­ren. Een groot aan­tal ser­vers is al ge­ac­ti­veerd, een aan­tal an­de­re is uit ge­com­men­ta­ri­eerd door een hek­je (#) aan het be­gin van de re­gel en daar­door niet ac­tief. Het aan­bod is groot: op de lijst staan on­der meer com­mer­cie­le aan­bie­ders als Cloud­fla­re (1.1.1.1) en Goog­le (8.8.8.8), waar­van je een ho­ge snel­heid en be­schik­baar­heid mag ver­wach­ten. Zij ge­ven aan de in­for­ma­tie die tot per­so­nen te her­lei­den is, dus met na­me het ipadres van een ge­brui­ker, na hoog­stens 48 uur te ver­wij­de­ren. An­de­re da­ta zo­als het op­ge­vraag­de do­mein en het ge­bruik­te ver­bin­dings­pro­to­col wor­den daar­en­te­gen lan­ger op­ge­sla­gen en ge­a­na­ly­seerd. Als je die be­drij­ven niet ver­trouwt, zijn er ook tal­rij­ke niet-com­mer­ci­ë­le DNS-re­sol­vers die al met DoT over­weg kun­nen. Een daar­van is get­d­nsapi.net, die net als Stub­by bij het DNS Pri­va­cy Pro­ject hoort. Een an­der da­ta­be­scher­mings­vrien­de­lijk al­ter­na­tief is se­cu­red­ns.eu. De ex­ploi­tant daar­van geeft aan geen da­ta in com­bi­na­tie met DNS te log­gen.

Ver­wij­der in het con­fi­gu­ra­tie­be­stand de hek­jes bij de ser­vers die je wilt ge­brui­ken, en zet juist wel een hek­je bij ser­vers waar­van je niet wilt dat Stub­by die ge­bruikt. Met de pa­ra­me­ter round_ro­bin_ upstreams on­der 'CONNECTION SET­TINGS' kun je in­stel­len of Stub­by de re­quests over meer­de­re DNS-ser­vers moet ver­sprei­den. Die op­tie is stan­daard in­ge­scha­keld (1). Als je die waar­de op 0 zet, dan ge­bruikt Stub­by de eer­ste DNS-ser­ver op de lijst. Als die niet be­reik­baar is, wordt au­to­ma­tisch door­ge­scha­keld naar de twee­de op de lijst. Als je klaar bent met het con­fi­gu­ra­tie­be­stand, sla je de ver­an­de­rin­gen op met Ctrl+O en En­ter en be­ëin­dig je de tekst­edi­tor na­no met Ctrl+X.

Test daar­na met su­do stub­by of het in­stal­le­ren ge­lukt is. Ver­vol­gens be­ëin­dig je de tool weer met Ctrl+C. Stub­by is daar­na een es­sen­ti­ë­le com­po­nent in je net­wer­k­in­fra­struc­tuur – als die tool niet draait, dan kan Pi-ho­le geen na­me-re­sol­ving meer uit­voe­ren en is het in­ter­net dood voor je net­werk. Om­dat het pro­gram­ma dus al­tijd ac­tief moet zijn, moet je het in­stel­len als sy­s­temd-ser­vi­ce. Door de Git-check­out heb je al een pas­send sja­bloon voor de dienst, na­me­lijk het be­stand stub­by.ser­vi­ce in het pad /ho­me/pi/get­d­ns/stub­by/ sy­s­temd/. Open dat be­stand met na­no: na­no /ho­me/pi/get­d­ns/stub­by/sy­s­temd/

stub­by.ser­vi­ce

en ver­an­der daar­in de waar­de met de naam 'ExecStart' van /usr/bin/stub­by naar /usr/lo­cal/bin/stub­by. Sla de ver­an­de­ring weer op met Ctrl+O, En­ter en Ctrl+X. Ver­vol­gens ko­pi­eer je het sja­bloon nog naar de juis­te plek op het sys­teem:

su­do cp /ho­me/pi/get­d­ns/stub­by/ sy­s­temd/stub­by.ser­vi­ce

/lib/sy­s­temd/sy­s­tem/

Voor­dat je de dienst start, moet je met su­do use­radd stub­by een nieu­we ge­brui­ker aan­ma­ken om­dat Stub­by an­ders als root uit­ge­voerd zou kun­nen wor­den. Bo­ven­dien moet je nog de ca­che-di­rec­to­ry aan­ma­ken. Dat doe je met het com­man­do su­do mk­dir /var/ca­che/stub­by. Dan zijn al­le be­no­dig­de voor­be­rei­din­gen zo'n beet­je klaar. Ac­ti­veer en start de Stub­by­ser­vi­ce met de vol­gen­de com­man­do's:

su­do sys­temctl ena­ble stub­by su­do sys­temctl start stub­by

Met het vol­gen­de com­man­do kun je ve­ri­fi­ë­ren of Stub­by daad­wer­ke­lijk op poort 553 op DNS-re­quests staat te wach­ten:

dig @127.0.0.1 -p 5353 ct.nl

Als al­les goed is ge­gaan, dan ant­woordt de tool met het ip-adres van de c't-ser­ver. Stub­by is dan ge­start – en jij bent bij­na bij je doel. Je moet er na­me­lijk nog wel even voor zor­gen dat Pi-ho­le de bin­nen-

ko­men­de DNS-re­quests van het lo­ka­le net­werk naar Stub­by door­stuurt. De op dit mo­ment ac­tu­e­le ver­sie 3.3.1 van Pi-ho­le staat bij het in­voe­ren van een DNS-ser­ver ech­ter niet toe dat je een poort­num­mer mee­geeft, zo­dat je al­leen de stan­daard­poort voor DNS (53) kunt ge­brui­ken.

Dat pro­bleem is het een­vou­digst op te los­sen door over te stap­pen van de sta­bie­le mas­ter-ver­sie naar de nog in ont­wik­ke­ling zijn­de FTLDNS-branch. Die werk­te bij ons op meer­de­re ap­pa­ra­ten zon­der pro­ble­men bij het da­ge­lijks ge­bruik. Met de vol­gen­de com­man­do's scha­kel je over naar die branch:

echo "FTLDNS" | su­do tee

/etc/pi­ho­le/ft­l­branch pi­ho­le check­out co­re FTLDNS pi­ho­le check­out web FTLDNS Na de twee check­out-com­man­do's be­ves­tig je tel­kens met y van yes dat je die over­stap daad­wer­ke­lijk wilt ma­ken. De in­stal­ler be­kom­mert zich om de rest van het ver­haal. De hui­di­ge con­fi­gu­ra­tie wordt daar­bij over­ge­no­men. Als je te­rug wilt naar de mas­ter-branch, staan de bij­be­ho­ren­de com­man­do's in een blog­post van de Pi-ho­le-ont­wik­ke­laar (zie de link on­der­aan dit ar­ti­kel).

Na het wis­se­len van ver­sie open je de Pi-ho­le-we­bin­ter­fa­ce (http://pi.ho­le/ ad­min) en log je in met je wacht­woord. Daar­na ga je links in het me­nu naar 'Set­tings / DNS' en de­ac­ti­veer je de tot dan toe ge­bruik­te DNS-ser­ver door het vin­kje er­naast sim­pel­weg te ver­wij­de­ren. Ac­ti­veer in plaats daar­van 'Custom 1 (IPv4)' en geef als ip-adres 127.0.0.1#5353 op. Bij die ge­le­gen­heid kun je ook met­een 'Use DNSSEC' in­scha­ke­len om het va­li­de­ren van cryp­to­gra­fi­sche sig­na­tu­res door Pi-ho­le in te scha­ke­len. Met een klik op 'Sa­ve' wordt de nieu­we con­fi­gu­ra­tie dan over­ge­no­men.

Ver­trou­wen is goed …

Je Pi-ho­le wik­kelt de DNS-re­quests dan dank­zij Stub­by af via DNS over TLS. Om je­zelf daar­van te ver­ze­ke­ren, kun je een blik wer­pen op het da­ta­ver­keer van de Rasp­ber­ry Pi. Daar heb je de pac­ket-snif­fer tc­pdump voor no­dig, die je heel mak­ke­lijk in­stal­leert met su­do apt-get tc­pdump. Kijk eerst eens naar het DNS-ver­keer op UDPpoort 53:

su­do tc­pdump -A -i eth0 udp and

port 53

Als de Rasp­ber­ry Pi via wi­fi met het net­werk ver­bon­den is, moet je de in­ter­fa­ce eth0 ver­van­gen door wlan0. Als je dan in­ter­net op­gaat met een client waar­bij Pi­ho­le als DNS-ser­ver is in­ge­steld, kun je de DNS-re­quests mee­le­zen als ge­wo­ne tekst – en dat voor zo­wel de aan­ge­vraag­de do­mei­nen als de ant­woord­pak­ket­ten met de ip-adres­sen.

Dat is ech­ter geen re­den tot on­ge­rust­heid, want als al­les goed ge­con­fi­gu­reerd is dan dui­ken daar al­leen pak­ket­ten op die de Rasp­ber­ry Pi en de clients bin­nen het lo­ka­le net­werk uit­wis­se­len (met bij­voor­beeld ip-adres­sen in de vorm van 192.168.x.y). Die lees­ba­re pak­ket­ten ha­len het in­ter­net niet meer. Dat zie je als je het DNS-over-TLS-ver­keer van de Rasp­ber­ry Pi laat weer­ge­ven:

su­do tc­pdump -A -i eth0 tcp and

port 853

In plaats van lees­ba­re tekst zie je nu al­leen nog maar cryp­ti­sche da­tapak­ket­ten die aan de in­ge­stel­de DoT-ser­ver ge­richt zijn. De ver­sleu­tel­de pak­ket­ten ge­ven geen uit­sluit­sel over de op­ge­vraag­de do­mei­nen –het DNS-da­ta­lek is daar­mee suc­ces­vol ge­dicht.

Per­for­man­ce

Stub­by is nu wel het twee­de tus­sen­sta­ti­on waar de DNS-re­quests langs moe­ten op hun weg naar het doel. Dat be­te­kent au­to­ma­tisch dus wel dat de pak­ket­ten wat lan­ger on­der­weg zijn. Bo­ven­dien wordt in plaats van het on­be­vei­lig­de UDP nu het door TLS be­vei­lig­de TCP ge­bruikt. Dat be­te­kent na­tuur­lijk ook nog ex­tra over­head. We heb­ben de snel­heid ge­me­ten met de ben­ch­markt­ool DNSBench (zie de link hie­ron­der) om te ach­ter­ha­len hoe groot de ex­tra la­ten­tie is die je krijgt door DNS over TLS.

We heb­ben eerst ge­me­ten hoe lang Pi-ho­le no­dig heeft voor re­quests naar de snel­le DNS-ser­vi­ce van Cloud­fla­re (1.1.1.1). DNS-re­quests voor do­mei­nen die zich niet in de ca­che be­vin­den, duur­den ge­mid­deld 97 mil­li­se­con­den. Met DNS over TLS steeg de la­ten­tie naar 160 mil­li­se­con­den – een toe­na­me van 60 pro­cent. Dat lijkt heel veel, maar bij het tes­ten was er van dat ver­schil wei­nig te mer­ken. Pi-ho­le haalt veel re­quests bo­ven­dien uit zijn ca­che, wat aan­zien­lijk snel­ler gaat. Een her­haald re­quest naar het ip-adres van ct.nl leidt dan ook al­leen de eer­ste keer naar de DNS-ser­ver op in­ter­net. (nkr)

Na het in­stal­le­ren van Stub­by stel je die DNS-tool in als DNS-ser­ver in de we­bin­ter­fa­ce van Pi-ho­le.

Newspapers in Dutch

Newspapers from Netherlands

© PressReader. All rights reserved.