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

| Flag | Bedeutung | |------|-----------| | S | SYN (Verbindungsaufbau) | | . | ACK | | F | FIN (Verbindungsende) | | R | RST (Reset) | | P | PSH (Push) | | U | URG (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

| Option | Beschreibung | |--------|--------------| | -i | Interface | | -n | Keine DNS-Auflösung | | -nn | Keine Port-Namen | | -v/-vv/-vvv | Verbose | | -c | Paket-Limit | | -w | In Datei schreiben | | -r | Aus Datei lesen | | -A | ASCII-Ausgabe | | -X | Hex + ASCII | | -s | Snaplen |

| Filter | Beispiel | |--------|----------| | host | host 192.168.1.1 | | net | net 192.168.0.0/16 | | port | port 80 | | src/dst | src host 1.2.3.4 | | tcp/udp/icmp | tcp port 443 | | and/or/not | port 80 or port 443 |

| TCP-Flag | Filter | |----------|--------| | SYN | tcp-syn | | ACK | tcp-ack | | FIN | tcp-fin | | RST | tcp-rst | | PSH | tcp-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.