27. Mai 2015

Raspberry PI als DNS Server - Gib Malware keine Chance!

Heute möchte ich kurz auf den DNS Server für unseren kleinen Router eingehen und dir zeigen, wie du ganz einfach selber einen Malwareblocker einbauen kannst.

DNS steht für Domain Name System und ist quasi das "Telefonbuch des Internets" und funktioniert auch genauso.

Wenn du jemanden anrufen möchtest, kennst du bestimmt nicht seine Nummer auswendig. Der Speicher in deinem Telefon (oder halt auch das gute alten Telefonbuch) aber schon! Du suchst also in deinem Telefonbuch die Nummer von Peter Meier raus. Sobal du auf "anrufen" druckst, wird automatisch seine Nummer gewählt und erst dann angerufen.

Im Internet funktioniert es ähnlich. Wenn du oben in die Adresszeile deines Browsers, beispielsweise www.privux.de eingibst, dann schaut der DNS deines Internetanbieters ob die Anfrage beantwortet werden kann. Falls nicht, werden weitere DNS Server befragt und das solange bis jemand die dazugehörige URL kennt und mit der dazugehörigen IP-Adresse antwortet. Wenn alle bekannten Server der ganzen Welt angefragt wurden und keiner die Adresse kennt, dann kommt es zu dem bekannten "404"-Fehler.

Dies kann jedoch mitunter etwas dauern. Je nachdem wie viele Server befragt worden sind.

Wozu wird ein eigener DNS Server benötigt?

Eine sehr berechtigte Frage 😃

Wenn man im eigenen Netzwerk ein DNS Server betreibt, hat dies genau drei Vorteile:

  1. Geschwindigkeitsvorteil Wie im Eingangsbeispiel bereits erwähnt, kann es mitunter mehrere Sekunden dauern bis überhaupt die URL aufgelöst werden konnte. Das ist natürlich sehr lästig wenn man 500 Millisekunden (Klingt nach nicht viel? Ist es aber!) allein für die Namensauflösung warten muss.Ein eigenes DNS hat jetzt den Vorteil, das die bereits angefragte IP gespeichert wird und diese Abfragekette gar nicht erst entsteht. Die IP Adresse wird beim zweiten Besuch direkt aus dem Zwischenspeicher zurückgegeben, der ja der Server bereits bekannt ist.
  2. Namensauflösung eigener Server Wenn man ein paar eigene (Web)Server in seinem Intranet hat, möchte ich jetzt nicht unbedingt immer die IP Adresse der Server eingeben und merken.Dafür kann man sich bequem eine eigene Domain (bei Bedarf auch mehr) ausdenken diese dann verwenden.
  3. Eigene Websperren Es macht durchaus Sinn Webseiten zu sperren. Und damit meine ich nicht Webseiten wie facebook und co. sondern Webseiten, die dir explizit Schaden wollen, also Webseiten mit Malware oder ähnlichen Inhalten. Mit diesem Filter sperrst du z.B. bereits alle bekannten Phishing Webseiten oder auch solche die Viren, Trojaner usw. verbreiten.

DNS Server Installation, Integration und Konfiguration

So, gehen wir die oberen Punkte einmal Punkt für Punkt durch.

Den Geschwindigkeitsvorteil bekommst du eigentlich sehr schnell. Dazu Bedarf es gar nicht mal so viel manueller Arbeit.

Zunächst wird der Server selbst installiert:

apt-get install bind9 bind9utils dnsutils

Anschließend wird die named.conf.options gesichert und geöffnet:

cp /etc/bind/named.conf.options /etc/bind/named.conf.options.bak
nano /etc/bind/named.conf.options

Der Bereich forwarders wird wie folgt abgeändert:

forwarders {
// see: http://www.ccc.de/de/censorship/dns-howto
85.214.20.141; // FoeBud
204.152.184.76; // f.6to4-servers.net, ISC, USA
194.150.168.168; // dns.as250.net; Berlin/Frankfurt
213.73.91.35; // dnscache.berlin.ccc.de
// OpenDNS
208.67.222.222;
208.67.220.220;
};
view raw named.conf.options hosted with ❤ by GitHub

Damit dein System alle Anfragen über den gerade installieren Server weiterleitet, muss der Standard DNS Server wie folgt geändert werden:

echo nameserver 172.26.47.253 > /etc/resolv.conf
echo domain knet.mw >> /etc/resolv.conf

Optional: proxy

Solltest du (m)einen Proxy Server verwendest, muss dieser von deinem DNS Server auch Bescheid wissen. Am besten in der squid.conf nach dem Begriff "dns_names" suchen und wie folgt abändern:

dns_nameservers 172.26.47.253 172.26.63.253
view raw squid.conf hosted with ❤ by GitHub

Optional: firewall

Falls du alle Schritte aus dem Firewall Artikel befolgt hast, musst du hier noch einmal Hand anlegen. Wenn du eine eigene Firewall benutzt auch 😃

Da der DNS Server auf der gleichen Maschine läuft wie auch die Firewall, werden die Anfragen alle über das lo -Interface weitergereicht und in der aktuellen Konfiguration blockiert.

iptables -A OUTPUT -o lo -j ACCEPT
iptables -A INPUT -p tcp -m multiport --dport 80,443 -j ACCEPT
iptables -A INPUT -p tcp --dport 953 -j ACCEPT
iptables -A INPUT -p tcp --dport 3128 -j ACCEPT
view raw firewall.sh hosted with ❤ by GitHub

So adressierst du lokale Server

Auch wenn du (noch) keine lokalen Server (bis auf den PI) hast, solltest du dir trotzdem folgende Konfigurationen vornehmen um zumindest den PI erreichen zu können.

Dazu öffnest du am besten die named.conf.local und ergänzt diese um folgende Einträge:

zone "knet.mw" {
type master;
file "/etc/bind/zones/knet.mw.zone";
notify yes;
};
zone "32.26.172.in-addr-arpa" {
type master;
file "/etc/bind/zones/db.rev.32.26.172.in-addr-arpa.zone";
};
view raw named.conf.local hosted with ❤ by GitHub

Ich habe meine eigenen Zonen in den Unterordner zones gepackt.

mkdir /etc/bind/zones
touch /etc/bind/zones/knet.mw.zone
touch /etc/bind/zones/db.rev.32.26.172.in-addr-arpa.zone

Die beiden Dateien werden wie folgt bestückt:

;; BIND forward data file for zone jupiter.mw
$TTL 86400
@ IN SOA dns.knet.mw. hostmaster.knet.mw. (
2016110701 ; Serial
3H ; refresh after 3 hours
1H ; retry after 1 hour
1W ; expire after 1 week
1D) ; minimum TTL of 1 day
; Name Server
IN NS dns.knet.mw. ; jupiter
; JUPITER-PI
dns IN A 172.26.47.253
jupiter IN A 172.26.47.253
dash.jupiter IN A 172.26.47.253
www IN CNAME 172.26.47.253
; EOF
view raw knet.mw.zone hosted with ❤ by GitHub
;; BIND reverse data file for zone 32.26.172.in-addr-arpa
$TTL 86400
@ IN SOA dns.knet.mw. hostmaster.knet.mw. (
2016110701 ; Serial
3H ; refresh after 3 hours
1H ; retry after 1 hour
1W ; expire after 1 week
1D) ; minimum TTL of 1 day
; Name Server
IN NS dns.knet.mw.
; JUPITER-PI
47.253 IN PTR jupiter.knet.mw.
47.253 IN PTR dash.jupiter.knet.mw.
; EOF

Was machen die beiden Dateien jetzt im Detail?

Im lokalen Intranet wurde eine neue Domain knet.mw registriert. In den unteren Zeilen kannst du dann Subdomains und die dazugehörige IP eintragen.

Die addr-arpa zone ist quasi das genaue Gegenstück dazu. Hier wird nachgeschaut, welche Namen unter der jeweiligen IP registriert worden sind.

Nachfolgend möchte ich noch die offizielle BIND9 Dokumentation und eine genauere Erklärung für die zone Dateien verlinken (beides auf Englisch).

So sperrst du böse Buben aus

Während du mit einer Firewall bedrohliche Ports ausschließen kannst, kannst du mit einem DNS böse Webseiten sperren. Theoretisch würde das auch mit unserem Squid Proxy funktionieren, allerdings bietet uns da eine Webseite im Netz eine kleine Hilfe wie man das per DNS relativ leicht lösen kann und du hast immer noch alles automatisiert.

Ich bin da nämlich (rein zufällig) auf die Seite malwaredomains.lehigh.edu aufmerksam geworden. Die Betreiber dieser Webseite sammeln alle Malwaredomains in einer Liste und stellen diese kostenlos zur Verfügung. Hier können wir also perfekt andocken 😃

Als erstes muss in der named.conf ein weiterer Eintrag hinzugefügt werden

include "/etc/bind/named.conf.options";
include "/etc/bind/named.conf.local";
include "/etc/bind/named.conf.default-zones";
include "/etc/bind/named.conf.blocked";
view raw named.conf hosted with ❤ by GitHub

Um alles schön automatisch laufen zu lassen habe ich mir mal wieder ein kleines Script erstellt. Dieses Script wird dann jeweils wöchentlich ausgeführt.

touch /etc/bind/fetchMalwareDomains.sh
chmod -x /etc/bind/fetchMalwareDomains.sh
ln -s /etc/bind/fetchMalwareDomains.sh /etc/cron.weekly/fetchMalwareDomains.sh
nano /etc/bind/fetchMalwareDomains.sh
#!/bin/bash
### BEGIN INIT INFO
# Provides:
# Required-Start:
# Required-Stop:
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description:
# Description:
### END INIT INFO
rm -rf /etc/bind/named.conf.blocked
echo "Aktualisiere jetzt die Liste der Schädlingswebseiten"
wget -O /etc/bind/malmwaredomains -q "http://malwaredomains.lehigh.edu/files/justdomains"
while read entry
do
if [ -n "${entry}" ]
then
echo "zone \""$entry"\" {type master; file \"/etc/bind/db.empty\";};" >> /etc/bind/named.conf.blocked
fi
done < /etc/bind/malmwaredomains
echo "DNS wird neugestartet (Das kann jetzt mitunter etwas dauern...)"
/etc/init.d/bind9 reload
echo "Du bist jetzt sicher!"

Ich habe mein ganzen Mut für Dich zusammen genommen und eine (Phishing) Webseite besucht. Zum Glück hat mein DNS mich dann direkt davon abgehalten, sodass ich nicht meine geheime Daten verloren habe 😃

Mein Proxy Server hat die Fehlermeldung noch schön verpackt, sodass ich sehen konnte was ich falsch gemacht habe 😃

Fazit

Wie man sieht, ist auch im privaten Umfeld ein eigener DNS Server von Vorteil. Der Performance boost ist zwar ein kleines nice-to-have aber der entscheidende Vorteil liegt jedoch ganz klar in der Sperre der gefährlichen Webseiten.

Wie man an dem oberen Bildchen erkennen kann, springen nicht immer irgendwelche Sicherheitssysteme und Antivirenprogramme an (Ja, ich habe zwangsläufig auch eins. Windows nervt sonst viel zu sehr!)

Teuer Virenscanner versprechen aber ein ähnlichen Schutz. Jetzt brauchst du dieses teure Feature übrigens nicht mehr zu kaufen, sondern hast es quasi für lau 😃

Alle gezeigten Konfigurationen sind natürlich noch einmal komplett auf github zu finden.

So geht es weiter....

Im nächsten Kapittel werde ich ganz kurz (wird eher wirklich ein kurzer Artikel) das Thema SSL anreisen und wie man es auf dem eigenen Webserver installiert.

Warum das ganze?

Moderne Browser meckern da zwar wenn die Zertifikate nicht richtig signiert sind, trotzdem ist die Verbindung dann sicher. Ob man es privat wirklich braucht, steht jedoch auf einem anderen Blatt Papier. Das muss jeder für sich entscheiden 😃

Wenn dir das gefallen hat, wirst du diese Artikel lieben!

Die neuesten Artikel, die du gelesen haben musst!

teilen

Noch mehr privux?

Verpasse keine spannende Beiträge & Tutorials mehr!

Jetzt kostenlosen Newsletter abonieren!

Jetzt newsletter abonieren