Linux Netzwerk-Namespaces, veth-Paare & Software-Bridges: Virtualisierungs-Primitive
Erstellt: 08.11.2026 · Zuletzt aktualisiert: 08.11.2026 · Nejat Hakan
Management Summary: Wie schaffen es Container-Runtimes wie Podman, Docker und Kubernetes, jedem Container eine eigene
eth0-Schnittstelle, eine isolierte IP-Adresse, eine unabhängige Routing-Tabelle und eigene Firewallregeln zuzuweisen – ganz ohne das Booten einer virtuellen Maschine? Durch die Kombination von drei nativen Virtualisierungs-Primitiven des Linux-Kernels: Netzwerk-Namespaces (ip netns), virtuelle Ethernet-Paare (veth) und Layer-2 Software-Bridges (type bridge).
-
Netzwerk-Namespaces (
ip netns)
Vollständige Netzwerk-Stacks im Kernel-RAM isolieren: Eigene Socket-Queues, Routing-Tabellen, Loopback-Devices und Netfilter-Regeln.
-
Virtuelle Ethernet-Paare (
veth)
Virtuelle Kernel-Patchkabel spannen: Pakete, die an einem Ende hineingeschoben werden, treten am anderen Ende über Namespace-Grenzen hinweg aus.
-
Linux Kernel Bridges
Software-definierte Layer-2 Learning Switches im Kernel betreiben – inklusive MAC-Forwarding-Database (FDB) und STP-Unterstützung.
-
Container-Fabric selbst bauen
Ein komplettes mandantenfähiges Container-Netzwerk ausschließlich mit
iproute2-Befehlen errichten und die CNI-Funktionsweise entmystifizieren.
1. Die drei Bausteine der Linux-Netzwerk-Virtualisierung
Moderne Container-Netzwerke benötigen keine proprietäre Software, sondern setzen sich aus drei standardisierten Kernel-Mechanismen zusammen:
%%{init: {'flowchart': {'wrappingWidth': 350}}}%%
flowchart TB
subgraph RootNS ["Host Root Namespace"]
direction TB
BR["Linux Bridge: br-app0<br/>Gateway: 10.88.0.1/24"]
VH1["veth-app1-br (Slave Port)"]
VH2["veth-app2-br (Slave Port)"]
BR --- VH1
BR --- VH2
end
subgraph NS1 ["NetNS: ns-app1 (Container 1)"]
VC1["eth0 (veth Peer)<br/>IP: 10.88.0.11/24"]
end
subgraph NS2 ["NetNS: ns-app2 (Container 2)"]
VC2["eth0 (veth Peer)<br/>IP: 10.88.0.12/24"]
end
RootNS --> NS1 --> NS2
VH1 <==>|"veth Patchkabel"| VC1
VH2 <==>|"veth Patchkabel"| VC2
- Netzwerk-Namespace (
ip netns): Eine logische Kopie des gesamten Netzwerk-Stacks. Prozesse innerhalb eines Namespaces können weder Sockets noch Schnittstellen des Hosts oder anderer Namespaces sehen. - Virtuelles Ethernet-Paar (
veth): Verhält sich exakt wie ein physisches Patchkabel mit zwei Enden. Es wird immer als Paar erzeugt. Wird ein Ende in einen Namespace verschoben, bildet es die Brücke zum Host. - Linux Bridge (
type bridge): Ein IEEE 802.1D Software-Switch im Kernel. Er lernt MAC-Adressen an seinen Ports, pflegt die Forwarding Database (FDB) und leitet Frames zwischen den angeschlossenenveth-Kabeln weiter.
2. Netzwerk-Namespaces verwalten (ip netns)
Namespaces werden direkt über iproute2 gesteuert:
# 1. Zwei isolierte Namespaces erzeugen
sudo ip netns add ns-web
sudo ip netns add ns-db
# 2. Alle aktiven Namespaces auflisten
ip netns list
# 3. Namespaces sind als Bind-Mounts im Dateisystem hinterlegt
ls -la /var/run/netns/
Befehle innerhalb eines Namespaces ausführen
Befehle im Kontext eines Namespaces werden mit ip netns exec (oder der Kurzform ip -n <name>) abgesetzt:
# Schnittstellen im Namespace ns-web prüfen (anfangs existiert nur 'lo')
sudo ip -n ns-web link show
# Loopback-Schnittstelle im Namespace aktivieren (ZWINGEND ERFORDERLICH)
sudo ip -n ns-web link set lo up
# Beliebige Prozesse im isolierten Namespace starten
sudo ip netns exec ns-web ss -tulpn
3. Das virtuelle Patchkabel: veth-Paare in der Praxis
Ein veth-Interface kann niemals alleine existieren; es wird immer als gekoppeltes Paar generiert:
# veth-Paar erzeugen: 'veth-host' und 'veth-guest'
sudo ip link add veth-host type veth peer name veth-guest
# Das Ende 'veth-guest' in den Namespace 'ns-web' verschieben
sudo ip link set veth-guest netns ns-web
# Im Namespace das Interface auf den Standardnamen 'eth0' umbenennen
sudo ip -n ns-web link set dev veth-guest name eth0
# IP-Adressen zuweisen und beide Enden aktivieren
sudo ip addr add 10.88.0.1/24 dev veth-host
sudo ip link set veth-host up
sudo ip -n ns-web addr add 10.88.0.2/24 dev eth0
sudo ip -n ns-web link set eth0 up
Wird nun vom Host 10.88.0.2 angepingt, wandern die Pakete direkt durch das virtuelle veth-Kabel in den Namespace ns-web.
4. Die Linux Bridge: Software Layer-2 Switching
Sobald mehr als zwei Namespaces miteinander kommunizieren sollen, reichen Punkt-zu-Punkt-Kabel nicht mehr aus. Wir stecken die Host-Enden aller veth-Kabel in eine Linux Bridge:
# 1. Virtuelle Bridge erstellen
sudo ip link add name br-app0 type bridge
# 2. Bridge mit IP versehen (dient als Standard-Gateway für alle Namespaces)
sudo ip addr add 10.88.0.1/24 dev br-app0
sudo ip link set dev br-app0 up
# 3. Das Host-Ende eines veth-Kabels an die Bridge anschließen
sudo ip link set veth-host master br-app0
# 4. Angeschlossene Ports und MAC-Forwarding-Tabelle (FDB) inspizieren
bridge link show
bridge fdb show dev br-app0
5. Hands-On Lab: Ein Container-Netzwerk von Grund auf selbst gebaut
Führe dieses Skript auf einem Debian-Server aus, um ein funktionierendes, isoliertes Zwei-Container-Netzwerk mit vollem Internetzugang zu errichten:
#!/usr/bin/env bash
# Datei: /opt/net-ops/build_container_fabric.sh
set -euo pipefail
echo "=== 1. Linux Bridge Gateway (br-app0) erstellen ==="
sudo ip link add name br-app0 type bridge
sudo ip addr add 10.88.0.1/24 dev br-app0
sudo ip link set dev br-app0 up
echo "=== 2. Zwei isolierte Netzwerk-Namespaces erstellen ==="
sudo ip netns add ns-app1
sudo ip netns add ns-app2
echo "=== 3. veth-Patchkabel erstellen und an die Bridge anschließen ==="
# App 1 Kabel
sudo ip link add veth-app1-br type veth peer name eth0 netns ns-app1
sudo ip link set veth-app1-br master br-app0 up
# App 2 Kabel
sudo ip link add veth-app2-br type veth peer name eth0 netns ns-app2
sudo ip link set veth-app2-br master br-app0 up
echo "=== 4. Netzwerkkonfiguration in den Namespaces vornehmen ==="
# ns-app1 konfigurieren
sudo ip -n ns-app1 link set lo up
sudo ip -n ns-app1 addr add 10.88.0.11/24 dev eth0
sudo ip -n ns-app1 link set eth0 up
sudo ip -n ns-app1 route add default via 10.88.0.1
# ns-app2 konfigurieren
sudo ip -n ns-app2 link set lo up
sudo ip -n ns-app2 addr add 10.88.0.12/24 dev eth0
sudo ip -n ns-app2 link set eth0 up
sudo ip -n ns-app2 route add default via 10.88.0.1
echo "=== 5. Internetzugang über Host-NAT-Masquerading aktivieren ==="
sudo sysctl -w net.ipv4.ip_forward=1 > /dev/null
sudo nft add table ip container_nat
sudo nft add chain ip container_nat post { type nat hook postrouting priority 100 \; }
sudo nft add rule ip container_nat post oifname "eth0" ip saddr 10.88.0.0/24 masquerade
echo "=== 6. Verbindungstest: Namespace-zu-Namespace & Internet ==="
# Ping von App 1 zu App 2 über die Bridge
sudo ip netns exec ns-app1 ping -c 2 10.88.0.12
# Ping von App 1 ins Internet über das Host-NAT
sudo ip netns exec ns-app1 ping -c 2 8.8.8.8
echo "=== Container-Netzwerk erfolgreich aufgebaut! ==="
6. High-Speed TCP Congestion Tuning: Google BBR & FQ
Virtualisierungs- und Container-Hosts mit tausenden gleichzeitigen TCP-Sitzungen sollten die alte paketverlustbasierte Überlastungssteuerung (cubic) durch Google BBR (Bottleneck Bandwidth and RTT) ersetzen:
%%{init: {'flowchart': {'wrappingWidth': 350}}}%%
flowchart TB
CUBIC["Altes TCP CUBIC<br/>Erhöht Rate bis Verlust<br/>Bufferbloat & Latenz"]
BBR["Google BBR + FQ Scheduler<br/>Misst Bandbreite & min RTT<br/>Kein Bufferbloat"]
CUBIC -->|"Upgrade des Algorithmus"| BBR
BBR & Fair Queueing unter Debian aktivieren
Erstelle /etc/sysctl.d/99-tcp-bbr.conf:
# Datei: /etc/sysctl.d/99-tcp-bbr.conf
# 1. Fair Queueing (FQ) als Standard-Queueing-Discipline setzen
net.core.default_qdisc = fq
# 2. Google BBR Überlastungssteuerung aktivieren
net.ipv4.tcp_congestion_control = bbr
# 3. Socket-Puffergrenzen für Gigabit-Leitungen vergrößern (16 MB Maximum)
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
# 4. TCP Fast Open (TFO) aktivieren
net.ipv4.tcp_fastopen = 3
Aktivieren:
7. Nächste Schritte
Mit dem Verständnis der Kernel-Primitive (ip netns, veth und Bridges) folgt nun die Brücke zur modernen Container- und Cloud-Orchestrierung:
-
Container-Netzwerke & CNI-Architektur
Docker-Bridges, Rootless Podman (
pasta/slirp4netns), die CNI-Spezifikation und Kubernetes-Overlay-Netzwerke (Flannel vs. Cilium eBPF).