ubuntuusers.de

Dnsmasq

Dieser Artikel wurde für die folgenden Ubuntu-Versionen getestet:


Du möchtest den Artikel für eine weitere Ubuntu-Version testen? Mitarbeit im Wiki ist immer willkommen! Dazu sind die Hinweise zum Testen von Artikeln zu beachten.

Artikel für fortgeschrittene Anwender

Dieser Artikel erfordert mehr Erfahrung im Umgang mit Linux und ist daher nur für fortgeschrittene Benutzer gedacht.

Zum Verständnis dieses Artikels sind folgende Seiten hilfreich:

./dnsmasq_icon.png 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.

Dnsmasq ist somit:

Installation

Hinweis:

Auf einem Ubuntu-Desktop-System können einige Dienste laufen, die die DNS-Konfiguration beeinflussen. Dies sind unter anderem systemd-resolved, NetworkManager und dhcpd. Diese sind so zu konfigurieren, dass sie nicht mit Dnsmasq in die Quere kommen. Dies betrifft auch den NetworkManager, sofern dieser installiert ist (bei Desktopsystemen Standard).

Das Programm ist in den offiziellen Paketquellen enthalten. Es kann über das folgende Paket installiert [1] werden:

  • dnsmasq (universe)

Befehl zum Installieren der Pakete:

sudo apt-get install dnsmasq 

Oder mit apturl installieren, Link: apt://dnsmasq

Konfiguration als DNS-Server

Dnsmasq greift zur lokalen Namensauflösung auf die Datei /etc/hosts zurück. Daher sollte man diese mit einem Editor [2] und Root-Rechten bearbeiteten [3] und Zeilen in dieser Art hinzufügen.

## Lokales Netzwerk
#  = IP =     =  Domainname =    = Alias =
192.168.1.1     router.example.org   ns1.example.org  ## Router und Nameserver auf einer IP, ns1 ist ein Alias.
192.168.1.2     neo.example.org                       ## Workstation ohne Alias mit IPv4-Adresse
2001:db8::5     neo.example.org                       ## IPv6-Eintrag für obige Workstation

Bei Reverse-Anfragen wird mit dem ersten Eintrag geantwortet. Es können auch Aliase gelistet werden, wie hier ns1. Als Beispiel-Domain wird "example.org" genutzt. Üblicherweise besitzt man in einem LAN keine echte Domain, man sollte hier eine Bezeichnung nutzen, die nicht im Internet vorkommt (in Anhang G zur RFC6762 🇬🇧 empfiehlt die IETF 🇬🇧 bspw. .intranet, .internal, .private, .corp, .home oder .lan). Als Schutz vor Namenskollisionen empfiehlt die ICANN 🇬🇧 jedoch, besser eigene FQDN zu nutzen (z.B. beispiel.de) und dann für interne Netze eine Subdomain (z.B. intranet.beispiel.de) zu verwenden (PDF 🇬🇧). Weiterhin sollte die Endung ".local" nicht verwendet werden, da diese für Multicast-DNS über Avahi benutzt wird und es dabei zu Konflikten kommen kann, da eben nicht der eigene DNS-Server abgefragt wird, sondern der Domainname per Multicast-DNS aufgelöst wird.

Verwendung des Cache

Unter Ubuntu wird in 18.04 und neuer der Dienst systemd-resolved genutzt. Dieser lauscht auf 127.0.0.53 auf Port 53. Dieser Dienst verwaltet ebenso die Datei /etc/resolv.conf und muss entsprechend beendet und deaktiviert werden, damit die Namensauslösung korrekt arbeitet. Dazu muss ggf. die Verknüpfung gelöscht und diese Datei anschließend manuell erstellt und mit Inhalt gefüllt werden.

Damit alle DNS-Anfragen über Dnsmasq verarbeitet und bei Bedarf an externe DNS-Server weitergereicht werden, ist der einfachste Weg, die Datei /etc/resolv.conf zu bearbeiten. Dabei ist sicher zu stellen, dass der lokale DNS-Server (Dnsmasq) als erste Zeile eingetragen wird (127.0.0.1). 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:

nameserver 127.0.0.1
nameserver 192.168.178.1
nameserver 2001:470:20::2

Das erfolgreiche lokale Cachen überprüft man am Terminal:

dig ubuntuusers.de 

antwortet am Ende mit

;; Query time: 0 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)

Soll Dnsmasq wirklich nur als DNS-Server für den eigenen Rechner arbeiten, braucht man nichts mehr zu konfigurieren.

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 dazu bringen, dass es auch an der Netzwerkschnittstelle nach DNS-Abfragen lauscht. Damit die Clients wissen, wie sie den DNS-Server finden, muss der Rechner, auf dem Dnsmasq läuft, dann mit einer statischen Adresse versehen sein.

/etc/dnsmasq.conf muss mit Administrator-Rechten bearbeitet werden und folgende Zeilen werden geändert bzw. hinzugefügt:

listen-address=127.0.0.1
listen-address=aaa.bbb.ccc.ddd
listen-address=2001:db8::34

wobei aaa.bbb.ccc.ddd die lokale statische IP4-Adresse des Dnsmasq-Rechners ist, also z.B. 192.168.0.20; es muss sowohl die 127.0.0.1 als auch die aaa.bbb.ccc.ddd 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

sudo ss -tulpen | grep dnsmasq 

überprüfen, man sieht dann in der Abteilung LISTEN, ob Dnsmasq auf 127.0.0.1 und aaa.bbb.ccc.ddd lauscht.

Umleiten und Manipulieren von DNS-Abfragen

Umleiten

Das Umleiten von DNS-Abfragen kann nötig oder sinnvoll sein, wenn man sich in einem Firmennetzwerk mit eigenem Nameserver befindet. Man möchte vielleicht nicht, dass mittels Logs auf dem DNS-Server mitprotokolliert werden kann, wo man herumsurft, braucht aber dennoch die Namensauflösung fürs Firmenintranet. 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 trägt man 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.

Hier zwei weitere mehr oder weniger sinnvolle Beispiele:

server=/google.com/8.8.8.8 # leitet alle DNS-Anfragen für google.com-Seiten an den Google Nameserver weiter
server=/de/213.73.91.35 # leitet alle DNS-Anfragen für .de-Seiten an den Nameserver des Berliner CCC weiter

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 und startet dann dnsmasq neu.

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

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 sollen, z.B. interne Domains wie .localnet oder fritz.box, kann man dies auch 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

Loglevel

Das Aktivieren der Option loggt die DNS-Anfragen mit. Diese werden ins Syslog geschrieben.

log-queries

Ausschnitt aus dem Syslog:

Sep 11 12:54:00 test systemd[1]: Started dnsmasq - A lightweight DHCP and caching DNS server.
Sep 11 12:54:03 test dnsmasq[1202]: query[AAAA] heise.de from 127.0.0.1
Sep 11 12:54:03 test dnsmasq[1202]: forwarded heise.de to 2001:470:20::2
Sep 11 12:54:03 test dnsmasq[1202]: reply heise.de is 2a02:2e0:3fe:1001:302::
test@test:~$ 

Konfigurationsänderungen aktivieren

Nach einer Änderung von /etc/dnsmasq.conf muss dnsmasq neu gestartet werden, um die Änderungen wirksam werden:

sudo systemctl restart dnsmasq 

NetworkManager konfigurieren

Damit der NetworkManager nicht die Datei /etc/resolv.conf verändert, muss in der Datei /etc/NetworkManager/NetworkManager.conf folgende Zeile vorhanden sein:

dns=None

Dadurch greift der NM gar nicht mehr in die DNS-Konfiguration ein.

Diese Revision wurde am 2. November 2021 18:44 von Heinrich_Schwietering erstellt.
Die folgenden Schlagworte wurden dem Artikel zugewiesen: Netzwerk, Server, dhcp, dns