Raspberry PI als DNS-Server – Gib Malware keine Chance!

Autor: Sergej Kukshaus Veröffentlicht: vor 8 monaten Lesedauer: ca. 7 Minuten

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.bytebee.de eingibst, dann schaut der DNS deines Internetanbieters, ob die Anfrage beantwortet werden kann. Falls nicht, werden weitere DNS-Server befragt und das so lange 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:

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.

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.

Eigene Websperren

Es ist durchaus sinnvoll 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:

$ sudo apt install bind9 bind9utils dnsutils

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

$ sudo cp /etc/bind/named.conf.options /etc/bind/named.conf.options.bak 
$ sudo 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;
};

Damit dein System alle Anfragen über den gerade installieren Server weiterleitet, muss der Standard DNS-Server wie folgt geändert werden (dazu kurzzeitig als root einloggen):

$ echo nameserver 10.10.1.1 > /etc/resolv.conf 

Optional: DNS im DHCP hinterlegen

Damit unser DHCP-Server die korrekte IP für den DNS-Server ausliefert, müssen wir eine Änderung in der dhcpd.conf vornehmen.

$ sudo /etc/dhcp/dhcpd.conf

Am besten trägst du für jedes subnet einen eigenen Eintrag hinzu. Als IP gibst du die gleiche an, die du bereits in der option routers verwendet hast.

option domain-name-servers 10.10.1.1;

Optional: DNS für Proxy bekannt machen

Solltest du (m)einen Proxy Server verwenden, 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 10.10.1.1 10.20.0.1

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

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/jupiter.zone";
	notify yes;
};

zone "10.10.1.in-addr-arpa" {
	type master;
	file "/etc/bind/zones/db.rev.1.10.10.in-addr-arpa.zone";
};

Ich habe meine eigenen Zonen in den Unterordner zones gepackt.

$ sudo mkdir /etc/bind/zones 

Die beiden Dateien werden wie folgt bestückt:

$ sudo nano /etc/bind/zones/jupiter.zone
;; BIND forward data file for zone jupiter.local

$TTL 86400
@ IN     SOA    dns.jupiter.local. hostmaster.jupiter.local. (
				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.jupiter.local.
; JUPITER-PI
dns			IN A		10.10.1.1
jupiter			IN A		10.10.1.1
dash.jupiter		IN A		10.10.1.1

www			IN CNAME	10.10.1.1
; EOF
$ sudo nano /etc/bind/zones/db.rev.1.10.10.in-addr-arpa.zone
;; BIND reverse data file for zone 1.10.10.in-addr-arpa

$TTL 86400
@ IN     SOA    dns.jupiter.local. hostmaster.knet.mw. (
				2020010401  ; 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.jupiter.local.

; JUPITER-PI
1.1	IN	PTR	jupiter.local.
1.1	IN	PTR	dash.jupiter.local.
; EOF

Was machen die beiden Dateien jetzt im Detail?

Im lokalen Intranet wurde eine neue Domain jupiter.local 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 Malware-Domains in einer Liste und stellen diese kostenlos zur Verfügung. Hier können wir also perfekt andocken 🙂

Dazu 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";

Um alles schön automatisch laufen zu lassen habe ich mir mal wieder ein kleines Script erstellt. Dieses Script wird jeden Montag um 5 Uhr morgens aufgeführt.

$ cd /etc/bind/
$ sudo wget https://raw.githubusercontent.com/ByteBee/Jupiter-PI/master/etc/bind/fetchMalwareDomains.sh
$ sudo chmod -x fetchMalwareDomains.sh
$ sudo sh fetchMalwareDomains.sh
$ sudo crontab -e
0 5 * * 1/7 /etc/bind/fetchMalwareDomains.sh

Ich habe meinen 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 einen ä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 🙂

Sei der erste und teile deine Meinung mit der Welt!
... und was meinst du dazu?
Deine E-Mail-Adresse wird nicht veröffentlicht.