Wie kann die "Systemd-Resolution" -Konfiguration für eine bestimmte Netzwerkschnittstelle beibehalten werden?

1

Ich habe meinen Ubuntu-Desktop auf Bionic Beaver aktualisiert und auf systemd-resolve umgestellt . Mit dieser Änderung funktionierte die LXD-DNS-Auflösung nicht mehr.

Um LXD-Container auffindbar zu machen, kann ich den folgenden Befehl ausführen. Beachten Sie, dass die IP 10.78.38.1 die IP der lxdbr0- Brücke ist.

$ sudo systemd-resolve --interface lxdbr0 --set-dns 10.78.38.1 --set-domain lxd

Mit dieser Option kann ich den LXD-Container anhand seines Namens erkennen und die Konfiguration sieht wie folgt aus.

$ systemd-resolve --status
.
.
.
Link 10 (lxdbr0)
      Current Scopes: DNS
       LLMNR setting: yes
MulticastDNS setting: no
      DNSSEC setting: no
    DNSSEC supported: no
         DNS Servers: 10.78.38.1
          DNS Domain: lxd
.
.
.

Nach einem Systemneustart ist diese Konfiguration jedoch nicht mehr vorhanden.

$ systemd-resolve --status
.
.
.
Link 10 (lxdbr0)
      Current Scopes: none
       LLMNR setting: yes
MulticastDNS setting: no
      DNSSEC setting: no
    DNSSEC supported: no
.
.
.

Um dies dauerhaft zu gewährleisten, habe ich die systemd-resolve- Manpage http://manpages.ubuntu.com/manpages/bionic/man8/systemd-resolved.service.8.html überprüft . Es wird vorgeschlagen, eine Datei /etc/systemd/resolved.conf.d/lxd.conf zu erstellen, es sind jedoch keine Parameter verfügbar, mit denen ich eine solche Konfiguration spezifisch für eine bestimmte Netzwerkkarte vornehmen könnte.

quat
quelle

Antworten:

2

Das klingt plausibel, scheint aber keine Wirkung zu haben:

Gemäß der verlinkten Manpage man 8 systemd-resolved.service müssen Sie die Konfigurationsdatei pro Link verwenden in /etc/systemd/network:

Die kontaktierten DNS-Server werden aus den globalen Einstellungen in /etc/systemd/resolved.conf, den statischen Einstellungen pro Link in /etc/systemd/network/*.networkDateien, den über DHCP empfangenen dynamischen Einstellungen pro Link und den von anderen Systemdiensten bereitgestellten DNS-Serverinformationen bestimmt.

Um Ihre Konfiguration dauerhaft zu machen, müssen Sie die Datei erstellen /etc/systemd/network/lxdbr0.conf:

[Match]
Name=lxdbr0

[Resolve]
DNS=10.78.38.1
Domains=lxd
ctx
quelle
Das klingt plausibel, aber diese Einstellung scheint keine Auswirkungen auf mein System mit LXD zu haben. Nachdem ich die erste Frage gestellt hatte, hatte ich einen Systemd-Dienst erstellt, der den oben genannten Befehl ausführt, um DNS für LXD zu konfigurieren, das beim Booten ausgeführt wird. Das funktioniert auch nicht zuverlässig, da die lxdbr0-Schnittstelle manchmal zu diesem Zeitpunkt noch nicht existiert. Ich muss daher den benutzerdefinierten Systemd-Dienst manuell starten. Ich denke, dies könnte auch der Grund dafür sein, dass Ihre Lösung nicht mit LXD funktioniert, obwohl es der richtige Weg zu sein scheint ...
Quat 12.10.18
Du hast recht. Aber irgendwie gelang es mir, die gewünschte Ausgabe zu erhalten, systemd-resolve --statusohne diesen Befehl einzugeben. Das andere Problem ist, dass die Namensauflösung in Containern nicht funktioniert. Ich werde meine Antwort korrigieren, wenn ich eine bessere Lösung finde.
CTX
1

Mir ist klar, dass diese Frage seit 2 Monaten hier ist, aber vielleicht brauchen Sie noch einige Antworten?

1) Systemd-networkd speichert Netzwerkkonfigurationen in (mindestens) 3 Verzeichnissen, möglicherweise mehr. Das, was Ihnen am relevantesten erscheint, ist:

/etc/systemd/network/ 

(es überschreibt die anderen 2, nämlich / lib / s / n und / run / s / n.

Erstellen Sie eine Textdatei ähnlich der folgenden:

[Match]
Name=enp0s4

[Network]
DHCP=yes
DNS=192.168.1.1

Sie können es nennen , was Sie wollen , dass es scheint, solange es in diesem Verzeichnis ist, mein enp0s4.network genannt wird, immer der Inhalt richtig ist entscheidend , wenn Sie es falsch, schlechte Dinge passieren, wie Ihr Netzwerk nicht mehr funktioniert, zumindest auf dieser Schnittstelle, bis Sie eine funktionierende Konfiguration wiederherstellen. Was nicht einfach ist, ich habe meine durcheinander gebracht und es dauerte ungefähr eine Stunde, um es zu klären. Gut, dass mein "Server" im Nebenzimmer ist, nicht in einem entfernten Rechenzentrum!

Beispiele zum Einrichten einer Brücke finden Sie hier:

man systemd.network |grep -A 42 "Example 3"

Die dort angegebenen Beispiele und mein Code-Snippet können Folgendes einrichten:

Current Scopes: DNS
       LLMNR setting: yes
MulticastDNS setting: no
      DNSSEC setting: no
    DNSSEC supported: no
         DNS Servers: 10.78.38.1

Sie sind sich nicht sicher, wie die Syntax für die DNS-Domain lautet. Möglicherweise umfasst die Manpage 30 Seiten. Wenn Sie es können, überspringen Sie es und versuchen Sie "Domain =", mein System zu zerstören, so weiß ich, dass es eine schlechte, persönliche Erfahrung ist, wenn ich es falsch mache. :-) Finden Sie also die richtige Syntax oder geben Sie sie nur ein, wenn Sie sie wiederherstellen können.

Erholung ist ein weiterer Beitrag, obwohl ich müde bin.

Hier sind die Referenzen, die ich verwendet habe:

So überprüfen Sie, ob das Netzwerk ausgeführt wird: https://superuser.com/questions/1187633/how-to-debug-systemd-networkd?rq=1#comment1807294_1187633

So aktivieren Sie, wenn es deaktiviert ist: https://askubuntu.com/posts/681768/revisions

Starten Sie systemd-resolver neu, ohne neu zu starten:

sudo systemctl restart systemd-resolved

Zu Ihrer Information: Es gibt eine Möglichkeit, systemd anzuweisen, Network-Manager die Verwaltung einer Schnittstelle zu überlassen sowie diese "nicht verwaltet" zu lassen und mit Flatfile-Konfigurationen wie /etc/resolv.conf auszuführen. Aber ich würde es so machen, als wäre ich in deinen Schuhen. Ich versuche nur, verschiedene Schnittstellen für einen anderen Zweck zu konfigurieren, aber ich brauchte all diese Informationen. oben, um mir selbst zu helfen, so dachte ich, ich würde teilen. Da du mitgeteilt hast, wie man es vorübergehend ändert, ist das auch nützlich. :-)

HTH

Lubo Diakov
quelle
0

Diese Frage hat immer noch keine akzeptierte Antwort und da ich auch enorme Probleme beim Auflösen von Containernamen auf dem Host hatte, dachte ich, ich sollte meine Lösung anbieten. Ich mache das auch, da diese Seite das erste Google-Ergebnis ist, wenn ich beständige Änderungen an sytemd-resolved.service nachschlage. Zuletzt möchte ich erwähnen, dass dieses Problem spezifisch zu sein scheint Ubuntu >= 18.04und seine Version von systemd-resolved.service.

Die Hilfeseite systemd-resolved.service wurde bereits erwähnt. Im Falle von LXD wurden jedoch irreführende Schlussfolgerungen gezogen. Die LXD-Schnittstelle muss nicht in definiert werden /etc/systemd/network/<iface>.{conf|network}. Die Schnittstelle funktioniert bereits und muss daher nicht für den Netzwerkmanager von systemd definiert werden. Standardmäßig hat LXD bereits einen funktionierenden DNS-Server, der die erste Hostadresse seines Netzwerks überwacht. Alles, was wir tun müssen, ist, systemd-resolved.servicediesen Server zu erkennen.

Die oben verlinkte Manpage erwähnt dies für /etc/systemd/resolved.conf:

Die Standardkonfiguration wird während der Kompilierung definiert, sodass eine Konfigurationsdatei nur benötigt wird, wenn von diesen Standardeinstellungen abgewichen werden muss. Standardmäßig enthält die Konfigurationsdatei in / etc / systemd / auskommentierte Einträge, die die Standardeinstellungen als Leitfaden für den Administrator enthalten. Diese Datei kann bearbeitet werden, um lokale Überschreibungen zu erstellen.

Ich möchte hervorheben, dass diese Datei bearbeitet werden kann, um lokale Überschreibungen zu erstellen . @quat tatsächlich verweisen Sie auch in Ihrer eigentlichen Frage darauf:

Um dies dauerhaft zu gewährleisten, habe ich die systemd-resolve-Manpage http://manpages.ubuntu.com/manpages/bionic/man8/systemd-resolved.service.8.html überprüft . Es wird vorgeschlagen, eine /etc/systemd/resolved.conf.d/lxd.confDatei zu erstellen , es sind jedoch keine Parameter verfügbar, die es mir ermöglichen würden, eine solche Konfiguration spezifisch für eine bestimmte Netzwerkkarte vorzunehmen.

1. Hinzufügen des dnsmasq-Dienstes von lxd zu den globalen dns-Einstellungen von systemd-resolved.service:
Ich verstehe Ihren letzten Satz jedoch nicht. Sie müssen die Netzwerkkarte nicht angeben. Sie müssen lediglich die LXD-DNS-Serveradresse angeben. Wenn Sie Ihre Netzwerkinformationen verwenden, /etc/systemd/resolved.confsieht eine funktionierende Konfiguration folgendermaßen aus (Kommentar zum Ändern der Standardeinstellungen):

[Resolve]
DNS=10.78.38.1
#OBFallbackDNS=
Domains=LXD
#LLMNR=no
#MulticastDNS=no
#DNSSEC=no
#Cache=yes
#DNSStubListener=yes

Nach dem Speichern der Datei starten Sie entweder Ihren Server neu oder systemctl restart systemd-resolved.servicebei mir funktionierte dies bei einer neuen Ubuntu-18.04.02-Installation einwandfrei. Wenn es bei Ihnen nicht funktioniert, haben Sie vermutlich entweder eine nicht standardmäßige lxd-Installation durchgeführt, oder Sie haben Probleme / Konflikte aufgrund Ihres Betriebssystem-Upgrades.

2. UPDATE (NIC-spezifisches Setup):
Laut Simos 'Blog besteht die einzige Möglichkeit, weiterhin $ sudo systemd-resolve --interface lxdbr0 --set-dns 10.78.38.1 --set-domain lxd einen benutzerdefinierten systemd-Dienst zu erstellen, der die NIC-spezifische Konfiguration beim Systemstart initialisiert. Dieser Weg ist derzeit der "akzeptierte" Ansatz auf "semi-offiziellen" linuxcontainers.org

Im Blog erwähntes Beispiel:
Shell-Skript, das nic-spezifische DNS über systemd-resolve (lxdhostdns_start.sh) aktiviert

$ cat /usr/local/bin/lxdhostdns_start.sh 
#!/bin/sh

LXDINTERFACE=lxdbr0
LXDDOMAIN=lxd
LXDDNSIP=`ip addr show lxdbr0 | grep -Po 'inet \K[\d.]+'`

/usr/bin/systemd-resolve --interface ${LXDINTERFACE} \
                         --set-dns ${LXDDNSIP} \
                         --set-domain ${LXDDOMAIN}

Shell-Skript, das nic-spezifische DNS über systemd-resolve deaktiviert (lxdhostdns_stop.sh)

$ cat /usr/local/bin/lxdhostdns_stop.sh 
#!/bin/sh

LXDINTERFACE=lxdbr0

/usr/bin/systemd-resolve --interface ${LXDINTERFACE} --revert

Erstellen eines systemd-Dienstes zum Verwalten der beiden Skripte und zum Initialisieren dieser beim Systemstart:

$ sudo cat /lib/systemd/system/lxd-host-dns.service 
[Unit]
Description=LXD host DNS service
After=multi-user.target

[Service]
Type=simple
ExecStart=/usr/local/bin/lxdhostdns_start.sh
RemainAfterExit=true
ExecStop=/usr/local/bin/lxdhostdns_stop.sh
StandardOutput=journal

[Install]
WantedBy=multi-user.target

Führen Sie systemctl enable lxd-host-dns.servicezum Schluss den Host aus und starten Sie ihn neu, um zu überprüfen, ob die Änderungen dauerhaft sind systemd-resolve --status. Die lxbr0Schnittstelle sollte sich jetzt im DNS-Bereich ( Current Scopes: DNS) befinden. In Anbetracht Ihres Netzwerks sollte es so aussehen:

Link 3 (lxdbr0)
      Current Scopes: DNS
       LLMNR setting: yes
MulticastDNS setting: no
      DNSSEC setting: no
    DNSSEC supported: no
         DNS Servers: 10.78.38.1
          DNS Domain: lxd

Mir ist klar, dass dies nicht die ideale Lösung ist, und technisch gibt es immer noch keine Antwort auf Ihre Frage, wie Sie diese Konfiguration in systemd-resolve beibehalten können. Das Problem bei der Beibehaltung liegt jedoch in der Tatsache, dass die lxbr0-Schnittstelle nicht von netplan, sondern von systemd unter Ubuntu18.04 verwaltet wird. Da netplan nichts über die Schnittstelle weiß, können Sie die oben genannten *.networkSchnittstellenkonfigurationen nicht verwenden, um DNS- und Domäneneinstellungen hinzuzufügen lxbr0.

Diese Antwort ist jetzt eine lange, lange Textwand, aber ich hoffe, sie klärt das Problem ein wenig. Beide Lösungen lösen Containernamen auf einem Ubuntu-Host auf. Der zweite ist genauer, aber wenn die einzige Anforderung die Namensauflösung auf dem Host ist, /etc/systemd/resolved.confist es eine praktikable Alternative, den dnsmasq-Dienst von lxd über global verfügbar zu machen, zumal nur zwei Änderungen in einer Konfigurationsdatei erforderlich sind.

tobi
quelle
Danke für deinen Vorschlag. Leider trifft dies nicht ganz den Nagel auf den Kopf. Mit der vorgeschlagenen Einstellung sind die DNS-Einstellungen global und nicht NIC-spezifisch. Wenn Sie systemd-resolve --statusmit Ihren Einstellungen ausgeführt werden, werden Sie feststellen, dass im Link 10 (lxdbr0)Abschnitt nicht die DNS-Konfiguration, sondern die globale Konfiguration vorhanden ist. Ab jetzt glaube ich , dass @ctx Antwort der nächste Anruf ist superuser.com/a/1365864/433376 aber möglicherweise ein Fehler ist der Grund dafür , nicht zu arbeiten. Gerade habe ich das mit Ubuntu 19.04 getestet.
Quat
Ja das ist richtig. Die Frage ist, was wollten Sie erreichen? Wenn ich Sie richtig verstanden habe, wollten Sie, dass Containernamen auf dem Host aufgelöst werden, und mein Vorschlag ist, dies zu tun. Ich meine, warum muss es in deinem Fall nett sein? Oh, und in Bezug auf CTX. Ich denke, es funktioniert nicht mit .conf im Netzwerkmanager, da nirgendwo im Netzwerkmanager für lxcbr0 .network definiert ist. Zumindest konnte ich keinen auf meinem System finden.
tobi
Der Umfang dieser Frage besteht darin, die Einstellungen beizubehalten, die mit dem Befehl 'systemd-resolve' vorgenommen werden können (siehe Frage für den vollständigen Befehl). YMMV, aber es gibt Anwendungsfälle, in denen NIC-spezifische DNS-Einstellungen erforderlich sind. In Bezug auf den Netzwerkmanager haben Sie möglicherweise recht. Meiner Meinung nach könnte dieses Problem auf eine Verwechslung zwischen der DNS-Auflösung des alten Stils und der neuen Methode zur Systemauflösung zurückzuführen sein.
6.
OK du hast recht. Mein Fokus lag darauf, eine Problemumgehung zu finden, indem ich den lxd dnsmasq-Server in den globalen Bereich hebe. Ich bezweifle ehrlich, dass es eine Möglichkeit gibt, den Befehl systemd-resolve beizubehalten. Grundsätzlich, weil lxd nicht netplan verwendet, sondern systemd, um das Netzwerk beim Start zu konfigurieren. Im Gegenzug benötigen Sie auch systemd, um die Änderungen beizubehalten. Auf linuxcontainers.org findet meine Behauptung etwas [backup] ( discussion.linuxcontainers.org/t/… ). Ich werde meine Antwort mit diesen Informationen aktualisieren.
Tobi