Zum Inhalt springen

Systemd/Networkd/Konfiguration

Aus Foxwiki

Konfiguration

Programm-Einstellungen

Die Hauptkonfigurationsdatei /etc/systemd/networkd.conf dokumentiert primär die bei der Übersetzung des Programms definierte Voreinstellung

  • Man darf diese Datei abändern; dabei sollte man die Kommentare füt 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/networkd.conf.d/
  • /usr/local/lib/systemd/networkd.conf.d/
  • /etc/systemd/networkd.conf.d/

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/networkd.conf in das Verzeichnis /etc/systemd/networkd.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 networkd.conf

Schnittstellen-Einstellungen

Für die Konfiguration von Netzwerkschnittstellen werden Dateien in folgenden Verzeichnissen berücksichtigt

  • /usr/lib/systemd/network/
  • /usr/local/lib/systemd/network/
  • /run/systemd/network/
  • /etc/systemd/network/

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

In den genannten Verzeichnissen finden sich drei anhand ihrer Endung zu unterscheidenden Arten von Konfigurationsdateien

  • .netdev zum erstellen virtueller Netzwerk-Schnittstellen
  • .link konfigurieren Schnittstellen auf Layer 2
  • Dies wird tatsächlich von udev erledigt
  • .network konfigurieren Schnittstellen auf Layer 3

Alle Dateien obliegen der Syntax in Konfigurationsdateien von systemd

man systemd.syntax

Bei den Schlüsselworten für die Abschnittsnamen und die Einstellungsoptionen sind große und kleine Buchstaben bedeutsam

  • Die möglichen Optionen und deren richtige Schreibweise können den Manpages entnommen werden
man systemd.netdev
man systemd.link
man systemd.network

Beachte: In den Manpages werden Abschnittsnamen in Versalien geschrieben, wenn sie als Überschrift verwendet werden

  • In den Konfigurationsdateien ist aber durchweg der Abschnittsname in vorgeschriebener Verwendung von Groß-/Kleinbuchstaben zu schreiben

Die nachfolgenden Tabellen listen auszugsweise die Schlüsselworte, soweit sie für das Verständnis der Beispiele in diesem Artikel erforderlich sind. Kursiv dargestellte Schlüsselworte sind Pflichtangaben

Optionen für .netdev-Dateien
Schlüsselwort Beschreibung
[Match] Abschnitt optional
Host Hostname oder Maschinen-Kennung (engl: machine-id) des Rechners
  • Effektiv wird die Zeichenfolge mit /etc/hostname und /etc/machine-id verglichen
  • Die machine-id kann aber auch beim Hochlauf temporär als Kernel Parameter gesetzt werden
Virtualization Prüft ob und ggf
  • wie das System virtualisiert ist
  • Mögliche Werte: no, yes, vm, container, qemu, kvm, zvm, vmware, microsoft, oracle, xen, bochs, uml, openvz, lxc, lxc-libvirt, systemd-nspawn, docker, rkt und ggf
  • weitere
  • Effektiv wird gegen die Ausgabe von systemd-detect-virt verglichen
KernelCommandLine Option auf der Kernel-Kommandozeile
  • Vergleicht effektiv, ob /proc/cmdline die Angabe enthält
KernelVersion Kernel Version
  • Vergleicht effektiv mit uname -r, dabei sind auch Vergleiche auf größer-/kleiner-als und weitere möglich
Architecture Prüfe auf bestimmte Architektur
  • Beispiele: x86, x86-64, ppc, ppc-le, ppc64, ppc64-le, ia64, parisc, parisc64, s390, s390x, sparc, sparc64, mips, mips-le, mips64, mips64-le, alpha, arm, arm-be, arm64, arm64-be, sh, sh64, m86k, tilegx, cris
  • Vergleicht effektiv mit uname -m
[NetDev] Abschnitt obligatorisch
Name Name der Schnittstelle
  • Pflichtangabe
  • Maximal 15 dieser zulässigen Zeichen: a-z, A-Z, 0-9 und Sonderzeichen: _ = + . -
Kind Typ der Schnittstelle
  • Pflichtangabe
  • Beispiele: dummy, bridge, tun, wireguard und viele weitere, siehe Manpage
Optionen für .link-Dateien
Schlüsselwort Beschreibung
[Match] Abschnitt optional, aber Verwendung dringend empfohlen
Beachte Die unter .netdev angegebenen Prüfungen sind auch hier möglich
Path Eine mit Leerzeichen getrennte Liste mit Werten für die udev-Eigenschaft ID_PATH
  • Es wird geprüft, ob der tatsächliche Wert einem dar angegebenen Werten entspricht
Driver Eine mit Leerzeichen getrennte Liste mit Werten für die udev-Eigenschaft ID_NET_DRIVER
  • Es wird geprüft, ob der tatsächliche Wert einem dar angegebenen Werten entspricht
Type Eine mit Leerzeichen getrennte Liste mit Werten für den von networkctl angezeigten Schnittstellentyp. (Achtung: Bei Version 237 sind nur die Werte der udev-Eigenschaft DEVTYPE zulässig!) Es wird geprüft, ob der tatsächliche Wert einem dar angegebenen Werten entspricht
Property Eine mit Leerzeichen getrennte Liste mit udev-Eigenschaft=Wert Angaben
  • Es wird geprüft, ob für jede angegebene Eigenschaft tatsächlich der Wert dem hier angegebenen entspricht
MacAddress Eine mit Leerzeichen getrennte Liste mit MAC-Adressen
  • Diese Option darf mehrfach angegeben werden; die Listen werden vereinigt
  • Es wird geprüft, ob die momentan eingestellte Unicast-MAC-Adresse in der Gesamtliste vorkommt
PermanentMACAddress Eine mit Leerzeichen getrennte Liste mit permanenten EUI-48
  • Diese Option darf mehrfach angegeben werden; die Listen werden vereinigt
  • Es wird geprüft, ob der Identifizierer der Hardware in der Gesamtliste vorkommt
[Link] Abschnitt obligatorisch
NamePolicy Eine Liste mit Bezeichnern für die zur Benennung dieser Schnittstelle auszuprobierenden Methoden
  • Bekannte Methoden: kernel, database, onboard, slot, path, mac, keep
Name Ein Name für die Schnittstelle
  • Dieser wird verwendet, wenn keine der angegebenen Methoden zu Benennung erfolgreich war
  • Maximal 15 dieser zulässigen Zeichen: a-z, A-Z, 0-9, und Sonderzeichen: _ = + . -
MACAddress Eine Unicast-MAC-Adresse, welche der Hardware zugewiesen wird
MTUBytes Die maximale Paketlänge in Bytes wird für Netzwerkebene 2 auf den hier abgegebenen Wert gesetzt Die üblichen Suffixe wie K, M, G dürfen verwendet werden und; sie werden zur Basis 1024 interpretiert
Optionen für .network-Dateien
Eintrag Beschreibung
[Match] Abschnitt optional, aber Verwendung dringend empfohlen
Beachte Alle unter .link angegebenen Prüfungen sind auch hier möglich
Name Eine mit Leerzeichen getrennte Liste mit Mustern (Shell-Globs) für die Werte der udev-Eigenschaft INTERFACE
  • Es wird geprüft, ob der tatsächliche Wert einem der Muster entspricht
WLANInterfaceType Eine mit Leerzeichen getrennte Liste von Betriebsarten der WLAN-Schnittstelle
  • Beispiele: ad-hoc, station, ap
  • Weitere siehe Manpage
  • Es wird geprüft, ob die Betriebsart der Schnittstelle mit einem Listeneintrag übereinstimmt
[Link] Abschnitt optional
MACAddress Eine Unicast-MAC-Adresse, welche der Hardware zugewiesen wird
MTUBytes Die maximale Paketlänge in Bytes wird auf den hier angegebenen Wert gesetzt Die üblichen Suffixe wie K, M, G dürfen verwendet werden; sie werden zur Basis 1024 interpretiert
Unmanaged Vorgabe ist no
  • Kann auf den Wert yes gesetzt werden, dann wird der Schnittstelle keine .network-Datei zugewiesen, weil die Suche nach passenden Dateien an dieser Stelle beendet wird
[Network] Abschnitt obligatorisch
Description Beschreibung der Schnittstelle
  • Dies dient nur der Darstellung
DHCP Mögliche Werte: yes, no, ipv4, ipv6
  • Vorgabe ist no, d.h
  • kein Start des DHCP-Client
  • Anderer Wert startet den DHCP-Client das angegebene IP-Protokoll bzw. bei yes für beide Protokolle
  • Der DHCPv6-Client kann aber auch unbeeinflusst von dieser Einstellung über empfangene Ankündigungen des Routers gestartet werden
  • Wenn man den DHCP-Client einschaltet, kann man in den Abschnitten [DHCPv4] bzw. [DHCPv6] dessen Verhalten konfigurieren
DHCPServer Standardwert no
  • Kann auf yes gesetzt werden und startet dann einen DHCPv4-Server
  • Dieser wird im Abschnitt [DHCPServer] konfiguriert
Address Kurzform für einen Abschnitt [Address] zur Definition einer IP-Adresse und deren Prefix-Länge für ein Broadcast.Netzwerk
  • Kann verwendet werden, wenn man in einem Abschnitt [Address] nur den Schlüssel Address benötigt
  • Mehrfache Verwendung dieser Option ist möglich
Gateway Kurzform für einen Abschnitt [Route]
  • Kann verwendet werden, wenn man in einem solchen Abschnitt nur den Schlüssel Gateway benötigt
  • Erzeugt eine default-Route zur angegebenen IP-Adresse
  • Mehrfache Verwendung dieser Option ist möglich, aber sinnlos
DNS Einstellung für systemd-resolved; systemd-networkd ignoriert diesen Schlüssel
  • IP-Adresse eines DNS-Servers, der für die über diese Schnittstelle erreichbaren Rechner einer DNS-Domain die Namensauflösung erbringt
  • Mehrfache Verwendung dieser Option ist möglich
Domains Einstellung für systemd-resolved; systemd-networkd ignoriert diesen Schlüssel
  • Eine mit Leerzeichen getrennte Liste von DNS-Domänen, für welche der/die DNS-Server an dieser Schnittstellen zuständig sind
[Address] Dieser Abschnitt ist mehrfach zulässig
Address Angabe einer IP-Adresse, optional mit deren Prefix-Länge
  • Zulässig sind für IPv4 beispielsweise 192.0.2.42/28 und 10.0.34.56/255.255.128.0 in diesen Schreibweisen
  • Es müssen stets alle 4 Bytes angegeben werden, auch wenn diese den Wert 0 haben
  • Für IPv6 sind nur die vollständige Angabe oder die Schreibweise wie im Beispiel fd00::1/64 zulässig
  • Pflichtangabe in diesem Abschnitt und nur genau einmal möglich
  • Es wird die Adresse zugewiesen und für die Schnittstelle (automatisch, aber abschaltbar) eine Route zum Netzwerk eingerichtet
Broadcast Nur sinnvoll, wenn unter Address in diesem Abschnitt eine IPv4-Adresse angegeben wurde und man nicht die sich aus dieser Angabe ergebene Broadcast-Adresse, sondern diese IP-Adresse verwenden will
Peer IP-Adresse der Gegenstelle bei einer Punkt-zu-Punkt-Verbindung
  • Zur Definition einer Punkt-zu-Punkt-Verbindung sollte man hier und auch unter Address die Prefix-Länge 32 bei IPv4 bzw. 128 bei IPv6 verwenden
  • Bei mehrfacher Verwendung wird nur die letzte Angabe verwendet
[Route] Dieser Abschnitt ist mehrfach zulässig
Type Der Typ der Route
  • Vorgabe ist unicast, mögliche Werte sind die üblichen Typen von Routen wie beispielsweise blackhole
Destination Der Zielbereich als Netzwerk-Prefix: Es muss eine IP-Adresse und optional deren Prefix-Länge angegeben werden, dabei können nur solche IP-Adressen verwendet werden, bei denen beim Host-Teil alle Bit 0 sind
  • Wenn keine Prefix-Länge angegeben wird, impliziert dies 32 bei IPv4 bzw. 128 bei IPv6 (Host-Route)
  • Wenn diese Option fehlt, dann wird als Zielbereich 0.0.0.0/0 bzw. ::/0 verwendet
Gateway Eine IP-Adresse
  • IP-Pakete mit Zieladressen im Zielbereich dieser Route werden an diese Adresse geschickt
Metric Ganze Zahl ohne Vorzeichen
  • Praktisch nur bedeutsam, wenn es zu einem Zeitpunkt mehrere Routen mit gleichem Ziel hinsichtlich Adresse und Prefix-Länge gibt
  • Diese müssen sich dann in dieser Angabe unterscheiden
  • Der Konflikt wird gelöst durch Auswahl der Route mit der kleinsten Metric

.netdev-Dateien: Schnittstelle anlegen

Dateien mit der Endung auf .netdev werden bei jedem Start von systemd-networkd ausgewertet

  • Wenn es eine Datei mit Endung auf .netdev ohne eine dazu passende Schnittstelle gibt, wird die beschriebene Schnittstelle angelegt und konfiguriert

Beispiel: Netzwerkbrücke

Eine Netzwerkbrücke ist eine Realisierung eines Hub/Switch in Software und verbindet mehrere Netzwerkschnittstellen auf Ebene 2

# /etc/systemd/network/20-bridge.netdev
[NetDev]
Kind = bridge
Name = HUB
[Bridge]
STP = yes
HelloTimeSec = 1
MaxAgeSec = 4
ForwardDelaySec = 4

Der gesamte Abschnitt [Bridge] ist hier optional

  • Abhängig vom Typ (Kind=) der Schnittstelle sind weitere Abschnitte zur Ausgestaltung der Schnittstelle zulässig
  • Dies wird hier benutzt, um das Spanning Tree Protokoll einzuschalten und zu parametrieren
  • Details siehe Artikel Netzwerkbrücke

Die Schnittstellen, welche diesem HUB als Ports zugeordnet werden sollen, müssen in ihrer .network-Datei eine entsprechende Zuweisung erhalten

# /etc/systemd/network/80-HUB-port.network
[Match]
Type =! wlan
Name =! HUB
[Network]
Description = Interface als Bridge-Port von HUB verwenden
Bridge = HUB
LinkLocalAddressing = no

Wie im Beispiel gezeigt, kann man mit =! auch auf Ungleichheit testen

  • Dies wird hier benutzt, damit die Brücke nicht sich selbst als Port hinzugefügt wird

Die Angabe "LinkLocalAddressing=no" ist hier optional

  • Sie verhindert, dass per Voreinstellung für jeden Port eine eigene IPv6-Link-Adresse vergeben wird
  • Bei Ubuntu 18.04 mit systemd-Version 237 hat dies den schönen Nebeneffekt, dass die voll funktionsfähige Schnittstelle nicht von networkctl als "degraded" angezeigt wird, weil nur Link-Local-Adressen vorhanden sind

systemd-networkd löscht niemals eine Schnittstelle

  • Selbst wenn man die .netdev-Datei löscht, welche zu ihrer Erzeugung gedient hat, interessiert dies systemd-networkd nicht
  • Eine Schnittstelle, welche nicht zu realer Hardware gehört, kann man aber mit dem Dienstprogramm networkctl vernichten

.link-Dateien

Die Dateien mit Endung auf .link dienen zu Konfiguration vorhandener (Hardware- und Software-) Schnittstelle auf Netzwerkebene 2, soweit es sich um statische Konfigurationselemente handelt. (Variable Einstellungen auf Ebene 2 können dagegen in .network-Dateien erfolgen.) Diese Dateien werden von dem in udev fest eingebauten Modul net_setup_link bearbeitet

  • Damit sind .link-Dateien verkappte udev-Regeln, die grundsätzlich auch in der herkömmlichen udev-Syntax formuliert werden könnten und früher war das auch der Fall. (Hierfür wurde z.B /etc/udev/rules.d/70-persistent-net.rules verwendet.)

Für jede vorhandene Schnittstelle werden nacheinander die .link-Dateien geprüft, ob alle genannten Selektionskriterien gemeinsam zutreffen

  • Die erste passende Datei wird der Schnittstelle zugewiesen, und die in der Datei aufgeführten Konfigurationsaufgaben werden durchgeführt
  • Selbst wenn dabei ein Fehler auftritt, wird keine weitere Datei beachtet

Beispiel: Schnittstelle umbenennen

# /etc/systemd/network/10-rename-to-radio.link</
[Match]
Type = wlan wifi
Path =! pci*usb*
[Link]
Description = Radio-LAN
NamePolicy =
Name = radio

Wenn man das ausprobiert, wird es wahrscheinlich zunächst nicht funktionieren

Die hier gezeigte Arbeitsweise ist potentiell unsicher, weil eine Klasse von Objekten auf ein einziges Element (den Namen) abgebildet wird

  • Solange es nur eine passende Schnittstelle gibt, ist das harmlos
  • Aber bei zwei und mehr passenden Objekten wird die Datei auch auf alle angewandt
  • Ab dem zweiten Umbenennungsversuch gibt es natürlich Fehlermeldungen und Fehlfunktionen
  • Sicherer ist in solchen Fällen eine Selektion beispielsweise über PermanentMACAddress

Hier wird auf Ungleichheit getestet, um USB/WLAN-Sticks, die leicht als zusätzliche zu den eingebauten Schnittstellen im System auftauchen könnten, von dieser Regel auszuschließen

Beispiel: WLAN

WLAN-Schnittstellen werden auf Ebene 2 nicht von systemd-networkd verwaltet

Eine WLAN-Schnittstelle, welche über das externe WLAN-Einrichtungsprogramm bereits auf Ebene 2 als Bridge-Port einer Netzwerkbrücke zugeordnet wurde, bedarf gar keiner weiteren Konfiguration per systemd-networkd

Die Konfiguration einer betriebsbereiten WLAN-Schnittstelle auf Ebene 3 erfolgt dagegen genauso wie bei jeder anderen Schnittstelle

.network-Dateien

Beispiel: Schnittstelle ignorieren

Die System-Schnittstelle lo kann genau wie jede andere Schnittstelle durch Zuweisung einer .network-Datei konfiguriert werden

  • Dies ist normalerweise gar nicht erforderlich
  • Zur Vermeidung von Fehlfunktionen durch irrtümliche Zuweisung einer unpassenden .network-Datei kann man beispielsweise diese Datei verwenden
# /etc/systemd/network/00-lo-unmanaged.network</
[Match]
Name = lo
[Link]
Unmanaged = yes

Diese Technik ist auch sinnvoll für andere Schnittstellen, wenn diese nicht durch systemd-networkd konfiguriert werden sollen bzw. wenn ein Konfigurationsversuch ggf

  • nach langer Wartezeit ohnehin scheitern würde

Beispiel: DHCP oder statische Konfiguration

Mit diesem Satz von .network-Dateien kann man beim Hochlauf des Systems über eine Option auf der Kommandozeile des Kernels den DHCP-Client steuern

# /etc/systemd/network/60-dhcp-all-hardware.network</
# Alle Hardware-Schnittstellen per DHCP konfigurieren.</
# Voreinstellung
  • Wird benutzt, wenn "noDHCP" nicht angegeben wird.</
[Match]
KernelCommandLine =! noDHCP
Path = pci*
[Network]
DHCP = ipv4

Zur Selektion der Hardware-Schnittstellen wird Path benutzt

  • Auch USB-Geräte schließt "pci*" mit ein, weil sie in der Regel über eine PCI/USB-Bridge in das System integriert sind
  • Bei exotischer Hardware kann es ggf
  • anders sein
# /etc/systemd/network/60-dhcp-wlan-only.network</
# Alle WLAN-Schnittstellen (aber nur solche) per DHCP konfigurieren.</
[Match]
KernelCommandLine =! noDHCP=*wlan*
Path = pci*
Type = wlan
[Network]
DHCP = ipv4

Wenn man auf der Kernel-Kommandozeile "noDHCP=wlan" angibt, passt diese Datei nicht

  • Aber vielleicht die nächste
# /etc/systemd/network/60-dhcp-ethernet-only.network</
# Alle Ethernet-Hardware-Schnittstellen (aber nur solche) per DHCP konfigurieren.</
[Match]
KernelCommandLine =! noDHCP=*ether*
Path = pci*
Type = ether
#Type =! wlan
[Network]
DHCP = ipv4

Diese Datei setzt voraus, dass Type=ether funktioniert, was bei Ubuntu 18.04 mit systemd-Version 237 nicht der Fall ist

  • Alternativ kann man voraussetzen, dass es nur die beiden Typen Ethernet und WLAN gibt, und dann Type=!wlan verwenden

Wenn man auf der Kernel-Kommandozeile "noDHCP=ether" angibt, passt diese Datei nicht

  • Aber vielleicht die nächste
# /etc/systemd/network/60-uplink-static.network</
# Nur die Hardware-Schnittstelle mit dem Namen "uplink" statisch konfigurieren.</
[Match]
KernelCommandLine = noDHCP=*
Path = pci*
Name = uplink
[Network]
DHCP = no
Address = 192.168.1.20/24
Gateway = 192.168.1.1
DNS = 8.8.8.8
DNS = 8.8.4.4

Beachte: systemd-networkd ignoriert die Angaben bei DNS=! Zur Konfiguration der DNS-Namensauflösung kann man beispielsweise systemd-resolved starten, welches dann die hier gemachten Angaben für seine Konfiguration benutzt