Jan
9

Ubuntu: Werbung aussperren mit eigenem DNS-Server

By Fabi  //  Linux, PC, Ubuntu  //  7 Comments

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

CODE:
  1. apt-get install dnsmasq

holen wir uns das Programm auf die Platte. Anschliessend bearbeiten wir mittels

CODE:
  1. 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).

CODE:
  1. # Never forward plain names (without a dot or domain part)
  2. domain-needed
  3. # Never forward addresses in the non-routed address spaces.
  4. bogus-priv
  5.  
  6. # By  default,  dnsmasq  will  send queries to any of the upstream
  7. # servers it knows about and tries to favour servers to are  known
  8. # to  be  up.  Uncommenting this forces dnsmasq to try each query
  9. # with  each  server  strictly  in  the  order  they   appear   in
  10. # /etc/resolv.conf
  11. strict-order

Nachdem wir die Datei bearbeitet haben legen wir noch unsere Blackliste als zunaechst leere Datei an:

CODE:
  1. 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):

CODE:
  1. #!/bin/sh
  2.  
  3. ### short script that downloads a list of ad servers for use with
  4. ### dnsmasq to block ads.
  5. ###
  6.  
  7. # the ipaddress where we want to send the requests to, instead of the
  8. # bannerservers
  9.  
  10. addcatcherip='127.0.0.2'
  11. configfile=/etc/dnsmasq.ads.conf
  12.  
  13. # the args to add to the request to the yoyo server, to tell it that we want
  14. # a hosts file and that we want to redirect to the addcatcher
  15. listurlargs="hostformat=nohtml&showintro=0&mimetype=plaintext"
  16.  
  17. # URL of the ad server list to download
  18. listurl="http://pgl.yoyo.org/adservers/serverlist.php?${listurlargs}"
  19.  
  20. # location of a file where hostnames not listed can be added
  21. extrasfile='/etc/banner_add_hosts.manual'
  22.  
  23. ## command to reload dnsmasq - change according to your system
  24. ## not sure if we need this for dnsmasq
  25. reloadcmd='/etc/init.d/dnsmasq restart' 
  26.  
  27. # temp files to use
  28. tmpfile="/tmp/.adlist.$$"
  29. tmpconffile="/tmp/.dnsmasq.conf.$$"
  30.  
  31. # command to fetch the list (alternatives commented out)
  32. fetchcmd="/usr/bin/wget -q -O $tmpfile $listurl"
  33.  
  34. $fetchcmd
  35.  
  36. # add the extras
  37.  [ -f "$extrasfile" ]  && cat $extrasfile>> $tmpfile
  38.  
  39. # check the temp file exists OK before overwriting the existing list
  40. if  [ ! -s $tmpfile ]
  41. then
  42. echo "temp file '$tmpfile' either doesn't exist or is empty; quitting"
  43. exit
  44. fi
  45.  
  46. # get a fresh list of ad server addresses for dnsmasq to refuse
  47. cat $configfile | grep -v "address="> $tmpconffile
  48.  
  49. while read line; do
  50.     ADDRESS="/${line}/${addcatcherip}"
  51.     echo "address=\"${ADDRESS}\"">> $tmpconffile
  52. done <$tmpfile
  53.  
  54. mv $tmpconffile $configfile
  55. $reloadcmd
  56. rm $tmpfile
  57. exit

Dieses Script speichern wir unter /usr/local/bin/update_adserver_list ab.
Mittels

CODE:
  1. chown root.root /usr/local/bin/update_adserver_list
  2. chmod 700 /usr/local/bin/update_adserver_list
  3. /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

CODE:
  1. wget http://proxytunnel.sourceforge.net/files/pixelserv.pl.txt -O /usr/local/bin/pixelserv.pl
  2. 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

CODE:
  1. gedit /usr/local/bin/pixelserv.pl

und aendern die den Teil

CODE:
  1. $sock = new IO::Socket::INET (  LocalHost => '0.0.0.0',

ab in

CODE:
  1. $sock = new IO::Socket::INET (  LocalHost => '127.0.0.2',

Es folgt der Befehl

CODE:
  1. gedit /etc/init.d/pixelserv

wobei wir dort das folgende Script hineinkopieren:

CODE:
  1. #! /bin/sh
  2. # /etc/init.d/pixelserv
  3. #
  4.  
  5. # Carry out specific functions when asked to by the system
  6. case "$1" in
  7.    start)
  8.      echo "Starting pixelserv "
  9.      /usr/local/bin/pixelserv.pl &
  10.      ;;
  11.    stop)
  12.      echo "Stopping script pixelserv"
  13.      killall pixelserv.pl
  14.      ;;
  15.    *)
  16.      echo "Usage: /etc/init.d/pixelserv {start|stop}"
  17.      exit 1
  18.      ;;
  19. esac
  20.  
  21. exit 0

Im Anschluss daran passen wir noch die Rechte an

CODE:
  1. chmod 755 /etc/init.d/pixelserv

Jetzt kann mittels

CODE:
  1. /etc/init.d/pixelserv start

und

CODE:
  1. /etc/init.d/pixelserv stop

getestet werden ob das Script erfolgreich startet und beendet. Wenn alles passt, dann uebernehmen wir es mittels

CODE:
  1. 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.

configure-networkmanager-dns

Anschliessend koennen wir testen ob unsere Arbeit Fruechte traegt und in der Konsole folgendes ausprobieren:

CODE:
  1. nslookup doubleclick.net

Das Ergebnis sollte dann so aussehen:

CODE:
  1. Server:  127.0.0.1
  2. Address:    127.0.0.1#53
  3.  
  4. Name:   doubleclick.net
  5. 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

CODE:
  1. #Update the banner hosts...
  2. 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!

Analytics

Gemaess den Richtlinien des deutschen Datenschutzes weisen wir darauf hin, dass dieser Blog persoenliche Daten des Besuchers zu Analysezwecken sammelt. Dem kann hier widersprochen werden.

Werbung