Je kunt je Raspberry Pi heel eenvoudig inzetten als een Adblocker voor je gehele network. Maak hiervoor gebruik van de Pi-Hole software
Het internet staat tegenwoordig vol met advertenties. Je kunt bijna geen site meer bezoeken of ze vliegen alweer om je oren. Op zich is dit niet altijd erg, daar de websites tenslotte ook geld moeten verdienen. Het wordt echter vervelender als blijkt dat in de advertenties malware zit verstopt. Helaas zie je dit de laatste tijd regelmatig gebeuren met alle gevolgen van dien.
Je kunt jezelf hiervoor beschermen door een Adblocker te installeren. Dit moet je dan op elke apparaat doen dat internet benaderd. Handiger is het om dit op 1 plaats te doen zonder dat je alle apparaten hoeft aan te passen. Dit is heel simpel mogelijk met een Raspberry Pi met daarop de Pi-Hole software. De Raspberry Pi bepaalt dan welke URL’s wel/niet doorgeven worden (DNS Server). Verder stel je op je Router in dat de Raspberry Pi de DNS server van je netwerk is. In dit artikel leg ik uit hoe je dit alles instelt.
Download eerst Raspbian Jessie Lite image file en schrijf deze met Win32DiskImager op je SD Card van de Raspberry Pi.
Edit 27 december 2016:
Vanuit veiligheidsoogpunt staat in de laatste versie van Raspbian SSH standaard uitgeschakeld. Hierdoor kun je niet remote inloggen met Putty. Dit is eenvoudig op te lossen door, nadat je image hebt gezet op je SD kaart, een leeg bestand met de naam ‘ssh’ te zetten in de directory ‘/boot’.
Stop het SD kaartje in je Raspberry PI en sluit de USB power aan. Hierna kun je met Putty inloggen op je Raspberry PI met user-naam ‘pi’ en wachtwoord ‘raspberry’. Voer nu de volgende zaken eenmalig uit:
#sudo raspi-config #sudo apt-get install rpi-update #sudo rpi-update #sudo reboot
Vergeet niet je standaard paswoord te veranderen met optie 2 in ‘raspi-config’. Update nu naar de laatste software:
#sudo apt-get update #sudo apt-get upgrade #sudo reboot
Installeer vi support zodat je files kunt editten:
#sudo apt-get install vim-nox
Stel een fixed IP-address in door de file ‘/etc/dhcpcd.conf’ aan te passen. Zet hierin de volgende inhoud
interface eth0 static ip_address=192.168.1.71/24 static routers=192.168.1.1 static domain_name_servers=192.168.1.1
Vervolgens kun je nog wat handige software installeren. Om er voor te zorgen dat je tijd altijd actueel is, moet je de volgende commando’s uitvoeren:
#sudo dpkg-reconfigure tzdata #sudo apt-get install ntp ntpdate
Ook is het handig dat je Samba installeert zodat je eventueel altijd met een browser je files op je Raspberry Pi kunt benaderen:
#sudo apt-get install samba smb-client samba-common-bin #sudo useradd some_user_name #sudo smbpasswd -a some_user_name
Voeg nu de volgende regels toe aan de file ‘/etc/samba/smb.conf’
[Root] browseable = yes writeable = yes path = / revalidate = yes force user = root comment = Share to Root valid users = some_user_name available = yes
We hebben nu dus een werkend Operating Systeem op de Raspberry PI staan. We gaan nu uiteindelijk de Pi-Hole software installeren. Dit doe je heel eenvoudig door het volgende commando uit te voeren:
curl -L install.pi-hole.net | bash
Beantwoord de vragen die nu voorbij komen. Als de installatie klaar is moet je enkel nog de Raspberry Pi rebooten met het commando:
#sudo reboot
In principe ben je nu klaar aan de Raspberry Pi kant. Tenslotte moet je nog in je router waar je internet binnen komt instellen dat voortaan je Raspberry als DNS server wordt gebruikt. Bij de Tomato firmware doe je dit als volgt:
Let op dat je alleen maar je Raspberry Pi als DNS server instelt en geen andere DNS servers.Vanaf nu worden de meeste advertenties automatisch in je netwerk geblokt. Je hoeft dus geen enkele aanpassing meer te maken op al je apparaten (ervan uitgaande dat je hebt ingesteld dat deze apparaten de DNS instellingen van je router overnemen).
Pi-Hole heeft een mooie web-interface waar je diverse statistieken kunt bekijken.
Zo zie je hier o.a. hoeveel advertenties op deze dag al zijn geblokt en hoeveel procent van je internet verkeer normaal gesproken gerelateerd was aan advertenties.White/Black Listen
Om een site te white-listen moet je het volgende doen:
- Regel toevoegen aan file ‘/etc/pihole/whitelist.txt’
- Uitvoeren van commando: ./.pihole/gravity.sh (in /etc directory)
- Herstarten dnsmasq: sudo /etc/init.d/dnsmasq restart
- Op je windows PC je DNS cache leeg maken: ipconfig /flushdns
Hetzelfde recept kan ook voor black-listen worden gebruikt. In dat geval pas je de file ‘/etc/pi-hole/blacklist.txt’ aan.
Updaten
Om Pi-hole te updaten voer je gewoon weer het commando van de installatie uit (curl -L install.pi-hole.net | bash).
Update 8 Oktober 2016:
Om Pi-Hole te updaten kun je vanaf versie 2.9 gewoon het commando ‘pihole -up’ runnen op de shell prompt.
Nog meer informatie over Pi-Hole kun je op deze pagina vinden. Het internetten gaat nu thuis nog beter en sneller en zonder risico op malware besmetting door advertenties.
Wederom een mooi en helder geschreven stappenplan. Het toeval wil dat ik Pi-Hole 2 weken geleden ook geinstalleerd heb, maar dan op een systeem waar ook PiMatic op draait.
Ik krijg nu bij elke website die ik bezoek een melding: “Authorization Required”. Blijkbaar bijten PiMatic en Pi-Hole elkaar. Helaas is mijn Linux kennis te beperkt om het te traceren.
Heb jij misschien nog een idee/tip/truc…. ?
Ik heb Pi-Hole op een dedicated Raspberry Pi systeem draaien zonder andere software en me hierin dus niet verdiept. Het is dus niet handig voor mij om dit te troubleshooten. Wellicht zou je eens kunnen kijken naar je apache settings (/etc/apache2/conf-available/php5-cgi.conf). Verder kun je de Pi-Hole logging (/var/log/pihole.log) eens bekijken of dat meer informatie oplevert. Je zou je ook eens kunnen verdiepen in dnsmasq settings (check file /etc/dnsmasq.conf).
Laat je het nog weten als je wat gevonden hebt?
Ik ben verder gaan speuren. o.a. in de Pi-Hole logging.
Mijn initiele opzet:
Pi heeft een vast IP adres: 192.168.1.8
De server port van Pi-Hole is gewijzigd in etc/lighttpd/lighttpd.conf.
De volgende regel is opgenomen:server.port =8088.
Daarna lighttpd opnieuw opgestart: sudo service lighttpd restart
Dit geeft dus blijkbaar problemen in combinatie met PiMatic.
In de logging zie ik wel entries die de links naar ads doorsluizen naar Pi-Hole, bijv:
dnsmasq[14553]: /etc/pihole/gravity.list http://www.googletagmanager.com is 192.168.1.8
Ik krijg tevens een dialoogvenster waarbij om een gebruikersnaam en wachtwoord wordt gevraagd:
“http://www.googletagmanager.com vraagt om een gebruikersnaam en wachtwoord. De website meldt: ‘Authorization Required’”
Ik heb een test uitgevoerd met het volgende commando op de DOS prompt (zoals vermeld op de Pi-Hole site)
C:\Tools\Curl\bin>curl -I doubleclick.com
HTTP/1.1 200 OK
X-Powered-By: Express
Accept-Ranges: bytes
Cache-Control: public, max-age=0
Last-Modified: Wed, 20 Apr 2016 16:48:18 GMT
ETag: W/”17dd8-15434928450″
Content-Type: text/html; charset=UTF-8
Content-Length: 97752
Set-Cookie: pimatic.sess=s%3Aj%3A%7B%7D.WJPpw1%2FahhUij2W51Om%2FJPu0DA%2BtFn20KI
TjWKVhODg; Path=/; HttpOnly
Date: Wed, 20 Apr 2016 16:54:35 GMT
Connection: keep-alive
Uit het bovenstaande blijkt wel dat pimatic roet in het eten gooit
Als ik de PiMatic service stop met: sudo service pimatic stop
En vervolgens vanaf de DOS prompt de test nogmaals uitvoer, krijg ik:
C:\Tools\Curl\bin>curl -I doubleclick.com
curl: (7) Failed to connect to doubleclick.com port 80: Connection refused
Een beetje raar omdat ik Pi-Hole op poort 8088 heb gezet. Dus dit is een vraagteken voor mij (?)
Vervolgens heb Pi-Hole weer op poort 80 gezet in lighttpd.conf (server.port=80)
C:\Tools\Curl\bin>curl -I doubleclick.com
HTTP/1.1 200 OK
X-Pi-hole: A black hole for Internet advertisements.
Content-Type: text/html
Accept-Ranges: bytes
ETag: “2513041031”
Last-Modified: Thu, 14 Apr 2016 07:44:08 GMT
Content-Length: 29
Date: Wed, 20 Apr 2016 17:37:49 GMT
Server: lighttpd/1.4.35
Nu krijg ik de correcte terugmelding met de regel:
“X-Pi-hole: A black hole for Internet advertisements.”
Het wijzigen van de poort voor Pi-Hole lost dus niet het conflict met PiMatic op…..
Tja… hoe nu verder?
Zover ik weet moet je die test commando’s op de Raspberry Pi zelf uitvoeren. Ik krijg dan netjes bij commando ‘curl -l doubleclick.com’ de ingestelde lege content terug zoals te vinden op loaktie ‘/var/www/html/pihole/index.html’ van je Raspberry Pi.
Het is natuurlijk een principe zaak en in principe moet je ook Pimatic naast Pi-Hole kunnen draaien. Echter voor het geld hoef je het niet te laten om een dedicated Raspberry Pi aan te schaffen ;-).
Dank voor je antwoord Henri…. Tja… inderdaad een principe zaak. Aangezien mijn Pi (met PiMatic) op dit moment zo weinig te doen heeft (een paar lampjes in- en uitschakelen), dacht ik de Pi-Hole er wel even bij te kunnen zetten.
Ik heb het commando ‘curl -l doubleclick.com’ ook op de Pi uitgevoerd (mbv Putty), maar dat geeft ook hetzelfde resultaat:
pi@raspberrypi:~ $ curl -I doubleclick.com
HTTP/1.1 200 OK
X-Powered-By: Express
Accept-Ranges: bytes
Cache-Control: public, max-age=0
Last-Modified: Wed, 20 Apr 2016 17:55:48 GMT
ETag: W/”17dd8-15434d050a0″
Content-Type: text/html; charset=UTF-8
Content-Length: 97752
Set-Cookie: pimatic.sess=s%3Aj%3A%7B%7D.WJPpw1%2FahhUij2W51Om%2FJPu0DA%2BtFn20KITjWKVhODg; Path=/; HttpOnly
Date: Wed, 20 Apr 2016 18:06:50 GMT
Connection: keep-alive
pi@raspberrypi:~ $
Zoals eerder gezegd, mijn Linux kennis is zeer beperkt. Verder dan dit kom ik niet.
In ieder geval bedankt voor je reactie en het meedenken 🙂
Ik ben meer Apache2 gewend dan Lighttpd, dus het is voor mij ook even zoeken. Gelukkig lijkt de structuur wel op elkaar. Nu werkt Pimatic met JSON (Java) en daar ben ik zelf ook nog niet zo in thuis. Het is dus even zoeken voor mij wat waar gebruikt wordt.
In principe zou Pi-Log niks anders moeten doen dan je DNS requests afvangen en afhankelijk of de URL “ok” is het betreffende IP-adres moeten teruggeven of IP-adres waar Pi-Hole zelf op draait (en zodoende krijg je dus uiteindelijk je lege inhoud terug).
Hard op denkend (compleet niet zeker of dit werkt): Heb je al geprobeerd om je lokaal IP-adres in de whitelist.txt van Pi-Hole te zetten?
Ik hoop dat je met lokaal IP-adres het adres van mijn PI bedoelt (in mijn geval 192.168.1.8). Deze heb ik nu in whitelist.txt gezet. Helaas blijft het resultaat hetzelfde.
Of bedoel je misschien het lokaal IP-adres van mijn PC?
IP adres waar je Pimatic op draait inderdaad. Dat werkt dus niet. Ik moet eens gaan nadenken, maar dat zal vandaag niet meer zijn. Ik probeer er op terug te komen Rob.
Rustig aan 🙂
Inmiddels schakelen wat lampen in…. (de zon is officieel onder… 😉 )
Voorlopig is het voor mij opgelost.
De Pi-Hole heb ik weer terug gezet op poort 80
Daarnaast heb ik PiMatic op een andere poort gezet (8010) door de config.json aan te passen
settings”: {
“httpServer”: {
“enabled”: true,
“port”: 8010
},
Dit werkt 🙂
Alleen moet ik nu de PiMatic webinterface benaderen via poort 8010 i.p.v. de standaard poort.
Waarom het andersom niet werkt, is voor mij nog een raadsel…..
Bedankt voor de terugkoppeling Rob. Het lijkt dus alleen maar een problem te zijn dat 2 processen op dezelfde poort lijken te zitten.
Hallo Henri,
Waarom samba op je Pi om files over te zetten en geen sFTP?
Draait standaard toch dus scheelt weer extra software installeren en draaien 🙂
Met Samba kan ik een drive mappen in Windows. Dat is soms toch handiger navigeren dan FTP.
Henri, force user root en public op een samba drive is vragen om problemen.
Je hebt gelijk ‘rvt’. Ik heb het nu ook weggehaald uit het bericht. Het is verder ook een optionele stap om Samba te gebruiken en niet nodig voor het verhaal. Het is alleen handig voor jezelf.
@rob
Je kunt eventueel dit nog in je lighttpd.conf zetten:
$HTTP[“url”] =~ “^/pimatic” {
$HTTP[“host”] =~ “.” {
url.redirect = ( “^/(.)” => “http://%0:8010” )
url.redirect-code = 302
}
}
Dan kun je gewoon port 80 aanroepen en wordt je door de webserver altijd automatisch geredirect naar het door jou gekozen afwijkende port nummer.
Heb ook de optie om het onderwater lokaal te proxien onderzocht, maar dat slikt node js dan helaas niet omdat hij het request van localhost ziet komen in plaats van de origineel requestende host. Dus dan is dit het netste, dan hoef je in elk geval de port niet in te typen 🙂