Initialisieren von DNS in dnsmasq, bevor Leases zugewiesen werden

756
Mark Olbert

Ich bin gerade dabei, DHCP / DNS-Dienste für mein LAN von einem System, auf dem Wheezy ausgeführt wird, auf ein System zu übertragen, auf dem Stretch ausgeführt wird. Sowohl DHCP als auch DNS werden von dnsmasq bereitgestellt.

Was ich sehe, zumindest bei der Art und Weise, wie ich dnsmasq auf der neuen Maschine konfiguriert habe, ist, dass der DNS-Dienst, den er bereitstellt, nur über Geräte weiß, die DHCP-Leases von ihm erhalten haben. Ich hatte angenommen, dass es in der Lage wäre, Geräte aufzulösen, denen ich in dnsmasq.conf eine feste IP-Adresse zugewiesen hatte, noch bevor sie eine neue DHCP-Lease beantragten. Aber anscheinend ist das nicht der Fall ... oder ich habe etwas falsch konfiguriert.

Zum Beispiel trotz dieses Eintrags in dnsmasq.conf:

dhcp-host=1C:6F:65:39:09:8D,colossus,10.0.0.8 

Wenn Sie einen nslookup für colossus oder colossus.localnet ausführen (dies ist der Name, den ich meinem LAN zugewiesen habe), schlägt der Vorgang fehl.

Gibt es eine Möglichkeit, dnsmasq so zu konfigurieren, dass Geräte mit festen IP-Adressen aufgelöst werden, bevor Mietverträge zugewiesen werden?

Da Stretch jedoch resolvconf und dhcpcd verwendet und sowohl /etc/resolv.conf als auch /run/dnsmasq/resolv.conf überschreibt, wo sollte ich die festen IP-Adressen angeben, damit sie aufgelöst werden, noch bevor die Leasingverträge zugewiesen werden. Ich dachte darüber nach, sie in resolv.conf.tail zu setzen, aber das scheint kludig zu sein.

0

1 Antwort auf die Frage

1
Holger Böhnke

Ich habe dies auf Debian Wheezy und Jessie getestet und das OP hat bestätigt, dass es auch auf Stretch funktioniert. Stretch und Jessie verwenden resolvconf, wheezy nicht.

/etc/hostsGeben Sie einfach alle Ihre festen IP-Adressen in die lokale Datei des Hosts ein, auf dem dnsmasq ausgeführt wird. Sie fügen hier Hosts mit festen Adressen in Ihrem lokalen Netzwerk (Domäne local.net, IP- Adresse 192.168.0.xxxin diesem Beispiel) oder Hosts hinzu, die Sie aus irgendeinem Grund lokal überschreiben möchten:

# /etc/hosts # the local host 127.0.0.1 localhost  # provide fixed addresses used by dnsmasq for the local network 192.168.0.100 host0.local.net host0 192.168.0.101 host1.local.net host1 192.168.0.102 host2.local.net host2  # map a fancy service to the same address as above (e.g. on host2) 192.168.0.102 imap.local.net imap 192.168.0.102 mediaserver.local.net mediaserver  # overwrite an external host with address 1.2.3.4 1.2.3.4 some.external-host.com # map unwanted external hosts to localhost 127.0.0.1 some.malicious-advertising-server.com 

Dnsmasq liest die hosts-Datei vorzugsweise für den Aufruf externer Resolver. Daher sollten alle IP-Adressen in dieser Datei verfügbar sein, bevor einer dieser Hosts nach einer Lease (oder sogar nach einer Ausführung) fragt. Stellen Sie sicher, dass die folgenden Punkte in Ihrem System enthalten sind /etc/dnsmasq.conf:

# /etc/dnsmasq.conf ... # If you don't want dnsmasq to read /etc/hosts, uncomment the # following line. #no-hosts ... 

Wenn Ihre Domäne local.netkeine öffentlich verfügbare Domäne ist, fügen Sie sie in die folgende Klausel ein, um zu verhindern, dass dnsmaq Upstream-Auflöser in nicht vorhandenen Domänen abfragt:

# /etc/dnsmasq.conf ... # Add local-only domains here, queries in these domains are answered # from /etc/hosts or DHCP only. local=/local.net/ ... 

Möglicherweise möchten Sie einige weitere Optionen für die /etc/hostsDatei in überprüfen /etc/dnsmasq.conf. Die umgebenden Kommentare sind sehr informativ.

Jetzt möchten Sie Ihre physischen Hosts diesen IP-Adressen zuordnen. Wenn nicht vorhanden, erstellen Sie die Datei /etc/ethers. In dieser Datei tragen Sie die MAC-Adressen aller Hosts ein, die eine feste IP-Adresse erhalten sollen, gefolgt von ihrem entsprechenden DNS-Namen:

# /etc/ethers 1C:6F:65:39:09:8D host0.local.net 1C:6F:65:39:19:8D host1.local.net 1C:6F:65:39:29:8D host2.local.net 

Sie benötigen nur Ihre physischen Hosts, nicht die zusätzlichen Servicenamen, die Sie in der /etc/hostsobigen Datei definiert haben . Gehen Sie zurück zu Ihrem /etc/dnsmasq.confund prüfen Sie, ob das Lesen von /etc/ethersaktiviert ist:

# /etc/dnsmasq.conf ... # If this line is uncommented, dnsmasq will read /etc/ethers and act # on the ethernet-address/IP pairs found there just as if they had # been given as --dhcp-host options. Useful if you keep # MAC-address/host mappings there for other purposes. read-ethers 

Es gibt wieder mehr Optionen bezüglich /etc/ethers. Wenn Sie nach zusätzlichen Funktionen suchen, möchten Sie diese möglicherweise überfliegen.

Als dritten Schritt müssen Sie resolveconf davon überzeugen, den lokalen dnsmasq als ersten Resolver zu verwenden. Andernfalls funktioniert die Auflösung für dynamische Leases auf dem Host, auf dem dnsmasq ausgeführt wird, nicht ordnungsgemäß (nicht für die oben konfigurierten festen). So sieht mein /etc/resolvconf.confaus:

# /etc/resolvconf.conf # Configuration for resolvconf(8) # See resolvconf.conf(5) for details  resolv_conf=/etc/resolv.conf # If you run a local name server, you should uncomment the below line and # configure your subscribers configuration files below. name_servers=127.0.0.1  # Mirror the Debian package defaults for the below resolvers # so that resolvconf integrates seemlessly. dnsmasq_resolv=/var/run/dnsmasq/resolv.conf pdnsd_conf=/etc/pdnsd.conf unbound_conf=/var/cache/unbound/resolvconf_resolvers.conf 

Die Schlüsselzeile hier ist:

# /etc/resolvconf.conf ... name_servers=127.0.0.1 ... 

Sie weist den Resolver an, den lokalen Host als ersten Resolver zu verwenden. Das Problem hierbei ist, dass dnsmasq auch resolvconf verwendet, um unbekannte Adressen aufzulösen. Aber keine Sorge, dnsmasq ist klug genug, sich nicht in rekursiven Schleifen aufzurufen.

Eine letzte (wahrscheinlich offensichtliche) Sache: Wenn Sie auch einen dynamischen IP-Bereich definieren, z. B. für Gäste, mobile Geräte usw., stellen Sie sicher, dass er nicht mit den in folgenden Adressen angegebenen Adressen kollidiert /etc/hosts:

# /etc/dnsmasq.conf ... # 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.50,192.168.0.99,12h # this range must not include above addresses given in /etc/hosts ... 

Nun erhält dnsmaq die IP-Adressen aus der /etc/hostsDatei, unabhängig von einer vorhandenen Lease. DHCP-Anfragen lösen die MAC-Adresse mit /etc/etherseinem Domänennamen auf, der wiederum in eine IP -Adresse mit aufgelöst wird /etc/hosts.

So können Sie Hosts und Ether in separaten Dateien ordentlich konfigurieren und müssen nicht jeden Host /etc/dnsmaq.confmit der dhcp-hostOption ... ` in Ihren Ordner aufnehmen .

Danke, @Holger! Sowohl für die Antwort als auch für die ausführliche Erklärung, warum der Server gut konfiguriert werden kann. Ich habe jetzt eine viel klarere Vorstellung davon, wie dnsmasq, debian, dhcp und dns zusammenpassen. Außerdem mag ich die Tatsache, dass die verschiedenen Konfigurationsdetails an verschiedenen Stellen nicht dupliziert werden (z. B. dnsmasq.conf und hosts). Mark Olbert vor 5 Jahren 0
@ MarkOlbert Gern geschehen. Ich bin mir also bewusst, dass Sie an Stretch gearbeitet haben? Wenn ja, werde ich den Haftungsausschluss zu Beginn anpassen. Ich habe momentan nicht die Zeit, es auf Stretch selbst auszuprobieren. Aber ich werde es bald tun. Holger Böhnke vor 5 Jahren 0
Ja, es funktioniert gut! Übrigens, hier ist ein Beitrag, den ich über meine Erfahrungen geschrieben habe und über Ihre kritische Hilfe, die mir dabei hilft, Dinge zum Laufen zu bringen: https://jumpforjoysoftware.com/2018/11/dnsmasq-and-etc-ethers/. Mark Olbert vor 5 Jahren 0
Danke an @MarkOlbert für die Bestätigung, dass es auf Stretch funktioniert. Ich habe den Haftungsausschluss dahingehend geändert. Schöner Blogpost, vielen Dank für die Credits. Holger Böhnke vor 5 Jahren 0