UniFi USG – Werbeblocker (PiHole style)
Inzwischen gibt es ja kaum mehr eine Webseite, die ohne Werbung bzw. Tracking Mechanismen auskommt. Ich mag das ganze gar nicht grundsätzlich in Frage stellen, aber bei meinen Bewegungen im Internet einfach mal versuchen zu unterbinden. Dafür gibt es ja mittlerweile einige Möglichkeiten so z.B. AdBlock im Browser (oder ähnliche).
Will man allerdings das ganze zentral einrichten ohne jedes einzelne Gerät anfassen zu müssen, so gibt es in der Regel entweder die Möglichkeit einen (transparenten) Zwangs-Proxy zu nutzen oder aber, was inzwischen recht populär und einfach geworden ist, einen Werbeblocker auf Basis eines DNS-Filters zu hinterlegen.
Wie funktioniert das?
Ist in einer Webseite z.B. ein „Bild“ von einem Werbedienst enthalten, so muss der angegebene DNS-Name mit einer Name-Service-Anfrage in eine IP Adresse aufgelöst werden. Das macht ein DNS Server, der dann mit Hilfe von „Blacklists“ die „unliebsamen“ Dienste erkennt und die Anfragen unterbindet. Dafür wird der DNS Name in eine IP-Adresse übersetzt, die nicht der des Anbieters entspricht und somit der Inhalt nicht geladen wird. Ebenso funktioniert das Tracking nicht mehr über diese Methode. In der Regel ist die aufgelöste Adresse dann die 127.0.0.1 was dem eigenen Rechner entspricht (localhost). Da dieser aber (für gewöhnlich) den Inhalt nicht ausliefern kann, bleibt die Stelle in der gezeigten Webseite leer.
Ein üblicher Vertreter solcher DNS-Filter ist PIHole. Hier wird auf einem kleinen RaspberryPI einfach eine Software installiert, die die o.g. Filterung übernimmt und den DNS Request nur dann korrekt auflöst, wenn die Adresse nicht in einer der hinterlegten Blacklists steht. Da ich aber im Rahmen meiner Installation nicht noch ein weiteres Stück Hardware einrichten wollte, habe ich das ganze basierend auf einem UniFi-Community Post eingerichtet. Dafür wird der auf dem USG laufenden DNSmasq um entsprechende Blacklist-Einträge automatisiert ergänzt.
Im Standard ist das ganze dann direkt mit den „normalen“ Listen des PIHole-Projektes versehen, lässt sich aber problemlos durch weitere Listen ergänzen. Zwar hat man dann nicht so ein schickes Reporting per WebUI dabei, aber eigentlich sieht man sich das auch nach einigen Tagen nicht mehr an sondern will „dass es macht was es soll“.
(Ja, ich habe es auch mal ausprobiert und überlegt es zu nutzen aber letztlich den Gedanken verworfen.)
Die eigentliche Installation ist simpel. Dazu einfach per SSH mit dem USG verbinden und das Script einrichten:
sudo -i
cd /config/scripts
curl 'https://raw.githubusercontent.com/unifiMynet/dnsmasqAdBlock/master/getBlacklistHosts.V8.6.zip' > getBlacklistHosts.zip
unzip getBlacklistHosts.zip
rm getBlacklistHosts.zip
chmod +x getBlacklistHosts.sh
./getBlacklistHosts.sh
Nun ist es leider so, dass alle lokal auf der USG installierten Cron-Jobs und Scripte (außerhalb von /config/scripts) mit dem nächsten Update entfernt werden. Will man also dauerhaft einen Cronjob einrichten bzw. dass dieser das nächste Update „überlebt“, muss man auf dem Controller einen „task“ in einer JSON Datei (config.gateway.json) hinterlegen.
In meinem Fall muss man sich dafür auf den CloudKey per SSH einloggen und dann im Basis-Pfad für die gewünschten „Site“ die Datei config.gateway.json pflegen. Auf meinem Unifi CloudKey Gen2+ ist das die default-Site, so dass das Verzeichnis dafür /srv/unifi/data/sites/default ist.
Der für den gewünschten Cron-Job nötige Eintrag ist dann:
{
"system": {
"task-scheduler":{
"task":{
"hostblacklist":{"executable":{"path":"/config/scripts/getBlacklistHosts.sh"},"crontab-spec":"30 4 * * *"}
}
}
}
}
…und fertig ist der zentrale AdBlocker inkl. automatischem Update (täglich um 04:30 Uhr) analog zu einem PiHole Setup :-)
Nachtrag (29.12.2021)
Mir ist inzwischen aufgefallen, dass vormals nicht in der dnsblacklist stehende Domainnamen weiterhin aus dem Cache aufgelöst und nicht auf den Default 0.0.0.0 aufgelöst werden. Damit das geschieht, muss der Cache des DNSmasq aktiv geleert werden.
Weil ich das gern nach dem Update der Listen automatisch machen möchte, habe ich dazu die Datei /config/scripts/getBlacklistPostRun.sh wir folgt definiert (und natürlich muss diese Datei ausführbar sein):
#!/bin/bash
/usr/bin/clear dns forwarding cache
Na das ist ja einfach 😂😂