Systemd/Networkd/Konfiguration
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
- Diese ähnelt dem Ini-Format
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
|
Virtualization | Prüft ob und ggf
|
KernelCommandLine | Option auf der Kernel-Kommandozeile
|
KernelVersion | Kernel Version
|
Architecture | Prüfe auf bestimmte Architektur
|
[NetDev] | Abschnitt obligatorisch |
Name | Name der Schnittstelle
|
Kind | Typ der Schnittstelle
|
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
|
Driver | Eine mit Leerzeichen getrennte Liste mit Werten für die udev-Eigenschaft ID_NET_DRIVER
|
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
|
MacAddress | Eine mit Leerzeichen getrennte Liste mit MAC-Adressen
|
PermanentMACAddress | Eine mit Leerzeichen getrennte Liste mit permanenten EUI-48
|
[Link] | Abschnitt obligatorisch |
NamePolicy | Eine Liste mit Bezeichnern für die zur Benennung dieser Schnittstelle auszuprobierenden Methoden
|
Name | Ein Name für die Schnittstelle
|
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
|
WLANInterfaceType | Eine mit Leerzeichen getrennte Liste von Betriebsarten der WLAN-Schnittstelle
|
[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
|
[Network] | Abschnitt obligatorisch |
Description | Beschreibung der Schnittstelle
|
DHCP | Mögliche Werte: yes, no, ipv4, ipv6
|
DHCPServer | Standardwert no
|
Address | Kurzform für einen Abschnitt [Address] zur Definition einer IP-Adresse und deren Prefix-Länge für ein Broadcast.Netzwerk
|
Gateway | Kurzform für einen Abschnitt [Route]
|
DNS | Einstellung für systemd-resolved; systemd-networkd ignoriert diesen Schlüssel
|
Domains | Einstellung für systemd-resolved; systemd-networkd ignoriert diesen Schlüssel
|
[Address] | Dieser Abschnitt ist mehrfach zulässig |
Address | Angabe einer IP-Adresse, optional mit deren Prefix-Länge
|
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
|
[Route] | Dieser Abschnitt ist mehrfach zulässig |
Type | Der Typ der Route
|
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
|
Gateway | Eine IP-Adresse
|
Metric | Ganze Zahl ohne Vorzeichen
|
.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
- Dies kann als einfache Methode für eine Internetverbindungsfreigabe verwendet werden
# /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
- Zu den Gründen und zur Abhilfe siehe Problembehebung
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
- Man muss die Betriebsbereitstellung der Schnittstelle mit anderen Mitteln erledigen, siehe: WLAN mit systemd-networkd
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