Wire-Level Paketanalyse mit tcpdump & Berkeley Packet Filters (BPF)
Erstellt: 08.11.2026 · Zuletzt aktualisiert: 08.11.2026 · Nejat Hakan
Management Summary: Wenn Systemprotokolle, Reverse-Proxy-Fehlerseiten und Firewall-Metriken widersprüchliche Diagnosen liefern, gilt im Netzwerkbetrieb ein unumstößlicher Grundsatz: Pakete auf der Leitung lügen niemals. Basierend auf der
AF_PACKET-Socketschnittstelle des Linux-Kernels und der Bibliotheklibpcapisttcpdumpdas mächtigste Werkzeug zur Echtzeit-Paketinspektion. Durch die Auswertung von Berkeley Packet Filters (BPF) direkt im Kernel-Speicher filtert es Multi-Gigabit-Datenströme ohne spürbare CPU-Last, identifiziert TCP-Handshake-Blockaden und erzeugt forensische PCAP-Dateien für die Offline-Analyse in Wireshark.
-
In-Kernel BPF-Engine
Verstehe, wie BPF-Bytecode im Kernel-Speicher unerwünschte Frames verwirft, noch bevor teure Speicherkopien in den User-Space stattfinden.
-
TCP-Flag-Diagnose
Firewall-Drops, geschlossene Ports (
RST) und hängende TLS-Handshakes anhand vonSYN-,ACK-,FIN- undRST-Bits eindeutig unterscheiden. -
Fortgeschrittene BPF-Syntax
Bitmasken auf Byte-Offsets anwenden, um TCP-Verbindungsversuche, ICMP-Fragmentierungsfehler und DNS-Timeouts gezielt zu isolieren.
-
Rotierende PCAP-Ringpuffer
Sporadische Produktivfehler ohne das Risiko volllaufender Festplatten aufzeichnen: Feste Ringpuffer mit
-Cund-Wdimensionieren.
1. Die Architektur des Paketmitschnitts: AF_PACKET & In-Kernel BPF
Wie kann tcpdump Netzwerkverkehr abfangen, ohne laufende Anwendungen zu stören? Es nutzt die AF_PACKET-Socketschnittstelle des Linux-Kernels:
%%{init: {'flowchart': {'wrappingWidth': 350}}}%%
flowchart TB
NIC["Physischer NIC RX Ring"] --> DRIVER["Treiber der Netzwerkkarte"]
DRIVER --> CLONE["Kernel Packet Cloner"]
CLONE -->|"Regulärer Pfad"| STACK["TCP/IP Kernel Stack"]
CLONE -->|"Raw Copy"| BPF["In-Kernel BPF Engine<br/>Prüft Bytecode im RAM"]
BPF -->|"Kein Treffer"| DROP["Verworfen (0% CPU)"]
BPF -->|"Treffer"| RING["AF_PACKET Ring Buffer"]
RING -->|"recvfrom()"| TCPDUMP["tcpdump Prozess<br/>Schreibt PCAP / stdout"]
Der Performance-Vorteil von In-Kernel BPF
Würde tcpdump jedes Paket über die Kernelschnittstelle in den User-Space kopieren, um dort String-Vergleiche durchzuführen, bräche die CPU bei Gigabit-Datenraten unter Interrupt-Last zusammen. Stattdessen wird dein BPF-Filterausdruck (z. B. 'tcp port 443') in BPF-Bytecode übersetzt und direkt im Kernel ausgeführt. Nicht passende Pakete werden in Nanosekunden verworfen.
2. Die goldene Capture-Regel & essenzielle Parameter
Die goldene Regel: IMMER -nn verwenden
Führe tcpdump niemals ohne den Parameter -nn aus. Ohne das erste -n versucht tcpdump, alle IP-Adressen per Reverse-DNS (PTR) in Hostnamen aufzulösen. Ohne das zweite -n werden Portnummern in Dienstnamen übersetzt. Die DNS-Abfragen erzeugen sofort neuen Netzwerkverkehr, den tcpdump erneut mitschneidet – eine katastrophale Endlosschleife, die das Terminal einfriert und das Netz flutet!
Wichtige CLI-Parameter im Überblick
| Parameter | Bedeutung & Praxiseinsatz |
|---|---|
-nn |
Deaktiviert DNS- und Portnamen-Auflösung. Zwingend erforderlich in der Produktion. |
-i eth0 |
Bestimmt die Schnittstelle (-i any lauscht auf allen Interfaces, Bridges und Loopbacks). |
-s 0 |
Setzt die Snapshot-Länge auf 0 (schneidet das gesamte Paket ohne Kürzung mit). |
-v, -vv, -vvv |
Erhöht die Detailtiefe (zeigt TTL, IP-IDs, TCP-Optionen und Prüfsummen an). |
-X / -XX |
Gibt Nutzdaten zusätzlich in Hexadezimal- und ASCII-Darstellung aus (ideal für HTTP/DNS). |
-e |
Gibt Layer-2-Ethernet-Header aus (Quell-/Ziel-MAC-Adressen und 802.1Q-VLAN-Tags). |
-c 100 |
Beendet den Mitschnitt automatisch nach genau 100 passenden Paketen. |
-w trace.pcap |
Schreibt die Rohpakete direkt als Binärdatei für die spätere Analyse in Wireshark. |
-r trace.pcap |
Liest und analysiert eine bestehende PCAP-Datei offline im Terminal. |
3. Berkeley Packet Filters (BPF-Syntax) beherrschen
BPF-Filter verknüpfen Primitive, Richtungen und Protokolle über logische Operatoren (and, or, not):
1. Grundlegende Filter-Primitive
# Gesamten Datenverkehr zu oder von Host 10.10.20.11 mitschneiden
sudo tcpdump -i eth0 -nn host 10.10.20.11
# Ausgehenden Webverkehr zu einem bestimmten Subnetz erfassen
sudo tcpdump -i eth0 -nn 'dst net 198.51.100.0/24 and (port 80 or port 443)'
# Eigenen SSH-Verkehr ausfiltern, um das Terminal nicht vollzuspammen
sudo tcpdump -i eth0 -nn 'not port 22'
2. Bitmasken auf TCP-Flags anwenden
Die wahre Stärke von BPF liegt in bitweisen Operationen auf Byte-Offsets. Die TCP-Flags befinden sich an Byte-Position 13 des TCP-Headers:
%%{init: {'flowchart': {'wrappingWidth': 350}}}%%
flowchart TB
BYTE["TCP-Header Byte 13 (Flags)<br/>Session-Steuerungs-Bits"]
subgraph InitGroup ["Verbindungsaufbau"]
direction TB
S["SYN (Bit 1): 0x02"]
A["ACK (Bit 4): 0x10"]
S --> A
end
subgraph TermGroup ["Verbindungsabbau"]
direction TB
F["FIN (Bit 0): 0x01"]
R["RST (Bit 2): 0x04"]
F --> R
end
BYTE --> InitGroup
InitGroup --> TermGroup
# 1. Nur initiale Verbindungsversuche erfassen (SYN ohne ACK)
sudo tcpdump -i eth0 -nn 'tcp[tcpflags] & (tcp-syn|tcp-ack) == tcp-syn'
# 2. Verbindungsabbrüche und Resets erfassen (RST gesetzt)
sudo tcpdump -i eth0 -nn 'tcp[tcpflags] & tcp-rst != 0'
# 3. IPv4-Pakete mit gesetztem Don't-Fragment-Bit (DF) filtern
sudo tcpdump -i eth0 -nn 'ip[6] & 0x40 != 0'
4. Troubleshooting-Rezepte („Pakete lügen niemals“)
1. TCP 3-Way Handshake analysieren
Starte folgenden Mitschnitt während eines Verbindungsversuchs mit curl oder einem Datenbank-Client:
Muster der TCP-Flags auswerten:
-
Muster A: Gesunder, offener Port
Analyse:Client.49210 > Server.5432: Flags [S], seq 100234 Server.5432 > Client.49210: Flags [S.], seq 892301, ack 100235 Client.49210 > Server.5432: Flags [.], ack 892302[S](SYN) gefolgt von[S.](SYN-ACK) und[.](ACK). Die Verbindung steht erfolgreich. -
Muster B: Port erreicht, aber Dienst gestoppt (
Connection Refused)Analyse:Client.49210 > Server.5432: Flags [S], seq 100234 Server.5432 > Client.49210: Flags [R.], seq 0, ack 100235[R.](RST-ACK). Das Paket erreichte den Zielhost, aber dort lauscht kein Prozess auf Port 5432. -
Muster C: Firewall-Drop (
Connection Timed Out)Analyse: WiederholteClient.49210 > Server.5432: Flags [S], seq 100234 Client.49210 > Server.5432: Flags [S], seq 100234 (Retransmission)[S]-Pakete ohne jede Antwort des Servers. Das Paket wurde vonnftables, UFW oder einer Cloud-Security-Group lautlos verworfen.
2. DNS-Probleme diagnostizieren
Prüfe Query-IDs und Antwortcodes (NXDOMAIN, SERVFAIL oder fehlende Antworten).
3. Path MTU Discovery Fehler aufspüren
Erkennt ICMP-Nachrichten des Typs Fragmentation Needed, die von fehlerhaften Zwischen-Firewalls verschluckt werden.
5. Rotierende PCAP-Ringpuffer in der Produktion
Um sporadisch auftretende Fehler über Stunden aufzuzeichnen, ohne Festplatten zum Überlaufen zu bringen, nutze -C (Dateigröße in MB) und -W (Anzahl rotierender Dateien):
# Zeichnet Pakete in /var/log/captures/ auf
# Rotiert zwischen 5 Dateien zu je 100 MB (Maximal 500 MB Festplattenbelegung)
sudo mkdir -p /var/log/captures
sudo tcpdump -i eth0 -nn -s 0 -C 100 -W 5 -w /var/log/captures/app_debug.pcap 'port 443 or port 5432'
tcpdump erzeugt zyklisch app_debug.pcap0 bis app_debug.pcap4 und überschreibt älteste Daten automatisch.
6. Live-Streaming direkt in Wireshark via SSH
Statt .pcap-Dateien umständlich per scp herunterzuladen, streame die Pakete direkt vom entfernten Debian-Server in dein lokales Wireshark auf der Workstation:
# Auf der lokalen Workstation ausführen:
ssh root@203.0.113.10 "tcpdump -U -s 0 -nn -i eth0 -w - 'not port 22'" | wireshark -k -i -
-U: Weisttcpdumpan, Pakete sofort ungepuffert an stdout auszugeben.-w -: Schreibt Rohdaten direkt in die Standardausgabe der SSH-Session.wireshark -k -i -: Startet Wireshark sofort (-k) und liest aus stdin (-i -).
7. Nächste Schritte: Wechsel zu Cluster 3
Herzlichen Glückwunsch! Du hast Cluster 2: Sicherheit, Tunnel & Firewalling vollständig abgeschlossen. Im nächsten Cluster widmen wir uns dem Herzstück moderner RZ- und Cloud-Infrastrukturen:
-
Cluster 3: Linux als Layer-3 Router & NAT
Debian zum Enterprise-Router machen: IP-Forwarding, SNAT-Masquerading, DNAT-Portweiterleitung und Connection-Tracking-Tuning.