linux-ubuntu-debian networking systemd-networkd configuration backend

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-networkd die 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

  1. .link: Konfiguriert Device-Eigenschaften (z.B. MAC-Adresse, MTU, Offloading).
  2. .netdev: Erstellt virtuelle Geräte (Bonds, Bridges, VLANs, VXLANs).
  3. .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 .network Block: MTUBytes=9000.
  • Offloading: Nutzen Sie .link Dateien, um Features wie ReceiveChecksumOffload=yes oder TCPSegmentationOffload=no für spezifische Workloads (z.B. Firewalls) zu steuern.
  • IPv6 Privacy Extensions: Aktivieren Sie IPv6PrivacyExtensions=yes im [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