Zum Inhalt springen

Systemd/Networkd/Konfiguration

Aus Foxwiki

Systemd/Networkd/Konfiguration

Beschreibung

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
Verzeichnisse

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

Best Practice

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

Dokumentation

Die Einstellmöglichkeiten sind in der Datei aufgelistet und werden ausführlich in der Manpage erklärt

man networkd.conf

Anwendung

.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


Problembehebung

Konfiguration

Dateien

Datei Beschreibung


Anhang

Siehe auch



Dokumentation

Man-Page
  1. prep(1)


Links

Projekt

Weblinks


TMP