tcpdump ist das Standard-Werkzeug für Netzwerkanalyse unter Linux. Es ermöglicht das Mitschneiden und Analysieren von Netzwerkpaketen direkt auf der Kommandozeile.

Installation

Debian/Ubuntu

apt install tcpdump

CentOS/RHEL

dnf install tcpdump

Version prüfen

tcpdump --version

Grundlegende Verwendung

Alle Pakete anzeigen

# Root-Rechte erforderlich
tcpdump

# Auf bestimmtem Interface
tcpdump -i eth0

# Alle Interfaces
tcpdump -i any

Verfügbare Interfaces

tcpdump -D

Ausgabe formatieren

# Verbose
tcpdump -v
tcpdump -vv
tcpdump -vvv

# Keine DNS-Auflösung (schneller)
tcpdump -n

# Keine Port-Auflösung
tcpdump -nn

# Zeitstempel
tcpdump -tttt  # Lesbar
tcpdump -ttt   # Delta seit letztem Paket

Filter-Syntax

Nach Host

# Alle Pakete von/zu einem Host
tcpdump host 192.168.1.100

# Nur Quell-Adresse
tcpdump src host 192.168.1.100

# Nur Ziel-Adresse
tcpdump dst host 192.168.1.100

# Nach Hostname
tcpdump host example.com

Nach Netzwerk

# Ganzes Subnetz
tcpdump net 192.168.1.0/24

# Quell-Netzwerk
tcpdump src net 10.0.0.0/8

Nach Port

# Bestimmter Port
tcpdump port 80
tcpdump port 443

# Port-Bereich
tcpdump portrange 8000-9000

# Quell-Port
tcpdump src port 22

# Ziel-Port
tcpdump dst port 3306

Nach Protokoll

# TCP
tcpdump tcp

# UDP
tcpdump udp

# ICMP (Ping)
tcpdump icmp

# ARP
tcpdump arp

# IPv6
tcpdump ip6

Kombinierte Filter

# AND (&&)
tcpdump host 192.168.1.100 and port 80

# OR (||)
tcpdump port 80 or port 443

# NOT (!)
tcpdump not port 22

# Komplexe Filter
tcpdump 'host 192.168.1.100 and (port 80 or port 443)'
tcpdump 'src host 192.168.1.100 and dst port 3306'
tcpdump 'tcp and not port 22'

Praktische Beispiele

HTTP-Traffic

tcpdump -i eth0 -nn port 80

HTTPS-Traffic

tcpdump -i eth0 -nn port 443

DNS-Anfragen

tcpdump -i eth0 -nn port 53

SSH-Traffic

tcpdump -i eth0 -nn port 22

MySQL-Verbindungen

tcpdump -i eth0 -nn port 3306

SMTP/Mail

tcpdump -i eth0 -nn 'port 25 or port 465 or port 587'

Ping (ICMP)

tcpdump -i eth0 icmp

Nur SYN-Pakete (neue Verbindungen)

tcpdump 'tcp[tcpflags] & (tcp-syn) != 0'

Nur Verbindungsaufbau

tcpdump 'tcp[tcpflags] == tcp-syn'

RST-Pakete (Verbindungsabbrüche)

tcpdump 'tcp[tcpflags] & (tcp-rst) != 0'

In Datei speichern

Capture speichern

# In PCAP-Datei speichern
tcpdump -i eth0 -w capture.pcap

# Mit Filter
tcpdump -i eth0 -w http.pcap port 80

# Mit Zeitlimit (60 Sekunden)
timeout 60 tcpdump -i eth0 -w capture.pcap

# Mit Paketlimit
tcpdump -i eth0 -c 1000 -w capture.pcap

Capture lesen

# Datei lesen
tcpdump -r capture.pcap

# Mit Filtern
tcpdump -r capture.pcap host 192.168.1.100
tcpdump -r capture.pcap -nn port 80

Rotierende Dateien

# 10 Dateien à 100 MB
tcpdump -i eth0 -w capture.pcap -W 10 -C 100

# Ergebnis: capture.pcap0, capture.pcap1, ...

Paket-Inhalt anzeigen

ASCII-Ausgabe

tcpdump -i eth0 -A port 80

Hex + ASCII

tcpdump -i eth0 -X port 80

Hex-Ausgabe

tcpdump -i eth0 -xx port 80

Snapshot-Länge

# Erste 100 Bytes pro Paket
tcpdump -i eth0 -s 100 port 80

# Komplette Pakete
tcpdump -i eth0 -s 0 port 80

Erweiterte Filter

TCP-Flags

# SYN
tcpdump 'tcp[tcpflags] & tcp-syn != 0'

# ACK
tcpdump 'tcp[tcpflags] & tcp-ack != 0'

# FIN
tcpdump 'tcp[tcpflags] & tcp-fin != 0'

# RST
tcpdump 'tcp[tcpflags] & tcp-rst != 0'

# PUSH
tcpdump 'tcp[tcpflags] & tcp-push != 0'

# Nur SYN (kein ACK) - neue Verbindungen
tcpdump 'tcp[tcpflags] == tcp-syn'

# SYN-ACK
tcpdump 'tcp[tcpflags] == (tcp-syn|tcp-ack)'

Paketgröße

# Pakete größer als 500 Bytes
tcpdump 'greater 500'

# Pakete kleiner als 100 Bytes
tcpdump 'less 100'

HTTP-Requests

# GET-Requests
tcpdump -i eth0 -A -s 0 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)' | grep -i "GET"

# Einfacher: HTTP-Header
tcpdump -i eth0 -A port 80 | grep -E "^(GET|POST|PUT|DELETE|Host:)"

VLAN-Traffic

tcpdump -i eth0 vlan 100

Analyse-Szenarien

Netzwerkprobleme diagnostizieren

# Retransmissions finden
tcpdump -i eth0 'tcp[tcpflags] & (tcp-rst) != 0'

# Fragmentierte Pakete
tcpdump -i eth0 '((ip[6:2] > 0) and (ip[6:2] & 0x1fff) != 0)'

# ICMP-Fehler
tcpdump -i eth0 icmp and 'icmp[0] != 8 and icmp[0] != 0'

Langsame Verbindungen

# Verbindungsaufbau überwachen
tcpdump -i eth0 'tcp[tcpflags] == tcp-syn' -ttt

ARP-Probleme

tcpdump -i eth0 arp

Broadcast-Traffic

tcpdump -i eth0 broadcast
tcpdump -i eth0 ether broadcast

Multicast-Traffic

tcpdump -i eth0 multicast

Performance-Tipps

Schnellere Ausgabe

# Keine Namensauflösung
tcpdump -nn

# Keine Prüfsummen-Verifizierung
tcpdump --dont-verify-checksums

Buffer-Größe

# Größerer Buffer für hohen Traffic
tcpdump -B 4096

Kernel-Filter

# BPF-Filter im Kernel (Standard)
tcpdump -i eth0 'tcp port 80'

# Filter-Statistik anzeigen
tcpdump -i eth0 -v port 80 2>&1 | head -20

Mit Wireshark kombinieren

Capture für Wireshark

# Capture erstellen
tcpdump -i eth0 -w /tmp/capture.pcap -c 10000 port 80

# Auf lokalen Rechner kopieren
scp server:/tmp/capture.pcap .

# In Wireshark öffnen
wireshark capture.pcap

Live-Streaming zu Wireshark

# Auf Server
tcpdump -i eth0 -w - -U | ssh user@local "wireshark -k -i -"

# Alternativ: Named Pipe
mkfifo /tmp/capture
tcpdump -i eth0 -w - | tee /tmp/capture
# In Wireshark: /tmp/capture öffnen

Sicherheit und Best Practices

Zugriffsrechte

# tcpdump ohne Root (capability setzen)
setcap cap_net_raw,cap_net_admin=eip /usr/sbin/tcpdump

# Für bestimmten Benutzer
usermod -aG tcpdump username

Sensible Daten

# Passwörter in HTTP-Traffic
tcpdump -i eth0 -A port 80 2>/dev/null | grep -i "password\|passwd\|pass="

# Warnung: Nur für eigene Systeme!

Speicherplatz überwachen

# Maximale Dateigröße
tcpdump -i eth0 -w capture.pcap -C 100  # 100 MB pro Datei

# Mit Rotation
tcpdump -i eth0 -w capture.pcap -C 100 -W 5  # 5 Dateien

Nützliche Einzeiler

# Top 10 verbindungsfreudigste IPs
tcpdump -nn -c 1000 | awk '{print $3}' | cut -d. -f1-4 | sort | uniq -c | sort -rn | head -10

# Bandbreitennutzung beobachten
tcpdump -i eth0 -w - | pv > /dev/null

# HTTP-Hosts auflisten
tcpdump -i eth0 -nn -A port 80 | grep "Host:"

# DNS-Anfragen auflisten
tcpdump -i eth0 -nn port 53 | grep -oE '[a-zA-Z0-9.-]+\.[a-zA-Z]+'

Troubleshooting

Keine Pakete angezeigt

# Interface prüfen
ip link show
tcpdump -D

# Promiscuous Mode
tcpdump -i eth0 --immediate-mode

Permission denied

# Als Root ausführen
sudo tcpdump -i eth0

# Oder Capabilities setzen
sudo setcap cap_net_raw=ep /usr/sbin/tcpdump

Zu viele Pakete

# Mit Filter einschränken
tcpdump -i eth0 'not port 22 and not port 53'

# Limit setzen
tcpdump -i eth0 -c 100

Zusammenfassung

| Option | Funktion | |--------|----------| | -i eth0 | Interface wählen | | -nn | Keine Namensauflösung | | -v/-vv/-vvv | Verbose | | -w file | In Datei schreiben | | -r file | Aus Datei lesen | | -c 100 | Nur 100 Pakete | | -A | ASCII-Ausgabe | | -X | Hex + ASCII |

| Filter | Beschreibung | |--------|--------------| | host IP | Nach Host | | port 80 | Nach Port | | tcp/udp/icmp | Nach Protokoll | | src/dst | Quelle/Ziel | | and/or/not | Logische Operatoren |

Fazit

tcpdump ist unverzichtbar für Netzwerkanalyse und Troubleshooting. Die BPF-Filtersyntax ermöglicht präzise Paketauswahl. Für komplexe Analysen exportieren Sie Captures im PCAP-Format für Wireshark. Beachten Sie Datenschutz und rechtliche Aspekte beim Mitschneiden von Netzwerkverkehr.