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 --versionGrundlagen
Einfache Captures
# Alle Pakete auf Standard-Interface
tcpdump
# Bestimmtes Interface
tcpdump -i eth0
# Alle Interfaces
tcpdump -i any
# Verfügbare Interfaces
tcpdump -DAusgabe-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ängeFilter-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/24Port-basiert
# Bestimmter Port
tcpdump port 80
# Quell-Port
tcpdump src port 443
# Ziel-Port
tcpdump dst port 22
# Port-Range
tcpdump portrange 8000-9000Protokoll-basiert
# TCP
tcpdump tcp
# UDP
tcpdump udp
# ICMP
tcpdump icmp
# ARP
tcpdump arpKombinierte 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 -XXAnzahl 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 PaketDatei-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 100Aus Datei lesen
# Capture lesen
tcpdump -r capture.pcap
# Mit Filter
tcpdump -r capture.pcap port 80
# Verbose
tcpdump -r capture.pcap -vvvTCP-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.pcapSlow-Connections finden
# Retransmissions
tcpdump 'tcp[tcpflags] & tcp-syn != 0' -w syn.pcapPerformance-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 0Remote-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/captureNü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 usernameZusammenfassung
| 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.