Raspberry Pi: Schnelleres Internet mit DNS-Caching

Zwar ist DNS-Auflösung ein Thema, über das sich die meisten wahrscheinlich keine Gedanken machen, dennoch hat der Vorgang, der aus einer Domain eine IP-Adresse auflöst einen erheblichen Anteil an der Geschwindigkeit beim Surfen. Etwas Linderung kann ein DNS-Cache auf einem Raspberry Pi bieten.

Nachdem ich den Internet-Provider gewechselt habe und nun über eine VDSL-Leitung mit einem Sync von 51,4 Mbit/s downstream und 10 Mbits/s upstream verfüge habe ich mich daran gemacht, die letzten Bremsen zu lösen.

Raspberry Pi Logo
Raspberry Pi Logo
Zuerst ist mir aufgefallen, dass es nach Eingaben einer URL eine kurze Gedenksekunde dauert, bis das Laden der Webseite startet.

Ein Lösungsansatz: ein Raspberry Pi, direkt an die Fritzbox angeschlossen (ich verwende eine Fritz!Box 7490) arbeitet als DNS-Cache (mit pdnsd) und DHCP-Server (da sich in der Fritzbox kein alternativer DNS-Server zur Verteilung via DHCP eintragen lässt).

Raspberry Pi als DNS-Cache

Wenn Raspbian (Debian) verwendet wird und man keinen kompletten DNS-Server wie bind einsetzen will, bietet sich das Paket pdnsd an. pdnsd hat den Vorteil, dass die Cache-Daten nicht nur im RAM, sondern auch auf der SD-Card des Pi. Gecachte DNS-Einträge bleiben somit auch nach einem Neustart des Pi erhalten. Die Konfiguration von pdnsd ist einfach, die wichtigsten Anpassungen in der /etc/pdnsd.conf, die meisten Werte habe ich auf ihren Standards gelassen:

perm_cache=8192; // Cache-Größe in Kilobyte (hier: 8 Megabyte)
cache_dir="/var/cache/pdnsd"; // Cache-Verzeichnis
server_ip = 0.0.0.0; // IP, auf der gelauscht wird: 0.0.0.0 bedeute auf allen IPs

Damit Anfragen, die noch nicht im Cache liegen beantwortet werden können, müssen auch für pdnsd DNS-Server konfiguriert werden. Dabei wird per Default auf das Programm resolvconf zurückgegriffen, die Nameserver müssen dann über die Datei /etc/network/interfaces konfiguriert werden. Dort wird an einem Interface-Eintrag die Zeile dns-nameservers 8.8.8.8 8.8.4.4 hinzugefügt:

auto eth0
iface eth0 inet static
address 192.168.0.10
netmask 255.255.255.0
network 192.168.0.0
gateway 192.168.0.1
dns-nameservers 217.0.43.161 217.0.43.177 8.8.8.8 8.8.4.4

Mit dieser Konfiguration bekommt der Raspberry Pi die IP-Adresse 192.168.0.10, verwendet als Gateway die Fritzbox (192.168.0.1) und die Telekom-DNS-Server 217.0.43.161 und 217.0.43.177 sowie die öffentlichen DNS-Server von Google (8.8.8.8 und 8.8.4.4). Läuft pdnsd, kann man mit sudo /etc/init.d/pdnsd status erfahren, wie der Cache-Status ist:

Cache status:
=============
8192 kB maximum disk cache size.
613647 of 8398848 bytes (7.31%) memory cache used in 2275 entries.

DHCP auf Raspberry Pi

Damit die Einstellungen auch von allen Clients ohne zusätzlichen Konfigurations-Aufwand übernommen werden, muss man den DHCP-Server der Fritzbox deaktivieren und einen alternativen DHCP-Server auf dem Raspberry Pi installieren:

sudo aptitude install isc-dhcp-server

Die Konfiguration wird dann über die Datei /etc/dhcp/dhcpd.conf realisiert. Da auch diese gut Dokumentiert ist mit Kommentaren gehe ich hier wieder nur auf die wichtigsten Punkte ein:

option domain-name-servers 192.168.0.10; // IP unseres DNS-Caches
subnet 192.168.0.0 netmask 255.255.255.0 {
range 192.168.0.70 192.168.0.100;
option domain-name-servers 192.168.0.10;
option domain-name "fritz.box";
option routers 192.168.0.1;
option broadcast-address 192.168.0.255;
default-lease-time 600;
max-lease-time 7200;
}

Damit bekommen alle DHCP-Clients eine IP zwischen 192.168.0.70 und 192.168.0.100 sowie die korrekten Daten die gebraucht werden, um den DNS-Cache auf dem Raspberry Pi zu verwenden. DNS-Auflösung von bereits besuchten Domains läuft innerhalb von 2 Millisekunden ab (was im Prinzip dem doppelten Ping in meinem Netzwerk ist).

DNS-Cache auf Raspberry Pi – Fazit

Zwar mag es den meisten nicht weiter wichtig vorkommen – aber für einen Heavy-Nutzer wie mich macht es durchaus einen Unterschied, ob die DNS-Auflösung ein paar Millisekunden schneller abläuft. Größter Vorteil: das Surfen fühlt sich „knackiger“ an, gerade auf Webseiten die man häufiger aufruft und bei denen die DNS-Daten sicher im Cache vorhanden sind. Ich habe die minimale Cache-Dauer auf einen Tag eingestellt und die maximale auf eine Woche. Wenn nun eine Webseite die IP-Adresse wechselt, was zum Beispiel bei einem Serverumzug der Fall ist. In so einem Fall muss der pdnsd-Cache zurückgesetzt werden.

Nebenher-Erkenntnis: der Raspberry Pi lässt sich stabil am USB-Anschluss der Fritz!Box 7490 betreiben, ein gesondertes Netzteil für den Kleinstrechner wird für diese Konfiguration also nicht benötigt. Eine weitere Nutzungsmöglichkeit bzw. Erweiterung dieses Setups ist die Verwendung des Raspberry Pi als Privoxy-Server im Heimnetzwerk.

[amazon box=“B07ZV9C6QF“]

12 Kommentare

  1. Kann man einzelne DNS Einträge überschreiben? Ich möchte den Raspberry bestimmte Domains gerne mit lokalen IPs auflösen lassen. Die Fritz!Boxen kämpfen nämlich alle mit argen Performance-Problemen, wenn das Ziel wieder auf sie selbst verweist (NAT Loopback).

  2. Danke für die kurze Anleitung. DNS funktioniert wunderbar. Wie sieht es denn beim DHCP aus? Muss ich mich trotzdem mit dem Router verbinden? Wie erkennt der Raspberry Pi dass ich er DHCP verwenden soll sobald ich mich am Router anmelde (ich habe ein altes Speedport)?

    1. Du musst den Router so konfigurieren, dass er in der DHCP-Antwort für die Clients den Raspberry Pi als DNS-Server verteilt. Den Pi selbst würde ich nicht über DHCP laufen lassen, sondern wie den Router selbst mit einer festen IP-Adresse versehen.

      Die IP-Adresse nach „draußen“ ist ja eh immer dynamisch, die kannst du nicht festlegen. Macht aber bei diesem Setup auch nichts weiter.

  3. Gibt es bei deinem Router vielleicht die Möglichkeit, die Fritz!Box-Software zu verwenden? Geht wohl bei einigen älteren Modellen. Dann könntest du es einstellen. Das ist so eine der Dinge gewesen, die mich vom gemieteten Telekom Speedport-Router zur Fritzbox getrieben haben 😉

  4. Moin moin!

    Ich habe pdnsd wie angegeben eingerichtet. Allerdings habe ich folgendes Phänomen beobachtet.
    Löse ich mit „dig domain“ eine dns-Auflösung aus, erhalte ich als ersten Wert meist ein Ergebnis zwischen 150-300ms. Löse ich die gleiche Domain danach nochmal über „dig domain“ auf, liegt der Wert wie erhofft bei 5-10ms.
    Soweit so gut!
    Gebe ich nun aber einen Domainnamen im Browser ein und löse dieses im Anschluss mit „dig domain“ auf, liegt der Wert wieder bei 150-300ms. Wieso das? Die Auflösung durch den Browser müsste doch gecachet worden sein????

    Danke im Voraus!

  5. Was genau soll das bringen? DNS-Einträge in den Nameserver haben TTLs von meist 3600 Sekunden (1h). Da die meisten Leute ihren DNS-Cache nicht häufiger leeren (wie z.B. durch einen Neustart des Systems), bringt ein Cache auf der SD-Karte gar nichts. Und wenn man die TTL ignoriert und es länger zwischenspeichert, dann läuft man Gefahr, dass man veraltete IP-Adressen zwischenspeichert. Der Sinn und Zweck von TTLs ist ja gerade, dass man ein Ablaufdatum für DNS-Einträge hat.
    Wer einen halbwegs modernen Router hat, der wird damit auch einen DNS-Cache haben und wer einmal die Zeit zur Auflösung misst, der wird sehen, dass eine zweite, identische Anfrage unter/gleich 1 msec beantwortet wird, also direkt aus dem Cache des Routers.
    Der einzige Grund, wieso man einen DNS-Server auf dem Raspberry Pi benutzen wollen würde, wäre um einen DNSSEC-fähigen Resolver zu Hause zu haben bzw. um seine eigene DNS-Zone zu verwalten, wofür ich dann aber mit Sicherheit keinen Raspberry Pi benutzen würde 😉

Schreibe einen Kommentar zu Olli Antworten abbrechen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.