[[Vorlage(fortgeschritten)]] [[Vorlage(Getestet, focal, bionic,)]] {{{#!vorlage Wissen [:Programme_starten: Programme starten] [:Terminal: ein Terminal öffnen] [:mit Root-Rechten arbeiten:] }}} [[Inhaltsverzeichnis()]] [#Links systemd-resolved] ist in der [:systemd:]-Familie zuständig für die Auflösung von Rechnernamen zu IP-Adressen über mehrere Verfahren: * Bereitstellung eines lokalen DNS-Cache: Dies ist ein eigenständiger DNS-Server, der jedoch selbst keine Namenszuordnungen bereit stellt, sondern nur die von anderen DNS-Servern (Forwarder) im Netz erhaltenen DNS-Antworten speichert und damit für den Anwender das Zeitverhalten bei DNS-Abfragen verbessert. * Auflösung von Rechnernamen zu IP-Adressen per Unicast-DNS, LLMNR und MulticastDNS * Veröffentlichung von Rechnernamen im lokalen Netz per LLMNR und MulticastDNS [#Links LLMNR] das von Microsoft favorisierte Protokoll zur Namensauflösung per Multicast-UDP. Es benutzt Port 5355 und funktioniert nach ähnlichen Grundlagen wie [:Avahi:Bonjour/Avahi], ist aber dazu nicht kompatibel. [#Links 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 [#Dienstprogramm-resolvectl resolvectl] bzw. früher (Ubuntu 18.04 mit systemd-Version 237) [#Dienstprogramm-systemd-resolve 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. {{{#!vorlage Warnung 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 [:DNS-Server_Bind: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: {{{#!vorlage Befehl 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: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 Dienstprogramm resolvectl] bzw. [#Dienstprogramm-systemd-resolve 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 [#Links 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: {{{#!vorlage Befehl sudo ln -s /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf }}} Über die funktionalen Unterschiede lese nach in der Dokumentation: {{{#!vorlage Befehl 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: [[Vorlage(Befehl, "sudo mkdir -p /etc/systemd/resolved.conf.d/")]] 1. Vorlage kopieren: [[Vorlage(Befehl, "sudo cp /etc/systemd/resolved.conf /etc/systemd/resolved.conf.d/TEST.conf")]] 1. Die Datei '''/etc/systemd/resolved.conf.d/TEST.conf''' abändern zu: [[Vorlage(Code, """ # 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.) 1. Die Änderungen durch Neustart von systemd-resolved übernehmen: [[Vorlage(Befehl, "systemctl restart systemd-resolved.service")]] 1. 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: {{{#!vorlage Befehl 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: [[Vorlage(Befehl, "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. [[Vorlage(Befehl, "resolvectl dns radio 2001:0db8::53 192.0.2.53")]] * DNS-Abfrage direkt über den DNS-Cache: [[Vorlage(Befehl, "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: {{{#!vorlage Befehl 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: {{{#!vorlage Befehl 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 Methode A].) 1. 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 Methode B].) 1. 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. [#Installation Wurden die Hinweise für die Installation beachtet?] 1. Wurden alle möglicherweise konkurrierenden Programme wie z.B. NetworkManager, Wicd, ConnMan] {en}, [:interfaces:ifupdown] deaktiviert? 1. Läuft der DNS-Cache überhaupt? Test: [[Vorlage(Befehl, "systemctl status systemd-resolved.service")]] 1. Laufen vielleicht mehrere DNS-Cache, die sich gegenseitig stören? Test:[[Vorlage(Befehl, "sudo ss -pan 'sport = 53'")]] 1. [#Dienstprogramm-resolvectl Wie ist der DNS-Cache konfiguriert?] 1. Sind die richtigen DNS-Server eingetragen und sind diese erreichbar? 1. Wurde der DNS-Cache nach [#Methode-A Methode A] oder [#Methode-B B], aber nicht nach beiden in das System eingebunden? = Links = * [https://www.freedesktop.org/software/systemd/man/systemd-resolved.html Offizielle Dokumentation von systemd-resolved bei freedesktop.ord] {en} * [https://de.wikipedia.org/wiki/Link-local_Multicast_Name_Resolution LLMNR bei Wikipedia] {de} * [https://tools.ietf.org/html/rfc4795 RFC 4795 zu LLMNR] {en} * [https://tools.ietf.org/html/rfc6762 RFC 6762 zu MulticastDNS (mDNS)] {en} * [https://www.freedesktop.org/software/systemd/man/org.freedesktop.resolve1.html API Dokumentation] {en} * [https://www.gnu.org/software/libc/ GNU C Library (glibc)] {en} # tag: System, Desktop, systemd, Netzwerk