Dieser Artikel ist größtenteils für alle Ubuntu-Versionen gültig.
Die Datei /etc/hosts wird benutzt, um Rechnernamen in IP-Adressen aufzulösen – wenn kein Nameserver im lokalen Netzwerk vorhanden ist. Nach der Installation eines Ubuntu-Rechners mit dem Rechnernamen "jupiter" sieht die Datei so aus:
127.0.0.1 localhost 127.0.1.1 jupiter # The following lines are desirable for IPv6 capable hosts ::1 ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters ff02::3 ip6-allhosts
Der obere Teil definiert den localhost und den Rechnernamen. Ab Ubuntu 6.06 kommen noch ein paar Zeilen für IPv6 hinzu.
Wie schon beschrieben kann die /etc/hosts auch dazu benutzt werden, Rechner im Netzwerk über ihren Namen anstatt über ihre IP-Adresse anzusprechen. Besteht das lokale Netzwerk z.B. aus 3 Rechnern mit den Namen
jupiter (192.168.0.1 - dieses System)
mars (192.168.0.2)
saturn (192.168.0.3)
muss in der /etc/hosts mit Root-Rechten [1] folgendes eingetragen [2] werden:
127.0.0.1 localhost 127.0.1.1 jupiter # <IP-Adresse> <Rechnername(n)> 192.168.0.1 jupiter.homenetwork jupiter 192.168.0.2 mars.homenetwork mars 192.168.0.3 saturn.homenetwork saturn # The following lines are desirable for IPv6 capable hosts ::1 ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters ff02::3 ip6-allhosts
Dadurch können die Rechner "mars" und "saturn" über ihren Namen vom Rechner "jupiter" aus angesprochen werden.
Darüber hinaus lässt sich durch eigene Einträge ein einfacher, aber effektiver systemweiter Blocker realisieren. Dazu werden einfach zeilenweise weitere Namen (oder IP-Adressen) mit localhost
verbunden. Beispiel:
127.0.0.1 localhost 127.0.1.1 jupiter # <IP-Adresse> <geblockte/r Name/n oder IP-Adresse/n)> 127.0.0.1 www.geblockte_domain.de
Damit werden alle Anfragen an www.geblockte_domain.de
auf localhost
umgeleitet und die Domain ist nicht mehr erreichbar. Nachteile dieses Verfahrens sind aber zum einen die aufwendige Pflege blockierter Namen und zum anderen die Verarbeitung sehr großer hosts
-Dateien. Ein weiterer gravierender Nachteil ist, dass Platzhalter bzw. Wildcards nicht zulässig sind. Hostnamen dürfen nur aus alphanumerischen Zeichen, Minus-Zeichen und Punkten bestehen; sie müssen mit einem alphabetischen Zeichen beginnen und mit einem alphanumerischen Zeichen enden. Das macht die hosts
-Datei relativ unflexibel, um Werbung im Internet zuverlässig zu blocken, da nur exakt das geblockt wird, wie es in der Datei auch angegeben ist, so dass z.B. zugehörige Subdomains nicht geblockt werden. Einige Beispiele sollen das verdeutlichen:
# Beispiele für unzulässige Einträge: 127.0.0.1 *.google-analytics.com 127.0.0.1 facebook. 127.0.0.1 doubleclick.* # Beispiele für unwirksame Einträge: 127.0.0.1 google-analytics # blockiert nicht z.B. ssl.google-analytics.com 127.0.0.1 doubleclick.net # blockiert nicht z.B. 3ad.doubleclick.net, ad-emea.doubleclick.net, ad-g.doubleclick.net
Daher ist ein Proxy-Server auf Dauer die bessere Wahl. Eine flexiblere Alternative ist auch dnsmasq, da dort das Hinzufügen der Domain ausreicht, um auch alle Subdomains zu blockieren. Eine weitere Möglichkeit besteht darin, über ein Skript mehrere im Internet erhältliche regelmäßig aktualisierte, umfangreiche hosts-Dateien herunterzuladen (die auch die in den obigen Beispielen erwähnten Subdomains enthalten), diese zu kombinieren, sie z.B. um doppelte Einträge zu bereinigen und anschließend zu /etc/hosts hinzuzufügen:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | #!/bin/bash # If this is our first run, save a copy of the system's original hosts file and set to read-only for safety if [ ! -f ~/hosts-system ] then echo "Saving copy of system's original hosts file..." cp /etc/hosts ~/hosts-system chmod 444 ~/hosts-system fi # Perform work in temporary files temphosts1=`mktemp` temphosts2=`mktemp` # Obtain various hosts files and merge into one echo "Downloading ad-blocking hosts files..." wget -nv -O - http://winhelp2002.mvps.org/hosts.txt >> $temphosts1 wget -nv -O - http://hosts-file.net/download/hosts.txt >> $temphosts1 wget -nv -O - http://someonewhocares.org/hosts/hosts >> $temphosts1 wget -nv -O - "http://pgl.yoyo.org/as/serverlist.php?hostformat=hosts&showintro=1&mimetype=plaintext" >> $temphosts1 # Do some work on the file: # 1. Remove MS-DOS carriage returns # 2. Delete all lines that don't begin with 127.0.0.1 # 3. Delete any lines containing the word localhost because we'll obtain that from the original hosts file # 4. Delete any lines containing the word dropbox.com. # 5. Replace 127.0.0.1 with 0.0.0.0 because then we don't have to wait for the resolver to fail # 6. Scrunch extraneous spaces separating address from name into a single tab # 7. Delete any comments on lines # 8. Clean up leftover trailing blanks # Pass all this through sort with the unique flag to remove duplicates and save the result echo "Parsing, cleaning, de-duplicating, sorting..." sed -e 's/\r//' -e '/^127.0.0.1/!d' -e '/localhost/d' -e '/dropbox.com/d' -e 's/127.0.0.1/0.0.0.0/' -e 's/ \+/\t/' -e 's/#.*$//' -e 's/[ \t]*$//' < $temphosts1 | sort -u > $temphosts2 # Combine system hosts with adblocks echo Merging with original system hosts... echo -e "\n# Ad blocking hosts generated "`date` | cat ~/hosts-system - $temphosts2 > ~/hosts-block # Clean up temp files and remind user to copy new file echo "Cleaning up..." rm $temphosts1 $temphosts2 echo "Done." echo echo "Copy ad-blocking hosts file with this command:" cp ~/hosts-block /etc/hosts echo echo "You can always restore your original hosts file with this command:" echo "cp ~/hosts-system /etc/hosts" echo "so don't delete that file! (It's saved read-only for your protection.)" |
Das Skript ersetzt bei den zu blockierenden Einträgen die IP-Nummer 127.0.0.1 durch 0.0.0.0, da dadurch erhebliche Geschwindigkeitsvorteile zu erreichen sind. Das Skript sollte unter /root/gethosts gespeichert und ausführbar gemacht werden. Über einen symbolischen Link z.B. nach /etc/cron.daily oder /etc/cron.weekly kann es dann leicht automatisch ausgeführt werden.
Diese Revision wurde am 19. Juli 2015 19:04 von aasche erstellt.