Dnsmasq als DNS- und DHCP-Server

Dnsmasq ist ein einfacher DNS- und DHCP-Server für kleine Netzwerke. Es werden die Namen aus dem lokalen Netz entsprechend der Datei /etc/hosts aufgelöst. Unbekannte Namensanfragen werden weitergeleitet und im Cache gespeichert. Das DHCP-Subsystem unterstützt DHCPv4, DHCPv6, BOOTP (Bootstrap Protocol) und PXE.

Vorbereitung für Dnsmasq

Wir wechseln zum „root“-User:

sudo -i

Zunächst aktualisieren wir die Paketquellen, das Betriebssystem, in diesem Fall ein Ubuntu 20.04LTS:

apt update && apt upgrade -y && apt install net-tools vim

Aktuellen DNS-Dienst identifizieren:

netstat -tulpen | grep 53

Aktuellen DNS-Dienst deaktivieren und stoppen:

systemctl disable systemd-resolved
systemctl stop systemd-resolved

Symbolischen Link entfernen und Konfigurationsdatei neu anlegen:

unlink /etc/resolv.conf

echo nameserver 8.8.8.8 | sudo tee /etc/resolv.conf

Befehl zum Installieren des neuen DNS-Dienstes:

apt install dnsmasq 

Konfigurationsdatei sichern:

cp /etc/dnsmasq.conf /etc/dnsmasq.conf.bak

Nun können wir die Konfiguration des neuen DNS/DHCP-Servers beginnen:

vim /etc/dnsmasq.conf

Nachfolgend eine Minimalkonfiguration:

# Listen on this specific port instead of the standard DNS port
# (53). Setting this to zero completely disables DNS function,
# leaving only DHCP and/or TFTP.
port=53
# Never forward plain names (without a dot or domain part)
domain-needed
# Never forward addresses in the non-routed address spaces.
bogus-priv
# By  default,  dnsmasq  will  send queries to any of the upstream
# servers it knows about and tries to favour servers to are  known
# to  be  up.  Uncommenting this forces dnsmasq to try each query
# with  each  server  strictly  in  the  order  they   appear   in
# /etc/resolv.conf
strict-order
# Set this (and domain: see below) if you want to have a domain
# automatically added to simple names in a hosts-file.
expand-hosts
# Set the domain for dnsmasq. this is optional, but if it is set, it
# does the following things.
# 1) Allows DHCP hosts to have fully qualified domain names, as long
#     as the domain part matches this setting.
# 2) Sets the "domain" DHCP option thereby potentially setting the
#    domain of all systems configured by DHCP
# 3) Provides the domain part for "expand-hosts"
#domain=thekelleys.org.uk
domain=example.com

# Set Listen address
listen-address=127.0.0.1 # Set to Server IP for network responses

Konfiguration als lokaler DNS-Server

Dnsmasq greift zur lokalen Namensauflösung auf die Datei /etc/hosts zurück. Daher sollte man diese mit einem Editor, wie beispielsweise vim und Root-Rechten bearbeiteten, um Zeilen in folgender Art hinzuzufügen. Hier ein Beispiel:

## Lokales Netzwerk
## IP                  Hostname                 Alias 

192.168.1.1        router                        ns1

## Router und Nameserver auf einer IP, ns1 ist ein Alias.

192.168.178.1     fritz.box  
127.0.0.1             dnsmasq
192.168.1.2         client1                       ## Client ohne Alias mit IPv4-Adresse
192.168.1.2         client1.admin-box    ## Client ohne Alias mit IPv4-Adresse und Domäne
2001:da5::5         client1.                      ## IPv6-Eintrag für selbigen Client und auto-Domäne

Verwendung des Dnsmasq-Cache

Um alle DNS-Anfragen über Dnsmasq zu verarbeiten und bei Bedarf an externe DNS-Server weiter zu reichen, ist der einfachste Weg, die Datei /etc/resolv.conf zu bearbeiten. Dies ist für Testzwecke der geeignete Weg. Um eine persistente Änderung vorzunehmen, müssten wir bei Ubuntu jedoch die Konfigurationsdatei unter /etc/netplan/ anpassen und uns nach den yml-Syntax richten. Es ist sicher zu stellen, dass der lokale DNS-Server in der /etc/resolv.conf, hier Dnsmasq, als erste Zeile eingetragen wird. Als nächste Zeile muss mindestens ein weiterer DNS-Server definiert werden, damit Dnsmasq die Anfragen weiterreichen kann. Beispiel mit Weiterleitung an den DNS-Cache der Fritz-Box und einen öffentlichen IPv6-Nameserver von Google:

nameserver 127.0.0.1
nameserver 192.168.178.1
nameserver 2001:4860:4860::8888

Wir testen den Syntax der Konfiguration und übernehmen die Änderungen am Daemon mit:

dnsmasq --test -C /etc/dnsmasq.conf

systemctl restart dnsmasq

Das erfolgreiche lokale Cachen überprüfen wir am Terminal mit:

dig ubuntuusers.de 

##oder mit:

nslookup ubuntuusers.de

Ausgabe (Antwort von 127.0.0.1):

Ausgabe dig und nslookup linux

Soll Dnsmasq wirklich nur als DNS-Server für den eigenen Rechner arbeiten, ist die Konfiguration hier bereits abgeschlossen.

Dnsmasq als DNS-Server für andere Rechner im lokalen Netz

Möchte man den DNS-Server auch für andere Rechner im lokalen Netz nutzen, dann muss man Dnsmasq auf seine eigene Netzwerkschnittstelle nach DNS-Abfragen lauschen lassen und diesen mit einer statischen IP-Adresse versehen.

Die listen-Angabe wird in der /etc/dnsmasq.conf definiert. Diese muss mit Administrator-Rechten bearbeitet werden und es werden folgende Zeilen geändert bzw. hinzugefügt:

listen-address=127.0.0.1
listen-address=www.xxx.yyy.zzz
listen-address=2001:db8::34

www.xxx.yyy.zzz steht für die lokale statische IPv4-Adresse des Dnsmasq-Rechners, also z.B. „192.168.178.2“. Es muss sowohl die 127.0.0.1 als auch die www.xxx.yyy.zzz angegeben werden, damit Dnsmasq sowohl eigene als auch fremde Anfragen bearbeitet. Hat der Rechner mehrere IP-Adressen, muss man – sofern gewünscht oder nötig – auch die zusätzlichen IP-Adressen angeben.

Dies gilt ebenso für IPv6. Damit kann man z.B. für ein ganzes Heim-Netzwerk, ein Büro oder auch eine größere Firma zentral die Zugriffe zum Internet regeln (s. unten), indem man am DNS-Server Antworten manipuliert.

Ob das funktioniert, kann man mit dem Befehl

netstat -tulpen | grep dnsmasq 

überprüfen. Wir sehen dann in der Spalte LISTEN, ob Dnsmasq auf 127.0.0.1 und www.xxx.yyy.zzz lauscht. In unserem Fall lauscht Dnsmasq auf die eigene lokale Adresse:

Ausgabe netstat linux

Dnsmasq als DHCP-Server

Um Dnsmasq als DHCP-Sever einzusetzen, müssen folgende Eintragungen in der /etc/dnsmasq.conf erfolgen:

  1. DHCP Bereich und lease time (Lebenszeit der Adressvergabe)
  2. Standardgateway
  3. NTP Server
  4. IP-Adressen der DNS-Server
  5. Subnetzmaske

Hier ein Beispiel:

dhcp-range=192.168.178.200,192.168.178.220,24h
dhcp-option=option:router,192.168.178.1
dhcp-option=option:ntp-server,192.168.178.1
dhcp-option=option:dns-server,www.xxx.yyy.zzz
dhcp-option=option:netmask,255.255.255.0

Nach der Änderung starten wir den Daemon neu:

systemctl restart dnsmasq

Umleiten und Manipulieren von DNS-Abfragen

Umleiten

Das Umleiten von DNS-Abfragen kann sinnvoll sein, wenn man sich beispielsweise in einem Firmennetzwerk mit eigenem Nameserver befindet. Alle Seiten, die z.B. auf .intranet enden, sollen vom firmeninternen DNS-Server behandelt werden. Alle anderen Namen sollen von einem externen Nameserver aufgelöst werden.

Unter dnsmasq ist es einfach möglich, für verschiedene Namensbereiche explizit einen oder mehrere DNS-Server zu bestimmen. Dazu tragen wir entsprechende Zeilen in die Datei /etc/dnsmasq.conf ein:

server=/intranet/10.17.1.1

Dieser Eintrag würde alle DNS-Anfragen für die Toplevel-Domain .intranet, also Seiten wie firmenportal.intranet an den Server 10.17.1.1 schicken. Alle übrigen Anfragen z.B. an ubuntuusers.de würden von dem Nameserver bearbeitet werden, der in der Datei /etc/resolv.conf eingetragen ist. Dies funktioniert ebenso mit IPv6-Adressen.

Manipulieren

Es gibt verschiedene Gründe, warum man DNS-Abfragen manipulieren möchte. Ein Einsatzgebiet ist das Ausblenden von Werbung oder der Schutz der Privatsphäre. Der Ansatz ist hierbei der einer Blacklist. Das heißt, dass man eine Liste an Adressen pflegen muss, die man umleiten bzw. manipulieren möchte. Dies kann ebenso durch passende Records in der hosts-Datei erfolgen.

Beispielsweise könnte man den Zugriff auf Facebook und das Einblenden von Like-Buttons verhindern wollen. Dazu trägt man folgende zwei Zeilen in die Datei /etc/dnsmasq.conf ein:

address=/facebook.com/127.0.0.1
address=/fbcdn.net/127.0.0.1

und startet dann dnsmasq neu:

systemctl restart dnsmasq 

Dadurch werden alle DNS-Anfragen für facebook.com, fbcdn.net (das Facebook Content Delivery Network) und deren Subdomains (z.B. www.facebook.com) so manipuliert, dass die Anfragen auf den eigenen Rechner umgeleitet werden. Dort laufen sie dann ins Leere.

Werbenetzwerke (z.B. Double Click) und Statistikdienste (z.B. Google Analytics) kann man auf die gleiche Art und Weise aus seinem Netzwerk fernhalten:

address=/doubleclick.net/127.0.0.1
address=/google-analytics.com/127.0.0.1

Der Vorteil dieser Lösung ist eine zentrale Stelle, an der die Filterregeln angewendet werden. Solange jeder Computer im Netzwerk diesen DNS-Server nutzt. So muss nicht jeder Nutzer an jedem Computer im Netzwerk in jedem Browser einen Werbeblocker installieren.

Nachteilig ist jedoch der manuelle Aufwand, da die Blacklist nicht automatisch gepflegt wird. Außerdem kann der Zugriff auf z.B. Facebook nicht verhindert werden, wenn direkt die IP genutzt wird, um auf die Webseite zu gelangen.

Damit DNS-Anfragen nicht weiter aufgelöst werden, z.B. interne Domains wie .localnet oder fritz.box, kann man dies in der /etc/dnsmasq.conf auch so konfigurieren:

local=/localnet/
local=/fritz.box/

Alle DNS-Anfragen zu *.localnet oder *.fritz.box werden nur anhand der /etc/hosts ausgewertet und verlassen den Rechner nicht. Dies kann ebenso für die Reverse-Bereiche der privaten IPv4- und IPv6-Adressen erfolgen.

local=/10.in-addr.arpa/ 
#sorgt dafür, dass die Anfragen der PTR-Records für 10.0.0./8 nie an anderen DNS-Server gehen

local=/d.f.ip6.arpa/ 
#wie oben, aber für IPv6 und das Netz fd00::/8

Dnsmasq starten / stoppen / prüfen / aktivieren mit root-Rechten

Neu starten:

sudo systemctl restart dnsmasq

Stoppen:

sudo systemctl stop dnsmasq

Status anzeigen:

sudo systemctl status dnsmasq

Dnsmasq beim Systemstart ausführen:

sudo systemctl enable dnsmasq

Weitere interresante Artikel finden Sie in unserem Blog, oder machen Sie doch gleich mit dem nächsten Linux Beitrag weiter.

Gerne können Sie uns zu diesem, wie auch vielen weiteren Themen konsultieren.