systemd-networkd: Modern Network Configuration (Artikel 010)
Tiefgreifende Konfiguration von systemd-networkd ohne Abstraktionslayer wie Netplan. Erstellung von .network, .netdev und .link Dateien für präzise Netzwerkkontrolle.
# systemd-networkd: Native Netzwerkkonfiguration für Profis
TL;DR / Management Summary Während Ubuntu auf Netplan setzt, bietet
systemd-networkddie direkte, native Methode zur Netzwerkkonfiguration in der Systemd-Welt. Es ist der Standard für Debian Minimal, Arch Linux und viele Cloud-Images. Durch die Nutzung von einfachen INI-Dateien in/etc/systemd/network/lassen sich komplexe Setups wie Bridges, VLANs und Bondings hochperformant und ohne Overhead realisieren.
# 1. Einführung & Architektur
Warum nativ konfigurieren?
systemd-networkd ist ein schlanker Dämon, der auf Kernel-Events (udev) reagiert und Netzwerk-Interfaces verwaltet, sobald sie erscheinen. Es ist ideal für Umgebungen, in denen ein minimaler Footprint und schnelle Bootzeiten wichtig sind.
# Die drei Dateitypen
- .link: Konfiguriert Device-Eigenschaften (z.B. MAC-Adresse, MTU, Offloading).
- .netdev: Erstellt virtuelle Geräte (Bonds, Bridges, VLANs, VXLANs).
- .network: Konfiguriert die eigentlichen Netzwerkparameter (IP, DHCP, Routing).
graph TD
A[Hardware Interface] -->|udev event| B[systemd-networkd]
B -->|Match by MAC/Name| C[.link File]
B -->|Match by Name| D[.network File]
E[.netdev File] -->|Create Virtual Device| B
D -->|Apply| F[IP/Route/DNS]
# 2. Grundkonfiguration
Statische IPs und DHCP.
Dateien werden in /etc/systemd/network/ abgelegt und numerisch sortiert abgearbeitet.
# Beispiel: Statische IP (10-eth0.network)
[Match]
Name=enp0s1
[Network]
Address=192.168.1.10/24
Gateway=192.168.1.1
DNS=1.1.1.1
# Beispiel: DHCP (20-dhcp.network)
[Match]
Name=en*
[Network]
DHCP=yes
# 3. Komplexe Setups: Virtuelle Interfaces
Bonding und Bridges.
# Schritt 1: Das virtuelle Gerät erstellen (10-bond0.netdev)
[NetDev]
Name=bond0
Kind=bond
[Bond]
Mode=802.3ad
TransmitHashPolicy=layer3+4
MIIMonitorSec=100ms
# Schritt 2: Physikalische Interfaces zuweisen (20-bond-slave.network)
[Match]
Name=enp1s0
Name=enp2s0
[Network]
Bond=bond0
# Schritt 3: IP auf dem Bond konfigurieren (30-bond0.network)
[Match]
Name=bond0
[Network]
Address=172.16.0.5/24
# 4. Day-2 Operations: Management
Status und Änderungen.
# Den Status überwachen
networkctl ist das primäre Interface für den Admin.
# Übersicht aller Links
networkctl list
# Detaillierter Status eines Interfaces
networkctl status bond0
# Änderungen anwenden
# Konfiguration neu laden
sudo systemctl restart systemd-networkd
# Oder (sanfter)
sudo networkctl reload
# 5. Troubleshooting & “War Stories”
Wenn die Pakete nicht fließen.
# Story 1: “Match-Konflikte”
Symptom: Ein Interface bekommt plötzlich zwei IPs oder gar keine.
Ursache: Mehrere .network Dateien passen auf das gleiche Interface (z.B. Match=en* und Match=enp0s1).
Lösung: Nutzen Sie die numerische Sortierung (Prefix 10-, 20-). Die erste Datei, die passt, “gewinnt” für viele Parameter. Nutzen Sie networkctl status, um zu sehen, welche Datei (Network File: ...) aktuell aktiv ist.
# Story 2: “MAC-Adressen-Chaos beim Bonding”
Symptom: Der LACP-Bond kommt nicht hoch, Switch meldet Fehler.
Ursache: Die MAC-Adresse des Bonds wechselt, je nachdem welcher Slave zuerst up ist.
Lösung: Definieren Sie eine statische MAC-Adresse im .netdev File oder nutzen Sie ein .link File, um die Hardware-Eigenschaften festzuzurren.
# 6. Performance & Optimierung
- MTU: Setzen Sie Jumboframes für Storage-Netze direkt im
.networkBlock:MTUBytes=9000. - Offloading: Nutzen Sie
.linkDateien, um Features wieReceiveChecksumOffload=yesoderTCPSegmentationOffload=nofür spezifische Workloads (z.B. Firewalls) zu steuern. - IPv6 Privacy Extensions: Aktivieren Sie
IPv6PrivacyExtensions=yesim[Network]Block für anonymisierte IPv6-Adressen.
# Anhang: Cheatsheet
| Datei-Endung | Zweck |
|---|---|
.link |
Layer 2 & udev (MAC, Name, MTU) |
.netdev |
Logische Geräte (Bond, Bridge, VLAN) |
.network |
Layer 3 (IP, DHCP, Routes) |
# Debugging Log
Um wirklich tief zu graben, erhöhen Sie das Log-Level:
systemctl edit systemd-networkd -> Environment=SYSTEMD_LOG_LEVEL=debug
Dann: journalctl -u systemd-networkd -f