Wie konfiguriere ich systemd-resolved und systemd-networkd für die Verwendung eines lokalen DNS-Servers zum Auflösen lokaler Domänen und eines Remote-DNS-Servers für Remote-Domänen?

26

Ich bin mit einem lokalen Netzwerk verbunden und habe über ein Gateway Zugriff auf das Internet. Es gibt einen DNS-Server im lokalen Netzwerk, der Hostnamen von Computern aus dem lokalen Netzwerk auflösen kann.

Ich möchte systemd-resolved und systemd-networkd so konfigurieren , dass Suchanfragen nach lokalen Hostnamen ausschließlich an den lokalen DNS-Server und Suchanfragen nach allen anderen Hostnamen ausschließlich an einen anderen entfernten DNS-Server gerichtet werden.

Nehmen wir an, ich weiß nicht, wo sich die Konfigurationsdateien befinden oder ob ich weitere Dateien hinzufügen und ihre Pfade in der Antwort angeben soll.

Piotr Dobrogost
quelle

Antworten:

28

In der Konfigurationsdatei für die lokale Netzwerkschnittstelle muss entweder angegeben werden, dass die lokale DNS-Serveradresse vom DHCP-Server mit der folgenden DHCP=Option bezogen werden soll :

[Network]
DHCP=yes

oder geben Sie die Adresse explizit mit der DNS=Option an :

[Network]
DNS=10.0.0.1

Zusätzlich müssen wir (im selben Abschnitt) lokale Domänen mit der Option angebenDomains=

Domains=domainA.example domainB.example ~example

Wir geben lokale Domänen domainA.example domainB.examplean, um das folgende Verhalten zu erzielen (von systemd-resolved.service, systemd-resolved man page):

Suchen nach einem Hostnamen, der auf eine der Domänen pro Schnittstelle endet, werden ausschließlich an die entsprechenden Schnittstellen weitergeleitet.

Dieser Weg hostX.domainA.examplewird ausschließlich von unserem lokalen DNS-Server gelöst .

Wir legen damit fest, ~exampledass alle Domänen, die auf enden example, als reine Routendomänen behandelt werden sollen, um das folgende Verhalten zu erzielen (aus der Beschreibung dieses Commits):

DNS-Server mit Nur-Route-Domänen sollten nur für die angegebenen Domänen verwendet werden.

Dieser Weg hostY.on.the.internetwird ausschließlich von unserem globalen, entfernten DNS-Server gelöst .

Hinweis

Idealerweise sollten bei Verwendung des DHCP-Protokolls lokale Domänennamen vom DHCP-Server bezogen werden, anstatt sie explizit in der Konfigurationsdatei der obigen Netzwerkschnittstelle anzugeben. Siehe UseDomains=Option . Es gibt jedoch noch offene Probleme mit dieser Funktion - siehe Problem mit der Option systemd-networkd DHCP search domains .

Wir müssen den Remote-DNS-Server als unseren globalen, systemweiten DNS-Server angeben. Wir können dies in /etc/systemd/resolved.confDatei tun :

[Resolve]
DNS=8.8.8.8 8.8.4.4 2001:4860:4860::8888 2001:4860:4860::8844

Vergessen Sie nicht, die Konfiguration neu zu laden und die Dienste neu zu starten:

$ sudo systemctl daemon-reload
$ sudo systemctl restart systemd-networkd
$ sudo systemctl restart systemd-resolved

Vorsicht!

Die obigen Garantien gelten nur, wenn Namen von systemd-resolved aufgelöst werden - siehe Manpage für nss-resolve, libnss_resolve.so.2 und Manpage für systemd-resolved.service, systemd-resolved .

Siehe auch:

Verweise:

Piotr Dobrogost
quelle
6
Haben Sie .localin diesem Beispiel darüber nachgedacht, nicht zu verwenden ? Natürlich sollte dies bei Avahi für MDNS reserviert sein, und der Missbrauch war ein großes Nein-Nein. Es wäre klarer zu mir zu verwenden example.comoder .example .
Sourcejedi
1
@sourcejedi Als Referenz .localwird in RFC 6762 - Multicast-DNS im Abschnitt Multicast-DNS-Namen eine spezielle Domäne definiert . Danke, behoben.
Piotr Dobrogost
Hinweis ohne Bezug: Sie können Antworten auch selbst akzeptieren.
intelfx
2
Ich denke, es wäre nützlich, den Speicherort der Konfigurationsdatei für die lokale Netzwerkschnittstelle hinzuzufügen . Sie sind sich nicht sicher, ob Sie Recht haben, oder /etc/systemd/network/*.network? Gefunden hier superuser.com/a/1365864
Pierre Cordier
1
Ich stelle fest, dass die Antwort "In der Konfigurationsdatei ..." nicht auf die Antwort "Nehmen wir an, ich weiß nicht, wo sich die Konfigurationsdateien befinden ..." des OP reagiert Speicherort bestimmter Konfigurationsdateien, diese Antwort ist unvollständig.
Eric Towers
1

Vergessen Sie nicht, die Konfiguration als Quelle für die DNS-Auflösung /etc/nsswitch.confzu verwenden , um die ausgezeichnete Antwort von @piotrDobrogost zu erweitern systemd-resolved. Ihre hostsDirektive sollte für Ihren speziellen Anwendungsfall wie folgt aussehen:

/etc/nsswitch.conf

hosts:  files resolve dns

Wenn Sie also die Auflösung auf nur die Domänen beschränken, die in der DomainsDirektive in den /etc/systemd/resolved.confobigen Piotr-Details angegeben sind, sollte DNS als Nächstes in der angegebenen Reihenfolge der Quellen für die Namensauflösung konsultiert werden, /etc/nsswitch.confwenn Domänen in der Direktive NICHT gefunden werden Domains:

Die folgende Link verweist auf die Anforderung zu spezifizieren Entschlossenheit in /etc/nsswitch.confso systemd-resolvedbei der Namensauflösung herangezogen wird:

https://github.com/systemd/systemd/issues/940

Ich habe festgestellt, dass die SystemD-Dokumentation schlimm ist. Ich musste ein Verständnis aus mehreren Links zusammensetzen, einschließlich der obigen Antwort von Piotr ;-)

F1Linux
quelle
Bei Verwendung des empfohlenen Betriebsmodus von systemd-resolved, in dem /etc/resolve.confsich ein Symlink zu einer /run/systemd/resolve/stub-resolv.confDatei befindet, die wiederum die Adresse des DNS-Stub-Resolvers von systemd-resolve enthält , ist es nicht erforderlich, eine resolveAnweisung in die /etc/nsswitch.confDatei einzufügen, da DNS-Anforderungen (aufgrund der Standardanweisung nss-dns) an geleitet werden Stub-Resolver, der nach den Regeln von systemd-resolved arbeitet .
Piotr Dobrogost
@PiotrDobrogost Wie können Sie die Reihenfolge steuern, in der DNS-Auflösungsquellen konsultiert werden, ohne dass /etc/nsswitch.conf``? In the specimen config above, / etc / hosts` (" Dateien ") auf statische IP: Namenszuordnungen überprüft werden, und wenn keine gefunden werden, wird der vom System aufgelöste Stub, der aufgelöst wurde, als nächstes konsultiert . Ich kann nicht sehen, wie es möglich wäre, DNS-Auflösungsquellen ohne Verwendung von bereitzustellen /etc/nsswitch.conf. Vermisse ich hier einen Trick?
F1Linux
Ich sage nicht, /etc/nsswitch.confist nicht erforderlich. Ich sage, wenn man den Stub-DNS-Resolver von systemd-resolved verwendet, ist es ausreichend, die dnsDirektive hosts:(vermutlich nach der fileDirektive) in einer Zeile aufzulisten. Dort ist keine resolveDirektive erforderlich, da der Stub-Resolver der Einstiegspunkt in die Logik von systemd-resolved ist und nicht das nss-resolvePlug-in-Modul ...
Piotr Dobrogost,
... Mit anderen Worten : Sie können reach die systemd aufgelöste Logik entweder durch resolveRichtlinie ➟ NSS-resolve NSS - Plug-in - Modul ➟ systemd aufgelöste oder durch dnsRichtlinie ➟ NSS-dns NSS - Plug-in - Modul ➟ Systemd aufgelösten der 'Stub - DNS - Resolver ➟ systemd-resolved
Piotr Dobrogost
@PiotrDobrogost Ich glaube ich bin beim filesdamaligen resolveDing im /etc/nsswitch.conf2. Teil deiner Frage angekommen . Beim erneuten Lesen haben Sie anscheinend gerade über das Überprüfen des lokalen Caches auf eine IP: -Namenszuordnung nachgedacht und sich dann an eine Weiterleitung gewandt, wenn diese nicht gefunden wurde. Im Allgemeinen habe ich die fileserste DNS-Auflösungsquelle so eingestellt, dass DNS umgangen wird, damit ich die Produktionshosts testen und nicht treffen kann
F1Linux,