← retour aux snippets

tcpdump: capture ciblée avec rotation

Capturer le trafic avec filtres BPF, ring buffer, sans DNS, et lecture rapide.


objectif

Diagnostiquer un problème réseau en capturant uniquement ce qui concerne, avec rotation de fichiers pour ne pas saturer le disque, et filtres BPF précis pour réduire le bruit.

code minimal

# capture ciblée 443, sans DNS, rotation 5x50MB
sudo tcpdump -i any -nn -U -s 96 \
  -C 50 -W 5 -w /tmp/data.pm.pcap \
  '((host data.pm or host api.data.pm) and tcp port 443) and not tcp port 22'

utilisation

# lister les interfaces capturables
sudo tcpdump -D

# choisir l'interface par défaut (Linux) puis capturer dessus
IFACE="$(ip route get 1.1.1.1 2>/dev/null | awk "/dev/ {for(i=1;i<=NF;i++) if(\$i==\"dev\") {print \$(i+1); exit}}")"
sudo tcpdump -i "${IFACE:-any}" -nn -U -s 96 -C 50 -W 5 -w /var/log/data.pm/data.pm.pcap \
  '((host data.pm or host api.data.pm) and tcp port 443) and not tcp port 22'

# rotation par temps: un fichier toutes les 5 min, nom horodaté (UTC)
sudo tcpdump -i any -nn -U -s 96 \
  -G 300 -w '/var/log/data.pm/cap-%Y%m%dT%H%M%SZ.pcap' \
  '((host data.pm or host api.data.pm) and tcp port 443) and not tcp port 22' &
# arrêter plus tard:
sudo pkill -f 'tcpdump -i any -nn -U -s 96 -G 300'

# lecture rapide (sans résolution)
tcpdump -r /var/log/data.pm/cap-*.pcap -nn -tttt | head -n 30

# extraire seulement les SYN/FIN/RST (handshake et terminaisons)
tcpdump -r /var/log/data.pm/cap-*.pcap -nn \
  'tcp[tcpflags] & (tcp-syn|tcp-fin|tcp-rst) != 0' | head

# résumer les IP/ports les plus actifs (tshark si disponible)
tshark -r /var/log/data.pm/cap-*.pcap -q -z conv,tcp | sed -n '1,80p'

variante(s) utile(s)

# full packets (pour analyse approfondie) -> augmente la taille
sudo tcpdump -i any -nn -U -s 0 -C 200 -W 5 -w /var/log/data.pm/full.pcap \
  '((host data.pm or host api.data.pm) and tcp port 443) and not tcp port 22'

# compresser en flux pour économiser le disque
sudo tcpdump -i any -nn -U -s 96 -w - \
  '((host data.pm or host api.data.pm) and tcp port 443) and not tcp port 22' \
  | zstd -T0 -q > /var/log/data.pm/data.pm.pcap.zst

# capturer HTTPS et HTTP
sudo tcpdump -i any -nn -U -s 96 -C 50 -W 5 -w /var/log/data.pm/data.pm.pcap \
  '((host data.pm or host api.data.pm) and (tcp port 443 or tcp port 80)) and not tcp port 22'

# macOS: interface typique en0 (Wi-Fi) ou utun* (VPN)
sudo tcpdump -i en0 -nn -U -s 96 -G 300 -w 'cap-%Y%m%dT%H%M%SZ.pcap' \
  '((host data.pm or host api.data.pm) and tcp port 443)'

# dumpcap (plus sûr, setcap possible, ring buffer intégré)
# garder 10 fichiers de 50MB, interface auto
sudo dumpcap -i any -b filesize:50 -b files:10 -w /var/log/data.pm/ring.pcap \
  -f '((host data.pm or host api.data.pm) and tcp port 443) and not tcp port 22'

# filtrer un subnet interne (ex: 10.0.0.0/24 vers api.data.pm)
sudo tcpdump -i any -nn -U -s 96 -C 50 -W 5 -w /var/log/data.pm/api-internal.pcap \
  '(src net 10.0.0.0/24 and host api.data.pm and tcp port 443) and not tcp port 22'

notes

  • -nn désactive toute résolution de noms (plus rapide et déterministe). -U force l’écriture bufferisée par paquet (utile pour lire pendant la capture).
  • limitez la taille (-C, MB) ou le temps (-G, secondes) et fixez -W pour éviter de remplir le disque.
  • réduisez la charge avec un snaplen adapté (-s 96) si les payloads ne sont pas nécessaires; mettez -s 0 pour tout capturer.
  • ajoutez not tcp port 22 pour éviter de capturer votre propre SSH si vous êtes connecté à la machine.
  • tcpdump résout les noms utilisés dans le filtre au démarrage (ex: host data.pm), même avec -n. Pour une IP spécifique, remplacez par host 203.0.113.42.
  • pour des environnements multi-utilisateurs, préférez dumpcap (capabilities limitées) et des dossiers dédiés (/var/log/data.pm) avec permissions strictes.