staging.inyokaproject.org

hosts

Dieser Artikel wurde für die folgenden Ubuntu-Versionen getestet:

Dieser Artikel ist größtenteils für alle Ubuntu-Versionen gültig.

Zum Verständnis dieses Artikels sind folgende Seiten hilfreich:

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.

Namensauflösung

Wie schon beschrieben, kann die /etc/hosts auch dazu benutzt werden, um 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.

IP-Adressen umleiten

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
#!/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. Replace 127.0.0.1 with 0.0.0.0 because then we don't have to wait for the resolver to fail
# 3. Delete all lines that don't begin with 0.0.0.0
# 4. Scrunch extraneous spaces separating address from name into a single tab
# 5. Delete any comments on lines
# 6. Clean up leftover trailing blanks
# 7. Delete any lines ending with the word localhost because we'll obtain that from the original hosts file
# 8. Delete any lines ending with the word .dropbox.com.
# 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 's/127\.0\.0\.1/0\.0\.0\.0/' -e '/^0\.0\.0\.0/!d' -e 's/ \+/\t/' -e 's/#.*$//' -e 's/[ \t]*$//' -e '/localhost$/d' -e '/\.dropbox\.com$/d' < $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."
cp ~/hosts-block /etc/hosts

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 5. Januar 2019 12:56 von fulgor erstellt.
Die folgenden Schlagworte wurden dem Artikel zugewiesen: Netzwerk