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):
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:
Dnsmasq als DHCP-Server
Um Dnsmasq als DHCP-Sever einzusetzen, müssen folgende Eintragungen in der /etc/dnsmasq.conf erfolgen:
- DHCP Bereich und lease time (Lebenszeit der Adressvergabe)
- Standardgateway
- NTP Server
- IP-Adressen der DNS-Server
- 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
Wenn wir auch Sie beim Aufbau eines eigenen Dnsmasq Servers oder dem Managed Hosting eines Dnsmasq Serves unterstützen können, dann nehmen Sie gerne Kontakt auf.
Weitere interresante Artikel finden Sie in unserem Blog, oder machen Sie doch gleich mit dem nächsten Linux Beitrag weiter.
- Migration von DropBox zu Nextcloud - 20. September 2024
- Draw.io – Das Diagramm-Tool als Nextcloud-Integration - 6. September 2024
- Plausible Analytics – die Community Edition realisiert mit Docker - 4. September 2024