Die Konfiguration von VLAN-Linux-Netzwerken mit iproute2 erlaubt es, eine einzelne physische Leitung in mehrere isolierte Broadcast-Domänen aufzuteilen – ohne zusätzliche Hardware. Dieser Leitfaden behandelt 802.1Q-getaggte Interfaces, die Einrichtung von Trunk-Ports und die Netzwerksegmentierung ausschließlich mit dem ip-Befehl, der in jeder modernen Linux-Distribution enthalten ist. Am Ende versteht man, wie VLAN-Sub-Interfaces erstellt und dauerhaft gespeichert werden, wie Linux-Hosts über einen Trunk verbunden werden und wie die Isolation zwischen Segmenten verifiziert wird.

Voraussetzungen

  • Ein Linux-Host mit Kernel 3.2 oder neuer (jede aktuelle Distribution ist geeignet)
  • Root- oder sudo-Zugang
  • Das iproute2-Paket installiert (standardmäßig auf Debian, Ubuntu, RHEL, Fedora, Arch enthalten)
  • Eine physische oder virtuelle NIC; für einen echten Trunk wird ein 802.1Q-fähiger verwalteter Switch im Trunk-Modus benötigt
  • Grundkenntnisse in IP-Adressierung und Subnetting

802.1Q-VLANs verstehen

Ein VLAN (Virtual Local Area Network) erstellt logische Netzwerksegmente über ein gemeinsames physisches Medium. 802.1Q ist der IEEE-Standard, der einen 4-Byte-Tag in Ethernet-Frames einfügt, um die VLAN-ID zu übertragen. Linux implementiert dies im 8021q-Kernelmodul, das VLAN-Sub-Interfaces (manchmal auch virtuelle Interfaces genannt) bereitstellt, die dem Netzwerk-Stack als gewöhnliche Ethernet-Geräte erscheinen.

Wichtige Begriffe:

  • VLAN-ID (VID): Eine 12-Bit-Zahl (1–4094), die ein VLAN identifiziert.
  • Getaggter Port / Trunk-Port: Ein Switch- oder NIC-Port, der Frames mit 802.1Q-Tags für mehrere VLANs überträgt.
  • Ungetaggter Port / Access-Port: Überträgt Datenverkehr für ein einzelnes VLAN; der Switch entfernt den Tag vor der Weiterleitung an das Endgerät.
  • Sub-Interface: In Linux ein virtuelles Interface wie eth0.10, das über einem übergeordneten Interface (eth0) liegt und getaggte Frames für VLAN 10 filtert oder einfügt.

Wenn ein Frame auf eth0 mit VLAN-Tag 10 ankommt, leitet der Kernel ihn an eth0.10 weiter. Ausgehender Datenverkehr, der über eth0.10 gesendet wird, wird vor dem Versand mit VLAN 10 getaggt.

802.1Q-Unterstützung laden

Bevor VLAN-Interfaces erstellt werden, muss das 8021q-Kernelmodul geladen sein:

# Modul für die aktuelle Sitzung laden
sudo modprobe 8021q

# Prüfen, ob es geladen ist
lsmod | grep 8021q

Um es automatisch beim Booten zu laden, wird es der Moduldatei hinzugefügt:

echo "8021q" | sudo tee /etc/modules-load.d/8021q.conf

Die meisten Distributionen laden es bei Bedarf, wenn das erste VLAN-Interface erstellt wird, aber das explizite Laden vermeidet unerwartetes Verhalten.

VLAN-Sub-Interfaces mit iproute2 erstellen

Der Befehl ip link add erstellt ein VLAN-Sub-Interface in einem einzigen Schritt. Die Syntax ist unkompliziert:

# VLAN 10 auf eth0 erstellen
sudo ip link add link eth0 name eth0.10 type vlan id 10

# Interface aktivieren
sudo ip link set eth0.10 up

# IP-Adresse zuweisen
sudo ip addr add 192.168.10.1/24 dev eth0.10

Für weitere VLANs den Vorgang wiederholen. Hier wird VLAN 20 auf demselben übergeordneten Interface hinzugefügt:

sudo ip link add link eth0 name eth0.20 type vlan id 20
sudo ip link set eth0.20 up
sudo ip addr add 192.168.20.1/24 dev eth0.20

Das Ergebnis mit dem Flag -d (Detail) prüfen, um VLAN-ID und Protokoll zu bestätigen:

ip -d link show eth0.10
# Ausgabe enthält: vlan protocol 802.1Q id 10 <REORDER_HDR>

Es kann jeder Interface-Name verwendet werden — eth0.10 ist eine verbreitete Konvention, aber vlan10 oder mgmt sind gleichermaßen gültig. Die VLAN-ID ist entscheidend, nicht der Name.

Trunk-Port-Konfiguration

Ein Trunk-Port überträgt getaggten Datenverkehr für mehrere VLANs zwischen Netzwerkgeräten. Wenn zwei Linux-Hosts direkt miteinander verbunden werden oder ein Linux-Host mit einem verwalteten Switch verbunden wird, fungiert das physische Interface als Trunk und jedes Sub-Interface repräsentiert ein VLAN.

Zwei direkt verbundene Linux-Hosts:

Auf Host A:

sudo ip link add link eth1 name eth1.100 type vlan id 100
sudo ip link set eth1.100 up
sudo ip addr add 10.0.100.1/24 dev eth1.100

sudo ip link add link eth1 name eth1.200 type vlan id 200
sudo ip link set eth1.200 up
sudo ip addr add 10.0.200.1/24 dev eth1.200

Auf Host B:

sudo ip link add link eth1 name eth1.100 type vlan id 100
sudo ip link set eth1.100 up
sudo ip addr add 10.0.100.2/24 dev eth1.100

sudo ip link add link eth1 name eth1.200 type vlan id 200
sudo ip link set eth1.200 up
sudo ip addr add 10.0.200.2/24 dev eth1.200

Von Host A aus erreicht ping 10.0.100.2 Host B über VLAN 100. ping 10.0.200.2 erreicht ihn über VLAN 200 — gleiche physische Leitung, isolierte Broadcast-Domänen.

Verbindung mit einem verwalteten Switch:

Am Switch wird der Port, der dem Linux-Host zugewandt ist, als Trunk (oder bei manchen Herstellern als „tagged”) konfiguriert, und die VLAN-IDs 100 und 200 werden zugelassen. Auf der Linux-Seite ist keine zusätzliche Änderung erforderlich — das übergeordnete Interface leitet alle getaggten Frames bereits an das entsprechende Sub-Interface weiter.

iproute2 im Vergleich zu anderen VLAN-Management-Tools

ToolAnsatzPersistenzKomplexität
iproute2 (ip)Kernel-Sub-InterfacesManuell oder über networkd/NMNiedrig
NetworkManager (nmcli)VLAN-VerbindungsprofileIntegriertNiedrig
systemd-networkd.netdev- + .network-DateienIntegriertNiedrig–Mittel
Open vSwitch (OVS)Virtueller Switch, vollständige VLAN/Tunnel-UnterstützungOVS-DatenbankHoch
bridge + vlan_filtering802.1Q auf Linux-BridgeManuell oder networkdMittel

Für einen einzelnen Host mit wenigen VLANs ist iproute2 zusammen mit systemd-networkd der einfachste zuverlässige Ansatz. Für komplexe virtuelle Netzwerke (mehrere VMs, VXLAN-Overlays) ist Open vSwitch die richtige Wahl.

Praxisszenario: Management- und Produktionsdatenverkehr isolieren

Ein Hypervisor wird mit einer einzelnen 10-GbE-NIC verwaltet. Die Sicherheitsrichtlinie schreibt vor, dass VM-Datenverkehr und Host-Management-Datenverkehr niemals eine Broadcast-Domäne teilen dürfen. Der vorgelagerte Switch-Port ist bereits ein Trunk mit VLAN 10 (Management) und VLAN 100 (Produktions-VMs).

# Management-Netzwerk für den Host selbst
sudo ip link add link eno1 name eno1.10 type vlan id 10
sudo ip link set eno1.10 up
sudo ip addr add 192.168.10.5/24 dev eno1.10
sudo ip route add default via 192.168.10.1 dev eno1.10

# Produktions-Bridge für VMs — VLAN-Interface an Bridge anhängen
sudo ip link add name br100 type bridge
sudo ip link set eno1.100 master br100
sudo ip link add link eno1 name eno1.100 type vlan id 100
sudo ip link set eno1.100 up
sudo ip link set br100 up

Virtuelle VM-Interfaces (tap-Geräte) werden dann als Bridge-Ports zu br100 hinzugefügt. Der VM-Datenverkehr ist innerhalb von VLAN 100 isoliert; die Management-Ebene des Hosts befindet sich auf VLAN 10 und ist nur über ihr eigenes Sub-Interface erreichbar.

VLAN-Konfiguration mit systemd-networkd dauerhaft speichern

Die obigen ip link-Befehle sind flüchtig — sie verschwinden nach einem Neustart. Mit systemd-networkd ist die Persistenz deklarativ und übersichtlich.

Die VLAN-Netdev-Definition unter /etc/systemd/network/10-vlan10.netdev erstellen:

[NetDev]
Name=eth0.10
Kind=vlan

[VLAN]
Id=10

Die Netzwerkdatei unter /etc/systemd/network/10-vlan10.network erstellen:

[Match]
Name=eth0.10

[Network]
Address=192.168.10.1/24

Außerdem sicherstellen, dass das übergeordnete Interface gestartet wird und VLAN-Datenverkehr weiterleitet unter /etc/systemd/network/05-eth0.network:

[Match]
Name=eth0

[Network]
VLAN=eth0.10
VLAN=eth0.20

Änderungen anwenden:

sudo systemctl enable --now systemd-networkd
sudo networkctl reload

Für NetworkManager-Nutzer lautet der entsprechende Befehl:

sudo nmcli connection add type vlan con-name vlan10 dev eth0 id 10 ip4 192.168.10.1/24
sudo nmcli connection up vlan10

Fallstricke und Sonderfälle

MTU und Jumbo-Frames: Das Hinzufügen eines 802.1Q-Tags erhöht die Frame-Größe um 4 Bytes. Wenn das übergeordnete Interface eine MTU von 1500 hat und ein Remote-Host ebenfalls 1500 verwendet, kann es auf zwischengeschalteten Geräten, die keine 1504-Byte-Frames zulassen, zu Fragmentierung kommen. Entweder die MTU des Sub-Interfaces auf 1496 senken oder Jumbo-Frames auf NIC und Switch aktivieren.

sudo ip link set eth0.10 mtu 1496

Promiscuous-Modus ist nicht erforderlich: Der 802.1Q-Stack des Kernels filtert nach VLAN-ID auf Treiberebene. Für den normalen VLAN-Betrieb wird kein promisc-Modus auf dem übergeordneten Interface benötigt.

VLAN 1 ist auf vielen Switches besonders: Einige verwaltete Switches behandeln VLAN 1 als natives/ungetaggtes VLAN und können dessen Tag entfernen oder falsch handhaben. Für explizit getaggte VLANs sollten VIDs 2–4094 bevorzugt werden, um Mehrdeutigkeiten zu vermeiden.

Double-Tagging (QinQ): Linux unterstützt verschachtelte VLAN-Tags mit type vlan protocol 802.1ad. Dies sollte nur verwendet werden, wenn das Netzwerk explizit Provider-Bridging (IEEE 802.1ad) erfordert.

Virtuelle Maschinen und Bridge-VLAN-Filterung: Wenn VMs eine Linux-Bridge teilen, sollte VLAN-Filterung auf der Bridge selbst aktiviert werden (bridge vlan filtering 1), anstatt Sub-Interfaces pro VM zu erstellen. Dies ist skalierbarer und vermeidet MAC-Flooding über Bridge-Ports hinweg.

NetworkManager-Interferenz: Auf Desktops oder Servern mit NetworkManager kann dieser versuchen, manuell erstellte VLAN-Interfaces zu verwalten. Das übergeordnete Interface in /etc/NetworkManager/conf.d/ als nicht verwaltet markieren oder nmcli verwenden, um die VLANs korrekt zu definieren, damit NM und networkd nicht in Konflikt geraten.

Fehlerbehebung

Kein Datenverkehr auf dem VLAN-Sub-Interface:

  1. Prüfen, ob das übergeordnete Interface aktiv ist: ip link show eth0 — Status muss UP sein.
  2. Prüfen, ob das Sub-Interface aktiv ist: ip link show eth0.10.
  3. Prüfen, ob der Switch-Port im Trunk-Modus ist und die VLAN-ID erlaubt ist.
  4. Mit tcpdump -i eth0 -e vlan erfassen, ob getaggte Frames ankommen.

Falsche VLAN-ID-Filterung:

# VLAN-ID eines Sub-Interfaces bestätigen
ip -d link show eth0.10 | grep "vlan id"

Eine Nichtübereinstimmung zwischen der Linux- und der Switch-VLAN-ID ist der häufigste Fehler.

Routenkonflikte zwischen VLANs:

Wenn überlappende Subnetze über VLANs hinweg zugewiesen werden, routet der Kernel Datenverkehr über die Routing-Tabelle des Hosts zwischen ihnen, was die Isolation aufhebt. Für jedes VLAN sollten eindeutige, nicht überlappende Subnetze verwendet werden.

Interface verschwindet nach Neustart:

Flüchtige ip link-Befehle bleiben nicht erhalten. systemd-networkd, NetworkManager oder /etc/network/interfaces (Debian/Ubuntu, veraltet) sollten verwendet werden, um persistente VLAN-Interfaces zu definieren.

Zusammenfassung

  • Die 802.1Q-VLAN-Linux-Konfiguration verwendet den Befehl ip link add ... type vlan id aus iproute2 — keine zusätzlichen Pakete erforderlich.
  • Sub-Interfaces wie eth0.10 liegen über einem physischen übergeordneten Interface und filtern oder injizieren getaggte Frames für eine bestimmte VLAN-ID.
  • Ein Trunk-Port überträgt mehrere VLANs über eine physische Leitung; jedes VLAN erhält sein eigenes Sub-Interface und eine eigene IP.
  • Für persistente Konfiguration werden .netdev/.network-Dateien von systemd-networkd oder nmcli-Verbindungsprofile verwendet.
  • Auf MTU-Overhead, VLAN-1-Besonderheiten bei Switches und NetworkManager-Konflikte achten.
  • VLAN-Sub-Interfaces mit Linux-Bridges kombinieren, um VMs mit getaggten Segmenten zu verbinden, ohne einen physischen verwalteten Switch.

Verwandte Artikel