Mit Dnsmasq

So richten Sie einen DNS-Server unter Linux ein

Ein zwischenspeichernder DNS-Server ist unter Linux mit Dnsmasq schnell eingerichtet. Er beschleunigt den Verbindungsaufbau zu Domains im Internet entweder nur für den lokalen PC oder für alle Teilnehmer im LAN-Netzwerk.

Im eigenen Netzwerk dient üblicherweise der Router als erster DNS-Server, der die Browser-Anfragen entgegennimmt. Dieser DNS-Server arbeitet mit einem Zwischenspeicher, der sich vorherige Anfragen merkt und schnell antwortet. Ist die Zieladresse unbekannt, so geht die Anfrage weiter an die DNS-Server des Internet-Providers.

Im LAN ist der Weg zum Router im LAN kurz, und im Idealfall dauert eine DNS-Anfrage nur einige Dutzend Millisekunden.

Der Befehl dig zeigt die angefragte Adresse des DNS-Servers sowie die Dauer einer DNS-Anfrage.
Der Befehl dig zeigt die angefragte Adresse des DNS-Servers sowie die Dauer einer DNS-Anfrage.

Allerdings arbeiten dabei nicht alle Router richtig schnell. Im WLAN sind Anfragen generell langsamer, und bei vielen Anfragen von einer großen Zahl von Netzwerkteilnehmern dauert eine Antwort auch mal länger. Der Befehl

for i idn {1..20}; do dig pcwelt.de | grep time; sleep 1; done

gibt eine Übersicht von typischen Antwortzeiten für DNS-Abfragen. Auf einem Linux-PC kann ein lokaler DNS-Zwischenspeicher diese Anfragen enorm beschleunigen. Der Konfigurationsaufwand ist gering.

Lese-Tipp: Die 10 wichtigsten Linux-Befehle für Netzwerk und Internet

Lokaler Cache mit Dnsmasq

Auch wenn es nur um einige Dutzend Millisekunden geht: Ein DNS-Server mit Zwischenspeicher auf dem eigenen PC antwortet sofort, wenn eine Host-Adresse bereits im Speicher liegt. Nur bei einer unbekannten Adresse oder wenn die Haltezeit im Zwischenspeicher abgelaufen ist, fragt der DNS-Server bei den übergeordneten DNS-Servern nach. Ideal für diese Aufgabe ist das Multitalent Dnsmasq, das einen kompakten DNS-Server mit Cache bereitstellt. Die DNS-Anfrage geht bei einem lokalen Cache gar nicht erst über das Netzwerk, sondern direkt an den Localhost (127.0.0.1). Die nötige Konfiguration betrifft auch nur den eigenen Linux-PCs und nicht das sonstige Netzwerk.

Sonderfall Ubuntu: Ab Version 12.04 ist bei den Desktop-Versionen dieser Distribution Dnsmasq im Network-Manager bereits enthalten, allerdings ohne lokalen Cache. Diese Instanz von Dnsmasq können Sie einfach ignorieren, zumal sich die Konfiguration nicht mit einem manuell eingerichteten Dnsmasq stört. Dnsmasq ist in den Paketquellen aller verbreiteten Linux-Distributionen vorhanden. In Debian, Raspbian, Ubuntu und seinen Varianten wird es mit dem Befehl

sudo apt-get install dnsmasq

nachinstalliert. Auch Fedora, Open Suse, Arch und viele andere Distributionen kennen Dnsmasq unter diesem Paketnamen.

Lese-Tipp: Die richtige Linux-Distribution für Einsteiger

Die Konfiguration liegt in der Datei „/etc/dnsmasq.conf“ vor und erfolgt über root-Privilegien oder sudo mit jedem Texteditor. Dnsmasq kann mehr als nur DNS und bietet deshalb viele Optionen. Legen Sie deshalb eine Sicherheitskopie der mitgelieferten Konfigurationsdatei an, und legen Sie der Übersicht halber noch wie folgt eine neue Datei an:

sudo mv /etc/dnsmasq.conf /etc/dnsmasq.conf.bak
sudo touch /etc/dnsmasq.conf

Dann öffnen Sie die neue Konfigurationsdatei im Texteditor

sudo nano /etc/dnsmasq.conf

und tragen dort die folgenden fünf Zeilen ein:

listen-address=127.0.0.1
port=53
domain-needed
bogus-priv
resolv-file=/etc/resolv.dnsmasq

Der Eintrag „listen-address“ weist Dnsmasq an, nur auf der Adresse des Localhost (127.0.0.1) auf dem Port 53 lokale Anfragen entgegenzunehmen. Einfache Host-Namen aus dem LAN werden mit der Option „domain-needed“ nicht an übergeordnete DNS-Server weitergegeben, und „bogus-priv“ vermeidet die umgekehrte Auflösung von IP-Adressen aus privaten Subnetzen (192.168.x.x, 10.x.x.x).

Kompakter DNS-Server: Dnsmasq benötigt als DNS-Cache nur diese fünf Zeilen Konfiguration.
Kompakter DNS-Server: Dnsmasq benötigt als DNS-Cache nur diese fünf Zeilen Konfiguration.

Der Verweis „resolv-file“ gibt die weitere Konfigurationsdatei „/etc/resolv.dnsmasq“ an, die Sie anschließend noch anlegen müssen, Dort tragen Sie die IP-Adresse der übergeordneten DNS-Server des Providers oder des Routers ein. Mit

sudo touch /etc/resolv.dnsmasq

erstellen Sie diese Datei „/etc/resolv.dnsmasq“ und öffnen diese dann in einem Texteditor. Hier tragen Sie die Adressen der DNS-Server ein, die Dnsmasq zur Auflösung verwenden soll. Bei stationären PCs im lokalen Netzwerk sollten dies die DNS-Server-Adressen des Providers beziehungsweise des Routers sein.

Welche DNS-Adressen das in Ihrem Fall sind, zeigt

cat /etc/resolv.conf

hinter der Angabe „nameserver“ an und in Ubuntu der Befehl

nmcli dev list

hinter „IP4.DNS[1]“. Steht hier beispielsweise „192.168.178.1“ für die Adresse einer Fritzbox, so tragen Sie

nameserver 192.168.178.1

in die Datei „/etc/resolv.dnsmasq“ ein. Bei Rechnern, die häufig in anderen LANs/WLANs mit wechselnden DNS-Servern unterwegs sind, tragen Sie darunter noch die Adresse eines schnellen öffentlichen DNS-Servers ein.

Für den DNS-Dienst von Google beispielsweise wäre

nameserver 8.8.8.8

ein geeigneter Eintrag.

Dnsmasq starten und verwenden

Starten Sie Dnsmasq auf Systemen mit Systemd (Fedora, Open Suse, Debian ab Version 8, Ubuntu ab 14.10, Raspbian ab „Jessie“) über diese Befehle:

sudo systemctl enable dnsmasq.service
sudo systemctl restart dnsmasq.service

Auf älteren Systemen mit System-V-Init (Debian 7, Ubuntu 14.04, Raspbian Wheezy) startet der folgende Befehl Dnsmasq neu:

sudo service dnsmasq restart

Jetzt teilen Sie dem System mit, dass ab sofort alle DNS-Anfragen an die lokale Adresse 127.0.0.1 gehen sollen. Dazu öffnen Sie die Datei „/etc/resolv.conf“ als root oder mit sudo in einem Texteditor und tragen dort in der ersten Zeile

nameserver 127.0.0.1

ein. Ein Problem ist, dass die Datei „/etc/resolv.conf“ bei einem Reboot immer wieder gern vom Network-Manager oder von dhcpd überschrieben wird. Um das zu verhindern, setzen Sie mit dem Kommando

sudo chattr +i /etc/resolv.conf

einen Schreibschutz. Mit

sudo chattr -i /etc/resolv.conf

heben Sie den Schreibschutz zum Bearbeiten der Datei bei Bedarf wieder auf.

Im Netzwerk: DNS-Cache für alle

Läuft Dnsmasq schon mal, kann es mit wenig Aufwand dazu gebracht werden, auch DNS-Anfragen von anderen Netzwerkteilnehmern im LAN entgegenzunehmen. Sorgen Sie zuerst dafür, dass der Rechner, auf dem Dnsmasq läuft, vom Router stets die gleiche IP-Adresse erhält. Diese Einstellung nehmen Sie der Verwaltungsoberfläche des Routers vor. In der Konfigurationsdatei „/etc/dnsmasq.conf“ tragen Sie dann unter „listen-address=127.0.0.1“ noch die Zeile

listen-address=[IP-Adresse]

ein, wobei der Platzhalter für die feste IP-Adresse steht, die der Router dem Rechner zuweist. Danach ist ein Neustart von Dnsmasq nötig – auf Distributionen mit Systemd mit

sudo systemctl restart dnsmasq.service

und bei anderen mit diesem Befehl:

sudo service dnsmasq restart

Anschließend können Sie andere Netzwerkteilnehmer so einrichten, dass diese nun als DNS-Server diese IP-Adresse verwenden.