Verwendete Software und Versionen
Diese Erklärung bezieht sich auf:
- TCP/IP-Stack: IPv4 und IPv6 (RFC 791, RFC 8200)
- Docker: Version 24.0+ (für Container-Beispiele)
- Linux Kernel: 5.15+ (Netfilter-Subsystem)
- Kontext: Distributions-übergreifende Netzwerk-Grundlagen
Die IP-Adressen sind eindeutige Identifikatoren im Netzwerk-Namespace
Jede IP-Adresse bezeichnet einen spezifischen Netzwerk-Endpunkt. IPv4 verwendet 32-Bit-Adressen (4.294.967.296 mögliche Adressen), IPv6 erweitert auf 128-Bit (340 Sextillionen Adressen). Diese Zahlen sind keine theoretischen Konstrukte - sie bestimmen praktische Grenzen. Ein /24-Subnetz (255.255.255.0 Netmask) bietet 254 nutzbare Host-Adressen, ein /16-Subnetz 65.534 Adressen.
Container-Netzwerke nutzen private Adressbereiche nach RFC 1918: 192.168.0.0/16, 172.16.0.0/12, 10.0.0.0/8. Docker erstellt standardmäßig ein 172.17.0.0/16-Netzwerk - ein Subnetz innerhalb des RFC 1918-Bereichs 172.16.0.0/12. Docker-Netzwerke bleiben von anderen privaten Netzwerken isoliert. Jeder Container erhält eine sequenzielle Adresse: 172.17.0.2, 172.17.0.3, etc.
Die Subnetz-Notation /24, /16, /12 beschreibt, wie viele Bits für das Netzwerk reserviert sind. /24 bedeutet 24 Netzwerk-Bits, 8 Host-Bits - ergibt 2^8 = 256 Adressen minus Netzwerk- und Broadcast-Adresse = 254 nutzbare IPs. /16 reserviert 16 Netzwerk-Bits, 16 Host-Bits - ergibt 2^16 = 65.536 Adressen minus 2 = 65.534 nutzbare IPs.
Die Ports definieren Service-Endpunkte auf IP-Adressen
Ein Port ist eine 16-Bit-Zahl (0-65535), die spezifische Services auf einer IP-Adresse identifiziert. Port 80 steht universell für HTTP, Port 443 für HTTPS, Port 22 für SSH. Diese Zuordnungen sind Konventionen der Internet Assigned Numbers Authority (IANA) - keine technischen Zwänge. Ein Webserver kann auf Port 8080 lauschen, SSH auf Port 2222.
Die Ports 0-1023 sind “Well-Known Ports” und traditionell für System-Services reserviert. Die Ports 1024-49151 sind “Registered Ports” für spezifische Anwendungen. Die Ports 49152-65535 sind “Dynamic/Private Ports” für temporäre Verbindungen. Ein Client nutzt einen zufälligen Port aus dem Dynamic-Bereich für ausgehende Verbindungen - der Server antwortet an diese temporäre Port-Nummer zurück.
Das Docker-Port-Mapping verbindet die Host-Ports mit den Container-Ports: -p 8080:80 leitet Host-Port 8080 an Container-Port 80 weiter. Netfilter erstellt automatisch DNAT-Regeln (Destination Network Address Translation) in der PREROUTING-Chain. Diese iptables-Manipulation erklärt Konflikte mit UFW - beide Tools modifizieren dieselben Netfilter-Tabellen ohne Koordination.
Die TCP/IP-Stack-Architektur bestimmt den Datenfluss
Die Netzwerk-Kommunikation funktioniert in Schichten. Die unterste Schicht (Layer 1-2) transportiert Ethernet-Frames zwischen physisch verbundenen Geräten. Layer 3 (IP) vermittelt Pakete zwischen verschiedenen Netzwerken. Router fungieren als Vermittlungsstellen für diese Weiterleitung. Layer 4 (TCP/UDP) stellt zuverlässige Verbindungen zwischen Anwendungen her. Jede Schicht fügt eigene Header hinzu und entfernt sie beim Empfänger wieder.
Ein HTTP-Request durchläuft diese Schichten: HTTP-Request → TCP-Segment (mit Port-Informationen) → IP-Paket (mit Quell- und Ziel-IP) → Ethernet-Frame (mit MAC-Adressen). Am Ziel wird dieser Prozess umgekehrt: Ethernet-Frame → IP-Paket → TCP-Segment → HTTP-Request. Jede Schicht verarbeitet nur ihre eigenen Header und reicht den Inhalt nach oben weiter.
TCP (Transmission Control Protocol) garantiert eine zuverlässige Datenübertragung durch Sequenznummern, Bestätigungen und Neuübertragung verlorener Pakete. UDP (User Datagram Protocol) verzichtet auf diese Garantien zu Gunsten einer geringeren Latenz. DNS nutzt UDP für schnelle Anfragen, HTTP nutzt TCP für eine zuverlässige Übertragung großer Inhalte.
Das Subnetting ermöglicht eine hierarchische Netzwerk-Organisation
Das Subnetting teilt große Netzwerke in kleinere, verwaltbare Einheiten. Ein /16-Netzwerk (192.168.0.0/16) kann in 256 /24-Subnetze unterteilt werden: 192.168.0.0/24, 192.168.1.0/24, …, 192.168.255.0/24. Jedes Subnetz funktioniert als eigenständige Broadcast-Domain mit eigener Gateway-IP.
Die Subnetz-Maske bestimmt, welcher Teil der IP-Adresse das Netzwerk identifiziert. Eine /24-Maske (255.255.255.0) bedeutet: Die ersten drei Oktette (192.168.1) identifizieren das Netzwerk, das letzte Oktett (0-255) die Hosts. Zwei IPs im selben Subnetz kommunizieren direkt via Layer 2, verschiedene Subnetze benötigen einen Router.
Das Variable Length Subnet Masking (VLSM) optimiert die IP-Adress-Nutzung. Ein Point-to-Point-Link zwischen zwei Routern benötigt nur ein /30-Subnetz (4 IPs: Netzwerk, Router A, Router B, Broadcast). Ein Server-Netzwerk mit 50 Hosts nutzt ein /26-Subnetz (64 IPs). Diese Flexibilität reduziert die Adress-Verschwendung erheblich.
Die Routing-Tabellen bestimmen die Paket-Wege
Jedes Netzwerk-Interface hat eine Routing-Tabelle, die bestimmt, wohin Pakete gesendet werden. Die Default-Route (0.0.0.0/0) leitet alle unbekannten Ziele an das Standard-Gateway. Spezifischere Routen haben Vorrang: Eine Route zu 192.168.1.0/24 überstimmt die Default-Route für dieses Subnetz.
Container-Netzwerke erstellen separate Routing-Tabellen in isolierten Network-Namespaces. Ein Container sieht nur seine eigene Routing-Tabelle mit dem Docker-Bridge als Default-Gateway. Der Host hat eine Master-Routing-Tabelle, die zwischen physischen Interfaces und virtuellen Container-Bridges vermittelt.
Mehrere Default-Gateways erfordern Policy-Based Routing oder Metric-Gewichtung. Ein System mit Ethernet und WLAN bevorzugt typischerweise Ethernet (niedrigere Metric). Fällt Ethernet aus, übernimmt automatisch WLAN. Diese Failover-Mechanismen funktionieren transparent für die Anwendungen.
Die Docker-Netzwerk-Isolation und das Port-Mapping
Docker erstellt für jeden Container einen isolierten Network-Namespace mit eigenem Loopback-Interface, eigener Routing-Tabelle und separaten Firewall-Regeln. Diese Isolation erklärt, warum localhost im einem Container nur die eigenen Container-Services erreicht.
Das Standard-Docker-Bridge-Netzwerk verbindet Container über ein virtuelles Bridge-Interface (docker0). Dieses Bridge funktioniert wie ein Switch: Container können sich gegenseitig über ihre Bridge-IP-Adressen erreichen. Port-Mapping mit -p erstellt NAT-Regeln, die Host-Ports an Container-Ports weiterleiten.
Die User-Defined Networks bieten erweiterte Features: Automatische DNS-Auflösung zwischen Containern, bessere Isolation von anderen Containern, IPv6-Unterstützung. Ein docker network create erstellt ein separates Bridge-Netzwerk mit eigenem IP-Bereich, unabhängig vom Standard-docker0-Bridge.
IPv6-Grundlagen für moderne Netzwerke
IPv6 verwendet 128-Bit-Adressen in hexadezimaler Notation: 2001:db8:85a3::8a2e:370:7334. Die Doppelpunkt-Notation erlaubt Abkürzungen: Führende Nullen können weggelassen werden, aufeinanderfolgende Null-Blöcke werden zu :: verkürzt. Diese Adresse ist weltweit eindeutig ohne eine NAT-Übersetzung.
IPv6-Adressen haben eine hierarchische Struktur: Die ersten 64 Bits identifizieren das Netzwerk-Präfix, die letzten 64 Bits den Host-Identifier. Automatische Konfiguration durch SLAAC (Stateless Address Autoconfiguration) generiert eine Host-IDs aus MAC-Adressen oder zufälligen Werten. Privacy Extensions wechseln regelmäßig die Host-ID für eine bessere Anonymität.
Link-Local-Adressen (fe80::/10) funktionieren ohne Router-Konfiguration für lokale Kommunikation. Unique Local Addresses (fc00::/7) entsprechen IPv4-Private-Adressen für interne Netzwerke. Global Unicast Addresses (2000::/3) sind weltweite eindeutige Adressen ohne NAT-Komplexität.
Praktische NAT-Implementierungen
Die Network Address Translation (NAT) übersetzt private IP-Adressen in öffentliche Adressen für den Internet-Zugang. Ein Router mit öffentlicher IP 203.0.113.1 übersetzt ausgehende Pakete von 192.168.1.100:3456 zu 203.0.113.1:3456. Eingehende Antwort-Pakete werden zurück übersetzt. Diese Zustandstabelle ermöglicht mehreren privaten Geräten den Internet-Zugang über eine öffentliche IP.
Die Port Address Translation (PAT) erweitert NAT um eine Port-Übersetzung bei Port-Konflikten. Zwei interne Hosts mit identischen Source-Ports erhalten unterschiedliche externe Ports: 192.168.1.100:80 → 203.0.113.1:1024, 192.168.1.101:80 → 203.0.113.1:1025. Der Router führt eine Zuordnungstabelle für eine korrekte Rück-Übersetzung.
Docker nutzt masquerading für Container-Internet-Zugang: Container-Pakete erhalten die Host-IP als Source-Adresse. Iptables-Regeln in der POSTROUTING-Chain übersetzen automatisch Container-IPs zu Host-IP. Diese NAT-Implementierung funktioniert transparent, solange ausgehende Verbindungen initiiert werden.
Debugging-Techniken bei Netzwerk-Problemen
ss -tulnp zeigt alle lauschenden Ports mit zugehörigen Prozessen. Die Ausgabe enthält Protokoll (tcp/udp), lokale Adresse, Port und Prozess-ID. Ein Service auf 0.0.0.0:80 lauscht auf allen Interfaces, 127.0.0.1:8080 nur auf localhost. Diese Information identifiziert schnell Service-Bindungs-Probleme.
ip route show zeigt die aktuelle Routing-Tabelle mit Default-Gateway und Interface-spezifischen Routen. ip addr show listet alle IP-Adressen pro Interface. Diese Tools ersetzen die veralteten ifconfig und route Befehle mit modernerer, präziserer Ausgabe.
Paket-Tracing mit tcpdump oder wireshark zeigt tatsächlich übertragene Pakete. Ein tcpdump -i any port 80 zeigt alle HTTP-Pakete auf allen Interfaces. Die Ausgabe enthält Quell-/Ziel-IP, Ports, TCP-Flags und Paket-Größen. Diese Low-Level-Analyse hilft bei komplexen Konnektivitätsprobleme.
Firewall-Integration und Port-Sicherheit
Moderne Linux-Systeme verwenden Netfilter für die Paket-Filterung. Jedes Paket durchläuft definierte Hooks: PREROUTING (vor Routing-Entscheidung), INPUT (zu lokalen Prozessen), FORWARD (durch System weitergeleitete Pakete), OUTPUT (von lokalen Prozessen), POSTROUTING (nach Routing-Entscheidung).
Eine zustandsbasierte Filterung (Connection Tracking) merkt sich etablierte Verbindungen. Eine Regel --state ESTABLISHED,RELATED erlaubt Antwort-Pakete auf ausgehende Verbindungen, ohne dabei eingehende Ports öffnen zu müssen. Dieser Mechanismus ermöglicht sichere Standard-Konfigurationen mit ausgehenden Verbindungen und blockierten eingehenden Ports.
Docker modifiziert iptables-Regeln automatisch für Container-Konnektivität. Die DOCKER-Chain in der FORWARD-Tabelle erlaubt Inter-Container-Kommunikation. Port-Mapping erstellt DNAT-Regeln in der PREROUTING-Chain. Diese automatischen Änderungen können manuelle Firewall-Regeln überschreiben oder umgehen.
Performance-Optimierung und Monitoring
TCP-Window-Scaling optimiert den Durchsatz bei Verbindungen mit hoher Bandbreite. Das ursprüngliche 16-Bit-TCP-Window limitiert auf 64KB. Window-Scaling-Option multipliziert diese Größe für moderne Gigabit-Verbindungen. Eine 1 Gbit/s-Verbindung mit 50ms RTT benötigt 6MB Window-Größe für einen optimalen Durchsatz.
Receive Side Scaling (RSS) verteilt Netzwerk-Interrupts auf mehrere CPU-Cores. Multi-Queue-Netzwerkkarten erstellen separate Queues pro Core. Diese Parallelisierung verhindert, dass ein einzelner Core zum Flaschenhals für die Netzwerk-Performance wird.
iftop zeigt die Bandbreiten-Nutzung pro Verbindung in Echtzeit. nethogs gruppiert den Netzwerk-Verkehr nach Prozessen. nload visualisiert die Interface-Auslastung grafisch. Diese Tools identifizieren Bandwidth-Probleme und unerwartete Netzwerk-Aktivität schnell.
Weiterführende Schritte:
-
Container-Netzwerke: Docker-Bridge, Overlay-Networks, Service-Discovery (geplant)