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:
# 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
# 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.