tcpdump ist das Standard-Tool für Paket-Captures unter Linux. Es ermöglicht detaillierte Netzwerk-Analyse und ist unverzichtbar für Debugging und Security.

Installation

# Debian/Ubuntu
apt install tcpdump

# RHEL/CentOS
dnf install tcpdump

# Version prüfen
tcpdump --version

Grundlagen

Einfache Captures

# Alle Pakete auf Standard-Interface
tcpdump

# Bestimmtes Interface
tcpdump -i eth0

# Alle Interfaces
tcpdump -i any

# Verfügbare Interfaces
tcpdump -D

Ausgabe-Format

# Ausgabe:
# 10:00:00.123456 IP 192.168.1.10.12345 > 93.184.216.34.80: Flags [S], seq 1234567890, win 65535, options [mss 1460], length 0

# Zeitstempel | Protokoll | Quelle > Ziel | TCP-Flags | Sequenz | Window | Optionen | Länge

Filter-Ausdrücke

Host-basiert

# Bestimmter Host
tcpdump host 192.168.1.10

# Quell-Host
tcpdump src host 192.168.1.10

# Ziel-Host
tcpdump dst host 192.168.1.10

# Netzwerk
tcpdump net 192.168.1.0/24

Port-basiert

# Bestimmter Port
tcpdump port 80

# Quell-Port
tcpdump src port 443

# Ziel-Port
tcpdump dst port 22

# Port-Range
tcpdump portrange 8000-9000

Protokoll-basiert

# TCP
tcpdump tcp

# UDP
tcpdump udp

# ICMP
tcpdump icmp

# ARP
tcpdump arp

Kombinierte Filter

# AND
tcpdump host 192.168.1.10 and port 80

# OR
tcpdump port 80 or port 443

# NOT
tcpdump not port 22

# Komplex
tcpdump 'host 192.168.1.10 and (port 80 or port 443)'

Ausgabe-Optionen

Lesbarkeit

# Verbose
tcpdump -v
tcpdump -vv
tcpdump -vvv

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

# Keine Port-Namen
tcpdump -nn

# ASCII-Ausgabe
tcpdump -A

# Hex + ASCII
tcpdump -X

# Hex + ASCII (Link-Layer)
tcpdump -XX

Anzahl und Zeit

# Nur N Pakete
tcpdump -c 100

# Mit Zeitstempel
tcpdump -t        # Kein Zeitstempel
tcpdump -tt       # Unix-Timestamp
tcpdump -ttt      # Delta zum vorherigen
tcpdump -tttt     # Datum + Zeit
tcpdump -ttttt    # Delta zum ersten Paket

Datei-Operationen

In Datei schreiben

# Capture speichern
tcpdump -w capture.pcap

# Mit Limit
tcpdump -c 1000 -w capture.pcap

# Rotieren (alle 100MB oder 1 Stunde)
tcpdump -w capture-%Y%m%d-%H%M%S.pcap -G 3600 -C 100

# Ring-Buffer (10 Dateien à 100MB)
tcpdump -w capture.pcap -W 10 -C 100

Aus Datei lesen

# Capture lesen
tcpdump -r capture.pcap

# Mit Filter
tcpdump -r capture.pcap port 80

# Verbose
tcpdump -r capture.pcap -vvv

TCP-Analyse

TCP-Flags

# SYN-Pakete (neue Verbindungen)
tcpdump 'tcp[tcpflags] & tcp-syn != 0'

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

# RST-Pakete (Reset)
tcpdump 'tcp[tcpflags] & tcp-rst != 0'

# FIN-Pakete (Verbindungsende)
tcpdump 'tcp[tcpflags] & tcp-fin != 0'

# PSH-Pakete (Daten)
tcpdump 'tcp[tcpflags] & tcp-push != 0'

TCP-Flags Übersicht

FlagBedeutung
SSYN (Verbindungsaufbau)
.ACK
FFIN (Verbindungsende)
RRST (Reset)
PPSH (Push)
UURG (Urgent)

HTTP-Analyse

HTTP-Traffic

# HTTP-Requests
tcpdump -A port 80 | grep -E "^(GET|POST|PUT|DELETE|HEAD)"

# HTTP-Header
tcpdump -A -s 0 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'

# Nur GET-Requests
tcpdump -s 0 -A 'tcp dst port 80 and tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x47455420'

DNS-Analyse

# DNS-Anfragen
tcpdump -n port 53

# Verbose
tcpdump -vvv -n port 53

# Nur Anfragen
tcpdump -n 'udp port 53 and udp[10] & 0x80 = 0'

Praktische Beispiele

SSH-Traffic außer meiner Verbindung

tcpdump 'port 22 and not host MY_IP'

Nur neue TCP-Verbindungen

tcpdump 'tcp[tcpflags] = tcp-syn'

Pakete mit bestimmter Größe

# Große Pakete
tcpdump 'greater 1000'

# Kleine Pakete
tcpdump 'less 100'

ICMP-Fehler

tcpdump 'icmp[icmptype] != icmp-echo and icmp[icmptype] != icmp-echoreply'

Datenbank-Traffic

# MySQL
tcpdump -i eth0 port 3306 -w mysql.pcap

# PostgreSQL
tcpdump -i eth0 port 5432 -w postgres.pcap

Slow-Connections finden

# Retransmissions
tcpdump 'tcp[tcpflags] & tcp-syn != 0' -w syn.pcap

Performance-Optionen

# Buffer-Größe erhöhen
tcpdump -B 4096 -i eth0

# Schneller (kein DNS, weniger Output)
tcpdump -nn -q

# Nur Snaplen (nicht ganze Pakete)
tcpdump -s 96

# Volle Pakete
tcpdump -s 0

Remote-Capture

# Über SSH
ssh user@server 'tcpdump -w - port 80' > local-capture.pcap

# Mit sofortiger Analyse
ssh user@server 'tcpdump -w - port 80' | tcpdump -r -

# Für Wireshark
ssh user@server 'tcpdump -w - port 80' | wireshark -k -i -

Wireshark-Integration

# Capture für Wireshark
tcpdump -i eth0 -w capture.pcap

# Live an Wireshark
tcpdump -i eth0 -w - | wireshark -k -i -

# Named Pipe
mkfifo /tmp/capture
tcpdump -i eth0 -w /tmp/capture &
wireshark -k -i /tmp/capture

Nützliche Aliase

# In ~/.bashrc
alias tcpdump80='tcpdump -i any -nn port 80'
alias tcpdump443='tcpdump -i any -nn port 443'
alias tcpdumpdns='tcpdump -i any -nn port 53'
alias tcpdumpicmp='tcpdump -i any -nn icmp'

Berechtigungen

# Ohne Root
sudo setcap cap_net_raw,cap_net_admin=eip /usr/sbin/tcpdump

# Oder Gruppe
groupadd pcap
chgrp pcap /usr/sbin/tcpdump
chmod 750 /usr/sbin/tcpdump
setcap cap_net_raw,cap_net_admin=eip /usr/sbin/tcpdump
usermod -aG pcap username

Zusammenfassung

OptionBeschreibung
-iInterface
-nKeine DNS-Auflösung
-nnKeine Port-Namen
-v/-vv/-vvvVerbose
-cPaket-Limit
-wIn Datei schreiben
-rAus Datei lesen
-AASCII-Ausgabe
-XHex + ASCII
-sSnaplen
FilterBeispiel
hosthost 192.168.1.1
netnet 192.168.0.0/16
portport 80
src/dstsrc host 1.2.3.4
tcp/udp/icmptcp port 443
and/or/notport 80 or port 443
TCP-FlagFilter
SYNtcp-syn
ACKtcp-ack
FINtcp-fin
RSTtcp-rst
PSHtcp-push

Fazit

tcpdump ist unverzichtbar für Netzwerk-Analyse. Die Filter-Syntax ist mächtig aber komplex. Für GUI-Analyse eignet sich Wireshark. Captures sollten möglichst gefiltert sein. Bei Performance-Problemen Buffer erhöhen und Snaplen reduzieren.