Dieser Artikel ist größtenteils für alle Ubuntu-Versionen gültig.
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:
ein Nameserver-Forwarder
ein DHCP-Server
ein Namenscache
optimiert für Netzwerke mit Dialup-Außenverbindung
Das Programm ist in den offiziellen Paketquellen enthalten. Es kann über das folgende Paket installiert [1] werden:
dnsmasq (universe)
mit apturl
Paketliste zum Kopieren:
sudo apt-get install dnsmasq
sudo aptitude install dnsmasq
Dnsmasq greift zur lokalen Namensauflösung auf die Datei /etc/hosts zurück. Daher sollte man diese mit einem Editor [3] und Root-Rechten bearbeiteten [3] und Zeilen in dieser Art hinzufügen.
## Lokales Netzwerk # = IP = = Domainname = = Rechnername = 192.168.1.1 router.example.org router ## Router 192.168.1.2 neo.example.org neo ## Workstation 192.168.1.3 felidae.example.org felidae ## ein Client-Rechner 192.168.1.5 link.example.org link ## Notebook 192.168.1.11 zeus.example.org zeus ## Der Server 192.168.1.66 bridge.example.org bridge ## WLAN-Brücke
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 von Avahi benutzt wird und es dabei zu Konflikten kommen kann. Wird im Netzwerk dennoch diese Endung vergeben und kommt es genau dabei zu keiner erfolgreichen Auflösung, so lässt sich Avahi zur Analyse mit folgendem Befehl vorübergehend beenden:
sudo service avahi-daemon stop
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:
nameserver 127.0.0.1 nameserver 192.168.178.1
Bei der Verwendung von Wicd wird resolv.conf automatisch verwaltet bzw. überschrieben, daher müssen statische DNS in genau dieser Reihenfolge festgelegt werden.
Bei Verwendung des NetworkManager darf resolv.conf nicht manuell bearbeitet werden. Stattdessen kann die Verbindung im Netzwerkmanager auf "Automatisch (DHCP), nur Adressen" oder auf "manuell" gesetzt werden. Dann können die IP-Adressen von bis zu drei DNS-Servern - durch Kommata getrennt - in das vorgesehene Feld eingetragen werden. Werden die Änderungen gespeichert, werden diese Einträge vom Netzwerkmanager in die Datei resolv.conf geschrieben.
Falls das Paket resolvconf (in den Main Quellen vorhanden) installiert ist, wird die Datei /etc/resolv.conf gleich beim Starten des Systems von dnsmasq geändert, dass automatisch nur noch 127.0.0.1 darin aufgeführt wird. Die von dnsmasq verwendete resolv.conf liegt dann unter /var/run/dnsmasq/resolv.conf und beinhaltet dort die "echten" DNS-Server der Netzwerkkonfiguration, wie beispielsweise in /etc/network/interfaces hinterlegt.
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.
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
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-Nrn. muss man - sofern gewünscht oder nötig - auch die zusätzlichen IP-Nrn. angeben. Damit kann man z.B. für ein ganzes Heim-Netzwerk, ein Büro oder auch eine grössere Firma zentral die Zugriffe zum Internet regeln (s. unten).
Ob das funktioniert, kann man mit dem Konsolenbefehl
sudo netstat -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.
Rechner im LAN, die diesen DNS-Server nutzen wollen, sollten danach so konfiguriert werden, dass sie den Server auch nutzen. Bei Windows-Systemen geht dies in den Netzwerkeinstellungen, und auch bei Linux-Clients lässt sich der zu nutzende DNS-Server leicht einstellen.
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.
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
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.
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 .local
oder fritz.box
, kann man dies auch konfigurieren:
local=/localnet/ local=/fritz.box/
Alle DNS-Anfragen zu *.local
oder *.fritz.box
werden nur anhand der /etc/hosts ausgewertet und verlassen den Rechner nicht.
Soll Dnsmasq zusätzlich noch als DHCP-Server fungieren, so muss man noch die Datei /etc/dnsmasq.conf entsprechend bearbeiten [3]. Üblicherweise braucht hier nicht viel eingestellt zu werden. Die wichtigsten Optionen werden im folgenden vorgestellt.
# Uncomment this to enable the integrated DHCP server, you need # to supply the range of addresses available for lease and optionally # a lease time. If you have more than one network, you will need to # repeat this for each network on which you want to supply DHCP # service. dhcp-range=192.168.0.100,192.168.0.254,12h ## 12h ist die Lease-Time
In diesem Abschnitt wird festgelegt, aus welchem Bereich der DHCP-Server Adressen vergibt. Üblicherweise kann man hier IP-Bereiche eintragen, die für Private IP-Adressen vorgesehen sind. Im angegebenen Beispiel würde der DHCP-Server Adressen aus dem Bereich 192.168.0.100
bis 192.168.0.254
vergeben und die Zuordnung Rechner <-> IP jeweils 12 Stunden lang beibehalten. Die Adressen 192.168.0.0
und 192.168.0.255
dürfen keinem Endgerät zugeordnet werden, da dies die Netz- bzw. Broadcast Adressen sind.
Für manche Anwendungen ist es praktisch, wenn ein Rechner immer unter der selben IP-Adresse zu erreichen ist. Wenn man dies möchte, so kann man der MAC-Adresse der Netzwerkkarte des betroffenen Rechners eine feste IP-Adresse zuordnen.
dhcp-host=00:07:95:26:2B:C9,neo,192.168.1.2,infinite
In diesem Beispiel würde also der Netzwerkkarte mit der MAC-Adresse 00:07:95:26:2B:C9
immer der Name neo
und die IP-Adresse 192.168.1.2
für eine unbestimmte Zeit zugewiesen.
Benutzt man zum Beispiel ein Notebook, das im Wechsel mal per Kabelnetzwerk, mal via WLAN vernetzt ist, wird dies anhand der MAC-Adresse erkannt und eine freie IP-Adresse vergeben.
dhcp-host=00:00:0E:D2:DA:BE,link,infinite dhcp-host=00:02:2d:a9:55:92,link,infinite
Zahlreiche weitere Beispiele und Konfigurationsmöglichkeiten sind in der /etc/dnsmasq.conf selber aufgeführt.
Der DHCP-Server kann seinen Client-Rechnern nicht nur IPs zuweisen, sondern auch alle notwendigen Netzwerkinformationen übermitteln. Diese und noch weitere Einstellungen lassen sich ebenfalls in der /etc/dnsmasq.conf setzen.
## Syntax: erst die Option, dann die entsprechende Adresse dhcp-option=3,192.168.1.1
Die IP-Adresse des Gateways, um Daten in das Internet schicken zu können. Läuft Dnsmasq auf demselben Rechner, der sich auch in das Internet einwählt, so ist das die lokale IP-Adresse des Rechners.
Um mehrere Gateways (Internetverbindungen) in einem Netzwerk zu betreiben, werden den einzelnen Gateways Namen (Tags) hinzugefügt. Diese wiederum werden den einzelnen Clients zugeteilt. So erreicht man, dass jeder Client im Netzwerk eine bestimmte Internetverbindung verwendet.
# Gateways festlegen dhcp-option=tag:gateway1,3,192.168.1.2 dhcp-option=tag:gateway2,3,192.168.1.3
# DHCP für Unbekannte dhcp-range=set:gateway1,192.168.1.200,192.168.1.250,255.255.255.0,12h
# Clients: dhcp-host=set:gateway1,00:1A:4D:49:80:C2,192.168.1.111,12h # Client 192.168.1.111 verwendet 192.168.1.2 als Gateway dhcp-host=set:gateway2,00:1A:4B:6F:C6:65,192.168.1.121,12h # Client 192.168.1.121 verwendet 192.168.1.3 als Gateway
Der zu nutzende NTP-Zeitserver, um die exakte Uhrzeit aus dem Internet zu beziehen:
dhcp-option=42,130.133.1.10 # Timeserver time.fu-berlin.de
Ein lokaler Rechner mit PXE-Boot-Images, um über das Netzwerk den Rechner booten zu können:
dhcp-boot=/pxelinux.0,zeus,192.168.1.11
log-queries
Für Tests kann man den Loglevel erhöhen, also die Menge der Informationen, die mitgeloggt wird. So kann man bei Fehlern oder Problemen schnell auf die Lösung kommen. Welche IP-Adressen Dnsmasq gerade vergeben hat kann man in der Datei /var/lib/misc/dnsmasq.leases nachlesen.
server=/localnet/IP-Adresse_des_MasterDNS
Sollten sich im Netzwerk noch weitere DNS-Server befinden, so kann man diese hier noch zusätzlich angeben.
Nach einer Änderung von /etc/dnsmasq.conf muss dnsmasq neu gestartet werden, um die Änderungen wirksam werden:
sudo service dnsmasq restart
dnsmasq - HowTo im Debian-Wiki
Dnsmasq im Ubuntu-Wiki
dnsmasq - Tipps und Tricks von LinuxWiki.org
Ubuntu dnsmasq DNS-Server Howto - DNS caching/forwarding/adblock, 10/2016
Diese Revision wurde am 23. Januar 2017 00:10 von MisterX erstellt.