Wenn Netzwerkprobleme auftreten — Verbindungen laufen in Timeouts, Dienste sind nicht erreichbar oder unerwartete Datenverkehrsmuster entstehen — muessen Sie sehen, was tatsaechlich auf der Leitung passiert. tcpdump ist das Standard-Kommandozeilen-Tool zur Paketerfassung unter Linux, das auf praktisch jedem Server installiert ist und in der Lage ist, Netzwerkverkehr auf Paketebene abzufangen, zu filtern und aufzuzeichnen. Es ist der schnellste Weg, Netzwerkprobleme direkt auf einem Produktionsserver zu diagnostizieren.
Dieser Leitfaden behandelt die praktische Verwendung von tcpdump, von einfachen Erfassungen bis hin zu fortgeschrittener Filterung, Protokollanalyse und der Integration mit Wireshark fuer die visuelle Inspektion.
Voraussetzungen
Bevor Sie beginnen, stellen Sie sicher, dass Sie Folgendes haben:
- Ein Linux-System (Ubuntu, Debian, RHEL/CentOS, Fedora oder aehnlich)
- Terminal-Zugang mit sudo-Berechtigungen (tcpdump erfordert Root fuer die Paketerfassung)
- Grundlegendes Verstaendnis von TCP/IP-Netzwerken (IP-Adressen, Ports, TCP vs. UDP)
tcpdump installieren
tcpdump ist auf den meisten Linux-Distributionen vorinstalliert. Ueberpruefen oder installieren Sie es:
# Debian/Ubuntu
sudo apt update && sudo apt install tcpdump
# RHEL/Fedora/CentOS
sudo dnf install tcpdump
# Verify installation
tcpdump --version
Netzwerkschnittstellen identifizieren
Bevor Sie erfassen, identifizieren Sie, welche Schnittstelle den Datenverkehr traegt, den Sie untersuchen moechten:
# List all interfaces tcpdump can capture on
sudo tcpdump -D
# Or use ip to show interfaces
ip link show
Typische Ausgabe:
1.eth0 [Up, Running, Connected]
2.lo [Up, Running, Loopback]
3.docker0 [Up, Running, Connected]
4.any (Pseudo-device that captures on all interfaces) [Up, Running]
Verwenden Sie any, um auf allen Schnittstellen gleichzeitig zu erfassen, oder geben Sie eine einzelne Schnittstelle fuer uebersichtlichere Ausgaben an.
Grundlegende Erfassung
Gesamten Datenverkehr auf einer Schnittstelle erfassen
sudo tcpdump -i eth0
Dies zeigt jedes Paket in Echtzeit an. Druecken Sie Ctrl+C, um zu stoppen. Die Ausgabe zeigt eine Zeile pro Paket:
14:23:45.123456 IP 10.0.1.5.22 > 10.0.1.1.54321: Flags [P.], seq 1:53, ack 1, win 502, length 52
Felder: Zeitstempel, Protokoll, Quell-IP.Port, Ziel-IP.Port, TCP-Flags, Sequenz-/Bestaetigungsnummern, Fenstergroesse und Nutzlastlaenge.
Anzahl der Pakete begrenzen
# Stop after capturing 50 packets
sudo tcpdump -i eth0 -c 50
Ausfuehrliche Ausgabe
# More detail (TTL, IP options, checksum)
sudo tcpdump -i eth0 -v
# Even more detail
sudo tcpdump -i eth0 -vv
# Maximum verbosity
sudo tcpdump -i eth0 -vvv
IP-Adressen statt Hostnamen anzeigen
# Don't resolve hostnames (faster output)
sudo tcpdump -i eth0 -n
# Don't resolve hostnames or port names
sudo tcpdump -i eth0 -nn
Tipp: Verwenden Sie in der Produktion immer
-nn. Die DNS-Aufloesung fuer jedes Paket verlangsamt die Erfassung und kann zusaetzlichen Datenverkehr erzeugen.
Erfassungsfilter
Filter sind die wichtigste Funktion von tcpdump. Sie verwenden die BPF-Syntax (Berkeley Packet Filter) und werden waehrend der Erfassung angewendet, wodurch Rauschen reduziert wird, bevor es auf Ihrem Bildschirm erscheint.
Nach Host filtern
# Traffic to or from a specific IP
sudo tcpdump -i eth0 host 10.0.1.5
# Only traffic FROM a specific IP
sudo tcpdump -i eth0 src host 10.0.1.5
# Only traffic TO a specific IP
sudo tcpdump -i eth0 dst host 10.0.1.5
Nach Port filtern
# HTTP traffic
sudo tcpdump -i eth0 port 80
# HTTPS traffic
sudo tcpdump -i eth0 port 443
# SSH traffic
sudo tcpdump -i eth0 port 22
# DNS traffic
sudo tcpdump -i eth0 port 53
# Source port only
sudo tcpdump -i eth0 src port 443
# Destination port only
sudo tcpdump -i eth0 dst port 8080
Nach Protokoll filtern
# Only TCP packets
sudo tcpdump -i eth0 tcp
# Only UDP packets
sudo tcpdump -i eth0 udp
# Only ICMP (ping) packets
sudo tcpdump -i eth0 icmp
# Only ARP packets
sudo tcpdump -i eth0 arp
Nach Netzwerk (Subnetz) filtern
# All traffic to or from a subnet
sudo tcpdump -i eth0 net 10.0.1.0/24
# Traffic between two subnets
sudo tcpdump -i eth0 src net 10.0.1.0/24 and dst net 10.0.2.0/24
Filter kombinieren
Verwenden Sie and, or und not (oder &&, ||, !), um Bedingungen zu kombinieren:
# HTTPS traffic to a specific host
sudo tcpdump -i eth0 host 10.0.1.5 and port 443
# HTTP or HTTPS traffic
sudo tcpdump -i eth0 port 80 or port 443
# All traffic except SSH
sudo tcpdump -i eth0 not port 22
# Complex filter: HTTP traffic from one host, excluding a specific IP
sudo tcpdump -i eth0 'src host 10.0.1.5 and port 80 and not dst host 10.0.1.1'
Portbereiche
# Ports 8000 through 8999
sudo tcpdump -i eth0 portrange 8000-8999
Nach TCP-Flags filtern
# Only SYN packets (new connections)
sudo tcpdump -i eth0 'tcp[tcpflags] & (tcp-syn) != 0'
# Only SYN-ACK packets (connection responses)
sudo tcpdump -i eth0 'tcp[tcpflags] & (tcp-syn|tcp-ack) == (tcp-syn|tcp-ack)'
# Only RST packets (connection resets)
sudo tcpdump -i eth0 'tcp[tcpflags] & (tcp-rst) != 0'
# Only FIN packets (connection closures)
sudo tcpdump -i eth0 'tcp[tcpflags] & (tcp-fin) != 0'
Erfassungsdateien speichern und lesen
In eine pcap-Datei schreiben
# Save all traffic to a file
sudo tcpdump -i eth0 -w /tmp/capture.pcap
# Save with a filter
sudo tcpdump -i eth0 -w /tmp/https.pcap port 443
# Rotate files every 100MB, keeping 5 files
sudo tcpdump -i eth0 -w /tmp/capture-%Y%m%d-%H%M%S.pcap -C 100 -W 5
Eine pcap-Datei lesen
# Read all packets from a file
tcpdump -r /tmp/capture.pcap
# Read with filters (applied on display)
tcpdump -r /tmp/capture.pcap port 443
# Read with full detail
tcpdump -r /tmp/capture.pcap -nn -vvv
An Wireshark uebertragen
Das pcap-Format ist universell. Kopieren Sie die Datei auf Ihre Arbeitsstation und oeffnen Sie sie in Wireshark:
# Copy from server to local machine
scp user@server:/tmp/capture.pcap ~/Desktop/
# Or capture remotely and pipe directly to Wireshark
ssh user@server 'sudo tcpdump -i eth0 -w - port 443' | wireshark -k -i -
Paketinhalt anzeigen
Paket-Nutzlast als ASCII anzeigen
# Print packet content in ASCII
sudo tcpdump -i eth0 -A port 80
Dies ist nuetzlich, um HTTP-Anfragen und -Antworten im Klartext zu inspizieren.
Nutzlast als Hex und ASCII anzeigen
# Hex + ASCII dump
sudo tcpdump -i eth0 -X port 80
# Hex + ASCII with link-layer header
sudo tcpdump -i eth0 -XX port 80
Erfassungsgroesse steuern
# Capture only first 96 bytes (headers only)
sudo tcpdump -i eth0 -s 96
# Capture full packets (no truncation)
sudo tcpdump -i eth0 -s 0
Praktische Beispiele zur Fehlerbehebung
DNS-Aufloesungsprobleme diagnostizieren
# Capture all DNS traffic
sudo tcpdump -i eth0 -nn port 53
# Watch for DNS queries and responses with detail
sudo tcpdump -i eth0 -nn -vv port 53
Achten Sie auf: Abfragen ohne Antworten (DNS-Server nicht erreichbar), NXDOMAIN-Antworten (Name existiert nicht) oder ungewoehnlich langsame Antwortzeiten.
HTTP-Verbindungsprobleme debuggen
# See TCP handshake and HTTP requests
sudo tcpdump -i eth0 -nn -A 'host example.com and port 80'
# Check if connections are being reset
sudo tcpdump -i eth0 -nn 'host example.com and tcp[tcpflags] & (tcp-rst) != 0'
Uebermassige Verbindungen identifizieren
# Count connections to port 443 per source IP
sudo tcpdump -i eth0 -nn dst port 443 -c 10000 2>/dev/null | \
awk '{print $3}' | cut -d. -f1-4 | sort | uniq -c | sort -rn | head -20
Datenbankverkehr ueberwachen
# MySQL traffic (port 3306)
sudo tcpdump -i eth0 -nn port 3306
# PostgreSQL traffic (port 5432)
sudo tcpdump -i eth0 -nn port 5432 -c 100
Auf SYN-Flood-Angriffe pruefen
# Count SYN packets per second
sudo tcpdump -i eth0 -nn 'tcp[tcpflags] == tcp-syn' 2>/dev/null | \
awk '{print substr($1,1,8)}' | uniq -c
ICMP-Probleme (Ping) erfassen
# All ICMP traffic
sudo tcpdump -i eth0 -nn icmp
# Specific: ping to a host
sudo tcpdump -i eth0 -nn 'icmp and host 10.0.1.1'
Achten Sie auf: “unreachable”-Antworten, TTL-Ueberschreitungen oder fehlende Echo-Replies.
TLS/SSL-Handshake debuggen
# Capture TLS Client Hello (first message of TLS handshake)
sudo tcpdump -i eth0 -nn 'tcp port 443 and (tcp[((tcp[12:1] & 0xf0) >> 2):1] = 0x16)'
Leistungsaspekte
Ausgabe-Overhead reduzieren
# Disable DNS resolution (-nn)
# Limit capture length (-s 96) if you only need headers
# Write to file (-w) instead of displaying on screen
sudo tcpdump -i eth0 -nn -s 96 -w /tmp/capture.pcap port 443
Ringpuffer fuer lange Erfassungen
# Rotate files: 10 files of 50MB each (500MB total ring buffer)
sudo tcpdump -i eth0 -w /tmp/cap.pcap -C 50 -W 10
Wenn Datei 10 voll ist, wird Datei 1 ueberschrieben, wodurch ein zirkulaerer Puffer entsteht, der die letzten 500 MB des Datenverkehrs aufbewahrt.
Zeitstempel-Optionen
# Microsecond timestamps (default)
sudo tcpdump -i eth0 -tt
# Human-readable timestamps
sudo tcpdump -i eth0 -tttt
# Delta from previous packet
sudo tcpdump -i eth0 -ttt
tcpdump-Kurzreferenz
| Option | Beschreibung |
|---|---|
-i eth0 | Auf bestimmter Schnittstelle erfassen |
-i any | Auf allen Schnittstellen erfassen |
-c 100 | Nach 100 Paketen stoppen |
-n | Hostnamen nicht aufloesen |
-nn | Hostnamen und Ports nicht aufloesen |
-v / -vv / -vvv | Ausfuehrlichkeit erhoehen |
-A | Nutzlast als ASCII anzeigen |
-X | Nutzlast als Hex + ASCII anzeigen |
-w file.pcap | Pakete in Datei schreiben |
-r file.pcap | Pakete aus Datei lesen |
-s 0 | Vollstaendige Pakete erfassen |
-s 96 | Nur Header erfassen |
-C 100 | Dateien alle 100 MB rotieren |
-W 5 | Maximal 5 rotierte Dateien behalten |
-tt | Absolute Unix-Zeitstempel |
-ttt | Delta-Zeitstempel |
-tttt | Menschenlesbare Zeitstempel |
Gaengige Filterausdruecke
| Filter | Erfasst |
|---|---|
host 10.0.1.5 | Datenverkehr zu/von IP |
src host 10.0.1.5 | Datenverkehr von IP |
dst host 10.0.1.5 | Datenverkehr zu IP |
port 443 | Datenverkehr auf Port |
portrange 8000-9000 | Portbereich |
tcp / udp / icmp | Protokoll |
net 10.0.1.0/24 | Subnetz |
not port 22 | SSH ausschliessen |
host A and port 80 | Kombiniert |
port 80 or port 443 | Einer der Ports |
Zusammenfassung
tcpdump ist das unverzichtbare Werkzeug zur Paketerfassung fuer die Netzwerk-Fehlerbehebung unter Linux:
- Verwenden Sie immer
-nn, um die DNS-Aufloesung fuer schnellere und uebersichtlichere Ausgaben zu deaktivieren - Wenden Sie Erfassungsfilter an, um Rauschen zu reduzieren:
host,port,tcp,not port 22 - Speichern Sie lange Erfassungen in pcap-Dateien mit
-wund analysieren Sie spaeter mit Wireshark - Verwenden Sie
-c, um die Erfassungsgroesse zu begrenzen und ein Volllaufen der Festplatte zu verhindern - Kombinieren Sie Filter mit
and,or,notfuer praezise Datenverkehrsisolierung - Verwenden Sie TCP-Flag-Filter zur Diagnose von Verbindungsproblemen (SYN-Floods, RST-Probleme)
- Ringpuffer (
-C+-W) ermoeglichen Langzeiterfassungen auf Produktionsservern - Uebertragen Sie pcap-Dateien an Wireshark fuer detaillierte visuelle Protokollanalyse
Fuer verwandte Themen lesen Sie unsere Anleitungen zu UFW-Firewall auf Ubuntu-Server konfigurieren und SSH-Haertung fuer Linux-Server.