9
Ubuntu: Werbung aussperren mit eigenem DNS-Server
Irgendwann geht einem die Werbung auf den Keks. Vor allem dann, wenn nervige Overlay-Werbung den Webseitencontent ueberdeckt oder man von Werbung angeschrien wird. Zeit damit Schluss zu machen? Hier steht, wie es geht!
Es gibt unterschiedliche Ansaetze Werbung zu blockieren. Beliebt sind beispielsweise Werbeblocker in Browsern, wie Adblock fuer Chrome. Doch ich will einen Ansatz vorstellen, der viel weiter unten im System ansetzt und die nicht auf einen Browser beschraenkt ist. Meine Methode soll schon beim DNS-Request ansetzen.
Fuer die technisch weniger versierten Leser moechte ich kurz erklaeren was beim DNS-Request passiert. Der Browser weiss mit einer Adresse wie "example.org" erstmal nichts anzufangen. Was ein Browser braucht um die Webseite aufzurufen ist dessen IP-Adresse. Um diese in Erfahrung zu bringen fraegt er beim System nach, und dieses wiederrum fraegt beim sogeannten DNS-Server nach. Die IP-Adresse vom DNS-Server ist dem System bekannt, so dass dieses dort nachfragen kann. Die DNS-Server selbst wissen ueber "alle" Adressen bescheid und koennen dem System so sagen an welche IP die Anfrage zu richten ist. Diesen Aufruf nennt man DNS-Request.
Genau hier soll mein Verfahren ansetzen. Wenn ich also wuesste, welche Domains von Werbeunternehmen kommen, dann muesste ich nur noch die DNS-Requests umbiegen und schon wird keine Anwendung mehr Werbung laden koennen. Genau dies macht mein Ansatz.
Im Folgenden beschreibe ich, wie man einen DNS-Server aufsetzt, der lokal auf dem Rechner laeuft. Dieser wird vom System zuerst genutzt und beinhaltet eine Liste von Werbeserveradressen, dessen Aufruf er umbiegt. Fuer alle anderen Adressen gibt er die Anfrage einfach an einen anderen DNS-Server weiter, so dass wir sozusagen eine Art Blacklist anlegen koennen, in der wir die Adressen der Werbeseiten speichern.
Im Internet existieren zahlreiche Listen, die viele Adressen von Werbeseiten beinhalten und brav gepfelgt werden. Eine solche Liste findet sich beispielsweise hier.
Auf diese Liste werden wir zurueckgreifen, wenn wir spaeter unserem eigenen DNS-Server sagen, welche Adressen er umzubiegen hat.
Zunaechst einmal brauchen wir dazu dnsmasq. Dieses Programm ist unser DNS-Server, dem wir unsere Blacklist geben wollen.
Mittels
-
apt-get install dnsmasq
holen wir uns das Programm auf die Platte. Anschliessend bearbeiten wir mittels
-
gedit /etc/dnsmasq.conf
die Datei /etc/dnsmasq.conf und fuegen ans Ende der Datei folgende Zeile hinzu: conf-file=/etc/dnsmasq.ads.conf.
Diese Zeile weist dnsmasq an die Datei /etc/dnsmasq.ads.conf zu beruecksichtigen, in der wir unsere Blacklist ablegen werden. In der Konfigurationsdatei muessen wir ausserdem dafuer sorgen, dass unser DNS-Server richtig eingerichtet ist.
Im folgenden ein Auszug der Datei mit den Stellen, bei denen das Kommentarzeichen (#) entfernt werden muss (Zeile 2,4 und 11 in meinem Auszug).
-
# Never forward plain names (without a dot or domain part)
-
domain-needed
-
# Never forward addresses in the non-routed address spaces.
-
bogus-priv
-
-
# By default, dnsmasq will send queries to any of the upstream
-
# servers it knows about and tries to favour servers to are known
-
# to be up. Uncommenting this forces dnsmasq to try each query
-
# with each server strictly in the order they appear in
-
# /etc/resolv.conf
-
strict-order
Nachdem wir die Datei bearbeitet haben legen wir noch unsere Blackliste als zunaechst leere Datei an:
-
touch /etc/dnsmasq.ads.conf
Drueben bei debian-adminstration.org gibt es ein tolles Script, welches es uns erlaubt automatisiert die Blackliste aus oben genannter Quelle zu laden. Mein Dank geht an dieser Stelle an den Autor, die Rechte des Scripts liegen natuerlich beim Autor selbst!
Das Script lautet (ein wenig abgeaendert um unseren Beduerfnissen gerecht zu werden):
-
#!/bin/sh
-
-
### short script that downloads a list of ad servers for use with
-
### dnsmasq to block ads.
-
###
-
-
# the ipaddress where we want to send the requests to, instead of the
-
# bannerservers
-
-
addcatcherip='127.0.0.2'
-
configfile=/etc/dnsmasq.ads.conf
-
-
# the args to add to the request to the yoyo server, to tell it that we want
-
# a hosts file and that we want to redirect to the addcatcher
-
listurlargs="hostformat=nohtml&showintro=0&mimetype=plaintext"
-
-
# URL of the ad server list to download
-
listurl="http://pgl.yoyo.org/adservers/serverlist.php?${listurlargs}"
-
-
# location of a file where hostnames not listed can be added
-
extrasfile='/etc/banner_add_hosts.manual'
-
-
## command to reload dnsmasq - change according to your system
-
## not sure if we need this for dnsmasq
-
reloadcmd='/etc/init.d/dnsmasq restart'
-
-
# temp files to use
-
tmpfile="/tmp/.adlist.$$"
-
tmpconffile="/tmp/.dnsmasq.conf.$$"
-
-
# command to fetch the list (alternatives commented out)
-
fetchcmd="/usr/bin/wget -q -O $tmpfile $listurl"
-
-
$fetchcmd
-
-
# add the extras
-
[ -f "$extrasfile" ] && cat $extrasfile>> $tmpfile
-
-
# check the temp file exists OK before overwriting the existing list
-
if [ ! -s $tmpfile ]
-
then
-
echo "temp file '$tmpfile' either doesn't exist or is empty; quitting"
-
exit
-
fi
-
-
# get a fresh list of ad server addresses for dnsmasq to refuse
-
cat $configfile | grep -v "address="> $tmpconffile
-
-
while read line; do
-
ADDRESS="/${line}/${addcatcherip}"
-
echo "address=\"${ADDRESS}\"">> $tmpconffile
-
done <$tmpfile
-
-
mv $tmpconffile $configfile
-
$reloadcmd
-
rm $tmpfile
-
exit
Dieses Script speichern wir unter /usr/local/bin/update_adserver_list ab.
Mittels
-
chown root.root /usr/local/bin/update_adserver_list
-
chmod 700 /usr/local/bin/update_adserver_list
-
/usr/local/bin/update_adserver_list
passen wir die Rechte des Scripts an und machen es ausfuehrbar. Die letzte Zeile sollte mit der Meldung Restarting DNS forwarder and DHCP server: dnsmasq. quittiert werden. Wenn dies der Fall ist funktioniert alles so weit in der Datei /etc/dnsmasq.ads.conf sollten jetzt eine Menge Eintraege stehen.
Jetzt sind wir schon relativ fortgeschritten und muessen nur noch ein paar Kleinigkeiten anpassen. Zunaechst muessen wir auf der IP 127.0.0.2, die wir im Script oben definiert haben, einen Dienst laufen lassen, der uns bei jedem Aufruf nur ein leeres Pixel ausgibt. Dieser Teil ist drueben bei flexion.org schoen erklaert. Vielen Dank dafuer! :)
Zunaechst holen wir uns den Pixelserver mittels
-
wget http://proxytunnel.sourceforge.net/files/pixelserv.pl.txt -O /usr/local/bin/pixelserv.pl
-
chmod 755 /usr/local/bin/pixelserv.pl
Im Anschluss daran muessen wir dem Pixelserver noch sagen auf welche IP er ansprechen soll. Dazu oeffnen wir die Datei im Editor
-
gedit /usr/local/bin/pixelserv.pl
und aendern die den Teil
-
$sock = new IO::Socket::INET ( LocalHost => '0.0.0.0',
ab in
-
$sock = new IO::Socket::INET ( LocalHost => '127.0.0.2',
Es folgt der Befehl
-
gedit /etc/init.d/pixelserv
wobei wir dort das folgende Script hineinkopieren:
-
#! /bin/sh
-
# /etc/init.d/pixelserv
-
#
-
-
# Carry out specific functions when asked to by the system
-
case "$1" in
-
start)
-
echo "Starting pixelserv "
-
/usr/local/bin/pixelserv.pl &
-
;;
-
stop)
-
echo "Stopping script pixelserv"
-
killall pixelserv.pl
-
;;
-
*)
-
echo "Usage: /etc/init.d/pixelserv {start|stop}"
-
exit 1
-
;;
-
esac
-
-
exit 0
Im Anschluss daran passen wir noch die Rechte an
-
chmod 755 /etc/init.d/pixelserv
Jetzt kann mittels
-
/etc/init.d/pixelserv start
und
-
/etc/init.d/pixelserv stop
getestet werden ob das Script erfolgreich startet und beendet. Wenn alles passt, dann uebernehmen wir es mittels
-
update-rc.d pixelserv defaults
in den Autostart.
Jetzt muessen wir noch dem System mitteilen, dass unser DNS-Server genutzt werden soll. Dazu passen wir die aktuelle Internetverbindung im NetworkManager an und fuegen unseren Rechner mit der IP 127.0.0.1 als DNS-Server hinzu. Weiterhin muessen wir noch einen alternativen DNS-Server angeben, der die normalen Anfragen abarbeitet, die unser DNS-Server nicht verwaltet. In meinem Fall ist das die IP 8.8.8.8, welche den DNS-Server von Google adressiert.
Anschliessend koennen wir testen ob unsere Arbeit Fruechte traegt und in der Konsole folgendes ausprobieren:
-
nslookup doubleclick.net
Das Ergebnis sollte dann so aussehen:
-
Server: 127.0.0.1
-
Address: 127.0.0.1#53
-
-
Name: doubleclick.net
-
Address: 127.0.0.2
Jetzt haben wir alles erfolgreich konfiguriert. Allerdings muessen wir unsere Blacklist auch immer aktuell halten. Dazu legen wir noch die Datei /etc/cron.d/update_adserver_list an. Diese Datei bearbeiten wir und fuegen folgenden Inhalt hinzu
-
#Update the banner hosts...
-
0 0,4,8,12,16,18,20 * * * root /usr/local/bin/update_adserver_list
Mittels diesem Cronjob wird die Liste alle 4 Stunden neu geladen und so immer aktuell gehalten. Damit brauchen wir uns um nichts mehr kuemmern, sondern haben alles automatisiert.
Zum Testen reicht es ein paar werbeverseuchte Webseiten anzusurfen. Von Werbung sollte jetzt nichts mehr zu sehen sein - ausgenommen der Werbeserver ist nicht in der Blackliste eingetragen ;)
Viel Spass damit!

Ziemlich cooool, vielen Dank
hat mir echt geholfen, suche ich schon lange nach.
TOP!
Mal ganz blöd aus der Windows- und Ubuntu(desktop)welt hergefragt:
warum sollte man sich den Aufwand der Frickelei machen, wenn Adblock (auch für zünftige Browser wie FF oder SM verfügbar) das ganze per GUi/Klick für jeden dahergelaufenen Deppen* erledigen kann?
* meiner Freundin hab ich vor Urzeiten mal Ubuntu installiert, und nun will sie kein Windows mehr obwohl Wine nicht ganz tut, was sie manchmal möchte... :O
Nuetzlich waere diese Methode, wenn mehrere Browser eingesetzt werden - auch solche, die fuer die es kein Plugin/keine Extension gibt, die die Werbung blockiert. Weiterhin wird damit auch Werbung in externen Programmen, wie einem ICQ-Clienten beispielsweise, unterbunden. Sicherlich gibt es noch den einen oder anderen Grund mehr.
Gefällt mir - AdBlock macht den FF gefühlt ziemlich lahm. Kannst du mal testen, mit welcher Methode Websites im Schnitt schneller aufgerufen werden bei dir?
Das kommt wohl darauf an, wie AdBlock programmiert ist. Wenn Inhalte zwar geladen, aber danach geblockt werden, dann ist die von mir vorgestellte Methode schneller. Wenn AdBlock die geblockten Inhalte erst gar nicht laed, und das ist nach meinem Kenntnisstand der Fall, dann wirst du wohl keinen Unterschied hinsichtlich der Ladezeit feststellen koennen.
Einzig die Programmierweise von AdBlock koennte sich dann noch negativ auswirken. Jedoch denke ich, dass AdBlock relativ effizient programmiert ist, so dass das nicht ins Gewicht fallen sollte.
Soeben habe ich das alles Mal so installiert. Bei der fünfmaligen Ladezeitmessung von sieben Websites (also insgesamt 35 Aufrufe, Cache deaktiviert), ergibt eine durchschnittliche Zeit pro Website:
AdBlock Plus deaktiviert: 4688ms (als 100% genommen)
AdBlock Plus aktiviert: 4615ms (98,4%)
AdBlock Plus deinstalliert, Pixelserver: 4083,9ms (87,1%)
Die Sache ist natürlich nicht wirklich genau, da aber die AdBlock Plus Variante und ohne doch erstaunlich nah beeinander liegen und der Pixelserver so schnell läuft bleib ich dabei :)
verwendet wurde übrigens Firefox 4.0b13, einige weitere Addons (Ghostery, NoScript, Greasemonkey, Vimperator), für die Zeitmessung das Addon CustomBench (musste erst noch für FF 4 kompatibel gemacht werden). Alles auf Ubuntu Maverick 64 mit DSL 3K, W-Lan.
Ich kann mir vorstellen, dass bei einer schnelleren Verbindung das Ergebniss weniger hart ausfällt - aber so startet FF auch schneller :P - wer will den upstart von ubuntu messen? :D
Na da hast dir ja eine Menge Arbeit gemacht. Interessant zu sehen, dass sich da doch ein Unterschied von etwas mehr als 10% ergibt. Das haette ich nicht gedacht.
Dann mal vielen Dank fuer die Vergleichsstudie. Jetzt haben wir es schwarz auf weiss! ;)