ubuntuusers.de

systemd-resolved

Artikel für fortgeschrittene Anwender

Dieser Artikel erfordert mehr Erfahrung im Umgang mit Linux und ist daher nur für fortgeschrittene Benutzer gedacht.

Dieser Artikel wurde für die folgenden Ubuntu-Versionen getestet:


Du möchtest den Artikel für eine weitere Ubuntu-Version testen? Mitarbeit im Wiki ist immer willkommen! Dazu sind die Hinweise zum Testen von Artikeln zu beachten.

Zum Verständnis dieses Artikels sind folgende Seiten hilfreich:

systemd-resolved ist in der systemd-Familie zuständig für die Auflösung von Rechnernamen zu IP-Adressen über mehrere Verfahren:

LLMNR das von Microsoft favorisierte Protokoll zur Namensauflösung per Multicast-UDP. Es benutzt Port 5355 und funktioniert nach ähnlichen Grundlagen wie Bonjour/Avahi, ist aber dazu nicht kompatibel.

MulticastDNS (mDNS) ist da von Apple und in der Linux-Welt favorisierte Protokoll zur Namensauflösung per Multicast-UDP. Es benutzt Port 5353 und wird auch von Bonjour/Avahi verwendet.

Zu systemd-resolved gehört bei Ubuntu 20.04 (mit systemd-Version 245) das Dienstprogramm resolvectl bzw. früher (Ubuntu 18.04 mit systemd-Version 237) systemd-resolve (Ohne „d“ am Ende!). Damit kann man den lokalen DNS-Cache temporär konfigurieren und verwalten sowie Namensabfragen durchführen.

Installation

systemd-resolved ist auf allen aktuellen Ubuntu-Installationen als fester Bestandteil von systemd bereits vorinstalliert.

Achtung!

Bei Ubuntu-Systemen mit aktivem NetworkManager kümmert sich dieser um die Einrichtung der DNS-Namensauflöung und des mit systemd-resolved realisierten DNS-Cache. Wer selber an diesen Komponenten konfigurieren möchte, muss die entsprechende Funktionalität im NetworkManager ausschalten oder diesen deaktivieren oder deinstallieren oder den Verlust der DNS-Namensauflösung riskieren!

Konfliktpotential besteht auch, wenn mehrere DNS-Cache gleichzeitig aktiv sind. DNS-Cache implementieren auch z.B. die Programme Dnsmasq und bind.

Konfiguration

Eigene Einstellungen

systemd-resolved bezieht seine Konfigurationsdaten aus verschiedenen Quellen:

Die Hauptkonfigurationsdatei /etc/systemd/resolved.conf dokumentiert primär die bei der Übersetzung des Programms definierte Voreinstellung. Man darf diese Datei abändern; dabei sollte man die Kommentare für die Voreinstellungen erhalten, weil man sonst keine Dokumentation über die Voreinstellung mehr hat. Alternativ kann man die hier folgend beschriebenen weiteren Konfigurationsdateien verwenden.

Nach der Hauptkonfigurationsdatei werden noch alle auf .conf endenden Dateien in diesen Verzeichnissen (sofern existierend) berücksichtigt:

  • /usr/lib/systemd/resolved.conf.d/ (vorgesehen für Distributionen)

  • /usr/local/lib/systemd/resolved.conf.d/ (vorgesehen für Distributionen)

  • /etc/systemd/resolved.conf.d/ (vorgesehen für den Verwalter des Rechners)

  • /run/systemd/resolved.conf.d/ (/run/ wird beim Hochlauf neu angelegt)

Dateien in später genannten Verzeichnissen maskieren gleichnamige Dateien in früher genannten Verzeichnissen und die Dateien werden in lexikographischer Reihenfolge bearbeitet.

Eine gute Praxis besteht im Kopieren der Datei /etc/systemd/resolved.conf in das Verzeichnis /etc/systemd/resolved.conf.d/ (welches man möglicherweise erst anlegen muss) und Bearbeitung der Kopie. Die Einstellmöglichkeiten sind in der Datei aufgelistet und werden ausführlich in der Manpage erklärt:

man resolved.conf 

Weitere von systemd-resolved benutzte Quellen zur Konfiguration der als Forwarder befragten DNS-Server:

  • Konfigurationsdatei mit Endung auf .network, die einer Netzwerkschnittstelle von systemd-networkd zugeordnet wurde

  • Mitteilungen via D-Bus vom DHCP-Client, vom Dienstprogramm-resolvectl oder anderen Programmen

  • Datei /etc/resolv.conf, sofern diese eine reguläre Datei und kein Symlink ist

Die vorstehenden Ausführungen betreffen die eigene Konfiguration für den DNS-Cache. Mit Dienstprogramm resolvectl bzw. systemd-resolve kann dessen Funktion manuell überprüft werden.

Einbindung in das System

Für die automatische Verwendung des DNS-Cache muss dieser noch in das System durch Konfiguration des DNS-Resolvers der glibc eingebunden werden. Dafür gibt es zwei einander gegenseitig ausschließende Möglichkeiten:

Methode A

Der DNS-Resolver der glibc soll als Nameserver ausschließlich den lokalen DNS-Cache über das Netzwerk befragen: Hierzu muss die reguläre Datei /etc/resolv.conf ersetzt werden durch einen symbolischen Link auf eines dieser drei Ziele:

  • /run/systemd/resolve/stub-resolv.conf

  • /usr/lib/systemd/resolv.conf

  • /run/systemd/resolve/resolv.conf

Die bevorzugte Variante ist:

sudo ln -s /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf 

Über die funktionalen Unterschiede lese nach in der Dokumentation:

man systemd-resolved 

Man verwende nicht gleichzeitig Methode A und Methode B!

Methode B

Der DNS-Resolver der glibc soll selbst über das Netzwerk gar keinen Nameserver befragen, sondern als Methode den lokalen DNS-Cache benutzen: Hierzu muss in der Datei /etc/nsswitch.conf in der Zeile hosts das Modul dns (d.h.: „beachte /etc/resolv.conf“) ersetzt werden durch das von systemd-resolved bereit gestellte Modul nss-resolve:

# deaktiviert 2021-02-01 kB: hosts:          files mdns4_minimal [NOTFOUND=return] dns
hosts:          files mdns4_minimal [NOTFOUND=return] nss-resolve

Bei dieser Methode kann man die Datei /etc/resolv.conf zur Definition der Forwarder verwenden oder diese Datei völlig leer lassen und wie oben beschrieben konfigurieren.

Man verwende nicht gleichzeitig Methode B und Methode A!

Beispiel

Um DNS-Server global zu vereinbaren, kann man so vorgehen:

  1. Verzeichnis anlegen:

    sudo mkdir -p /etc/systemd/resolved.conf.d/ 
  2. Vorlage kopieren:

    sudo cp /etc/systemd/resolved.conf /etc/systemd/resolved.conf.d/TEST.conf 
  3. Die Datei /etc/systemd/resolved.conf.d/TEST.conf abändern zu:

    , 
    # See resolved.conf(5) for details
    
    [Resolve]
    #DNS=
    DNS = 2001:0db8::53 192.0.2.53
    #FallbackDNS=
    #Domains=
    #LLMNR=no
    #MulticastDNS=no
    #DNSSEC=no
    #DNSOverTLS=no
    #Cache=no-negative
    #DNSStubListener=yes
    #ReadEtcHosts=yes,  

    (Die Kommentare darf man natürlich auch entfernen.)

  4. Die Änderungen durch Neustart von systemd-resolved übernehmen:

    systemctl restart systemd-resolved.service 
  5. Einbindung in das System nach Methode A oder B durchführen.

Benutzung

Start und Stopp

systemd-resolved läuft bei Ubuntu Desktops als systemd-Unit und kann bei Bedarf über systemctl verwaltet werden:

systemctl start systemd-resolved.service
systemctl enable systemd-resolved.service
systemctl status systemd-resolved.service
systemctl stop systemd-resolved.service
systemctl disable systemd-resolved.service  

Dienstprogramm resolvectl

Dieses Programm ist erst seit Ubuntu 20.04 mit systemd-Version 245 verfügbar. Frühere Ubuntu-Versionen kennen die Funktionalität dieses Programms unter dem Namen systemd-resolve, welches allerdings eine etwas andere Bedienung erfordert. Ab Ubuntu 20.04 ist systemd-resolve ein symbolischer Link auf resolvectl. Beachte: Abhängig von dem beim Aufruf verwendeten Namen ändert sich die Bedienung!

  • Abfrage von Konfiguration und Status:

    resolvectl 
  • DNS-Server als Forwarder setzen: Man kann mit folgendem Befehl spezifisch für eine Schnittstelle (hier beispielhaft: radio) die DNS-Server festlegen. Globale Einstellungen sind nur über Konfigurationsdateien möglich.

    resolvectl dns radio 2001:0db8::53 192.0.2.53 
  • DNS-Abfrage direkt über den DNS-Cache:

    resolvectl query ubuntuusers.de 


    ubuntuusers.de: 2001:780:0:25:dead:beef:cafe:1 -- link: radio
                    213.95.41.4                    -- link: radio
    
    -- Information acquired via protocol DNS in 2.5ms.
    -- Data is authenticated: no

Für weitere Möglichkeiten siehe Dokumentation:

man resolvectl 

Dienstprogramm systemd-resolve

Die unter Dienstprogramm resolvectl besprochenen Aufgaben lassen sich auch mit systemd-resolve erledigen, wenn man die o.g. Befehle durch diese ersetzt:

systemd-resolve --status
systemd-resolve --interface radio --set-dns=2001:0db8::53 --set-dns=192.0.2.53
systemd-resolve ubuntuusers.de
systemd-resolve --help 

Umwandlung Rechnernamen ←→ IP-Adressen

systemd-resolved bietet drei verschiedene Schnittstellen für Abfragen:

  1. Der DNS-Cache kann vom lokalen Rechner aus über das Netzwerk als DNS-Server unter der IPv4-Adresse 127.0.0.53 erreicht und befragt werden. Hierzu ist genau diese Adresse und keine weitere in der Datei /etc/resolv.conf als Nameserver zu hinterlegen. Dies ist bei Ubuntu die als Standard von NetworkManager für Abfragen verwendete Methode. (Siehe Methode A.)

  2. Herkömmliche Programm wie host, dig und alle anderen, welche den DNS-Resolver aus der Bibliothek glibc benutzen (Funktionen wie z.B. getaddrinfo(), getnameinfo() und (veraltet) gethostbyname), benutzen transparent den DNS-Cache von systemd-resolved, wenn die Konfigurationsdateien des Resolvers /etc/resolv.conf und /etc/nsswitch.conf richtig eingestellt wurden. Hierzu darf in der Datei /etc/resolv.conf die Adresse 127.0.0.53 nicht als Nameserver stehen und in der Datei /etc/nsswitch.conf muss das von systemd-resolved bereitgestellte Modul nss-resolve verwendet werden. (Siehe Methode B.)

  3. Programme können per D-Bus mit systemd-resolved kommunizieren und darüber konfigurieren wie auch Abfragen tätigen. Das Dienstprogramm resolvectl benutzt generell diesen Weg; NetworkManager benutzt ihn zur Konfiguration.

Problembehebung

Namensauflösung funktioniert nicht

Zur Diagnose kann man diese Checkliste abarbeiten:

  1. Wurden die Hinweise für die Installation beachtet?

  2. Wurden alle möglicherweise konkurrierenden Programme wie z.B. NetworkManager, Wicd, ConnMan] 🇬🇧, ifupdown deaktiviert?

  3. Läuft der DNS-Cache überhaupt? Test:

    systemctl status systemd-resolved.service 
  4. Laufen vielleicht mehrere DNS-Cache, die sich gegenseitig stören? Test:

    sudo ss -pan 'sport = 53' 
  5. Wie ist der DNS-Cache konfiguriert?

  6. Sind die richtigen DNS-Server eingetragen und sind diese erreichbar?

  7. Wurde der DNS-Cache nach Methode A oder B, aber nicht nach beiden in das System eingebunden?

Diese Revision wurde am 3. September 2022 17:44 von DJKUhpisse erstellt.
Die folgenden Schlagworte wurden dem Artikel zugewiesen: Desktop, Netzwerk, systemd, System