Skip to main content

Dnsmasq: getestete Konfigurationsdateien und -beispiele

Einleitung

Dnsmasq ist ein kleiner Dienst für Linux/MAC OS, der drei Basisdienste bereitstellen kann und dabei sehr wenig Ressourcen verbraucht. Er kann poblemlos auch aus einem RaspberryPI betrieben werden. Bei den Diensten handelt es sich um

  • DHCP-Server und/oder DHCP-Proxy für IPV4 und IPV6
  • DNS-Server inkl. DNSSEC
  • TFTP-Server

Übersicht einiger Basiskommandos

Debuggen ohne als Dienst in den Hintergrund zu fallen

dnsmasq --no-daemon --log-queries

Konfiguration auf Syntaxfehlern testen

dnsmasq --test

Version von Dnsmasq ermitteln

dnsmasq -v
 
Dnsmasq Version 2.76  Copyright (c) 2000-2016 Simon Kelley
Kompilierungs-Optionen IPv6 GNU-getopt DBus i18n IDN DHCP DHCPv6 no-Lua TFTP conntrack ipset auth DNSSEC loop-detect inotify

DHCP-Proxy

Wofür?

Einen DHCP-Proxy benötigt man, wenn man via PXE über das Netzwerk booten möchte, aber der DHCP-Server im Netz diese Funktion nicht unterstützt (z.B. eine AVM FritzBox oder die meisten andern Konsumer Router) oder man keine Rechte hat auf dem DHCP-Server die notwendigen Einstellungen vorzunehmen.

Mininmalkonfiguration für den Einsatz mit einem externen TFTP-Server

Die Beispielkonfiguration /etc/dnsmasq.conf ist run 20kb groß und enthält deutlich mehr Optionen, als man für einen DHCP-Proxy benötigt. Dieses Beispiel ist dafür gedacht, wenn man bereits einen Network Attached Storage in Betrieb hat und dieser auch als TFTP-Server genutzt werden soll. DNSmasq kann selbst auch als TFTP-Server agieren, aber das ist in diesem, speziellen Beispiel nicht aktiviert.

DHCP-Proxy Server mit externem TFTP-Server, um Netzwerkkboot zu ermöglichen
# DNS Dienst abschalten
port=0
 
# Falls man mehr als eine NIC hat, kann man hier gestlegen auf welchem Interface der Proxy Dienst arbeiten soll
# interface=eth0
bind-dynamic
bogus-priv
domain-needed
no-resolv
no-poll
 
# Hier die IP-Adresse des Servers eintragen, auf dem Dnsmasq läuft. Es kann auch die Basisadresse eines Subnetzes
# angegeben werden. z.B. 192.168.0.0
dhcp-range=192.168.1.10,proxy
dhcp-no-override
 
# Falls der folgende Parameter pxe-prompt fehlt, funktioniert kein Netzwerkboot mehr.
pxe-prompt="", 0
 
# Extra logging für DHCP: loggt alle Options die zu den DHCP clients gesendet wurde und auch die tags, die für die ermittlung verwendet wurden
# Beim Debugging von PXE-Problemen und dem Tagging extrem hilfreich!
log-dhcp
 
# Pfad zur Logdatei. Falls dieser nicht definiert ist, wird stattdessen im Syslog protokolliert.
log-facility=/var/log/dnsmasq.log
 
 
### Tagging und Tagabhängige operationen #####################################
dhcp-userclass=set:iPXE,iPXE
# iPXE: optional. Überträgt die Adresse des iSCSI Targets. In diesem Beispiel die von einem FreeNAS-Server.
#dhcp-option-force=203,iqn.2017-01.filer.ctl
 
# iPXE: IP-Adresse des TFTP-Servers und der Name der zu bootenden Datei. Kann z.B. auch pxelinux.0 sein.
dhcp-boot=tag:!iPXE,undionly.kpxe,,192.168.1.10
 
# iPXE: Wenn das iPXE ROM aktiv ist, dann hier den Namen der zu ladenden Konfigurationsdatei an den Client senden.
dhcp-boot=tag:iPXE,boot.ipxe,,192.168.1.10

Wenn alles funktioniert, muss beim Versuch über das Netzwerk zu booten der gelb markierte Abschnitt zu sehen sein. In diesem Beispiel wird iPXE gestartet, aber es könnte auch genauso gut pxelinux sein.

dhcpproxy_boot.PNG

Auffallend ist, das die IP-Adresse des DHCP-Proxys nicht dieselbe ist, wie die des DHCP-Servers.

Tagging von Clients

Was ist Tagging?

DNSMasq macht es dem Administrator relativ einfach Clients im Netz mit einem sogenannten Tag zu versehen. Dieses Tagging erleichtert dann eine Gruppierung um dann letztlich für eben diese Gruppe von Clients mit demselben Tag gewissen Aktionen oder auch andere Informationen per DHCP zuzuweisen.

Clients anhand ihrer MAC-Adresse taggen

In ESXI beginnen alle MAC-Adressen mit 00:0c:29. Mit der folgenden Zeile kann man mittels Wildcards alle Clients mit dem Tag vmware versehen.

dhcp-mac=set:vmware,00:0c:29:*:*:*       # vmware

Taggen von iPXE Clients (Chainlooping)

Booten über das Netzwerk via iPXE stellt besondere Ansprüche an die Konfiguration. Denn bei der ersten Bootanfrage eines Clients muss als Dateiname der Name des iPXE Roms an den Client übermittelt werden. Nachdem dann das iPXE ROM beim Client angekommen und gestartet wurde, sendet iPXE wiederum wieder ein Anfrage an den DHCP-Server bzw. DHCP-Proxy um einen Dateinamen für die Konfiguration zu erhalten. Wenn nun wieder das iPXE ROM ausgeliefert wird, dreht sich das ganze im Kreis.

Die Kunst für den DHCP Server ist es nun zu erkennen, wer will einen Dateinamen erhalten? iPXE sendet bei der Abfrage nach einem Dateinamen eine UserClass mit dem Inhalt iPXE (Hexadezimal 0x69 0x50 0x58 0x45) an den DHCP-Server. Und anhand dieser Klasse kann erkannt werden, das es sich um ein iPXE Client handelt und diesem dann abweichend einen anderen Dateinamen ausliefern. Auch hier kommt Tagging zum Einsatz. (Info) Der Name des Tags ist frei wählbar und unterscheidet zwischen Groß-/leinschreibung

dhcp-userclass=set:iPXE,iPXE  # iPXE sendet eine User-Klasse iPXE
 
# Alles was NICHT iPXE ist, bekommt undionly.kpxe als FILENAME (Option 67)
# Siehe auch https://tools.ietf.org/html/rfc2132#page-27 Kapitel 9.5
dhcp-boot=tag:!iPXE,undionly.kpxe,,<TFTPSERVER-IP>
 
# Alles was den Tag iPXE besitzt, bekommt das Bootmenü
dhcp-boot=tag:iPXE,http://boot.ipxe.org/demo/boot.php,,<TFTPSERVER-IP>

Anhang

Liste der in DNSmasq bekannten Optionen

Mittels des Parameters dhcp-option kann man auch benamte Optionen an den Client senden. In dieser Tabelle, die man auch auf der Konsole mit

dnsmasq --help dhcp

bekommt, sind alle bekannten Optionen aufgelistet. Gleichzeitig bekommt man so auch eine Idee, welche Option welcher Nummer zugeordnet ist.

Nr
Name
1 netmask
2 time-offset
3 router
6 dns-server
7 log-server
9 lpr-server
13 boot-file-size
15 domain-name
16 swap-server
17 root-path
18 extension-path
19 ip-forward-enable
20 non-local-source-routing
21 policy-filter
22 max-datagram-reassembly
23 default-ttl
26 mtu
27 all-subnets-local
31 router-discovery
32 router-solicitation
33 static-route
34 trailer-encapsulation
35 arp-timeout
36 ethernet-encap
37 tcp-ttl
38 tcp-keepalive
40 nis-domain
41 nis-server
42 ntp-server
44 netbios-ns
45 netbios-dd
46 netbios-nodetype
47 netbios-scope
48 x-windows-fs
49 x-windows-dm
58 T1
59 T2
60 vendor-class
64 nis+-domain
65 nis+-server
66 tftp-server
67 bootfile-name
68 mobile-ip-home
69 smtp-server
70 pop3-server
71 nntp-server
74 irc-server
77 user-class
93 client-arch
94 client-interface-id
97 client-machine-id
119 domain-search
120 sip-server
121 classless-static-route
125 vendor-id-encap
255 server-ip-address

DHCP-Proxy in Docker

docker run \
        -d \
        --name dnsmasq \
        --net host \
        --restart unless-stopped \
        -v $(pwd)/dnsmasq.conf:/etc/dnsmasq.conf \
        -v /tftproot:/tftproot \
        --log-opt "max-size=100m" \
        -e "HTTP_USER=admin" \
        -e "HTTP_PASS=1234" \
        jpillora/dnsmasq


siehe auch → https://github.com/jpillora/docker-dnsmasq