Lorsque des problemes reseau surviennent — connexions qui expirent, services inaccessibles ou motifs de trafic inattendus — vous devez voir ce qui se passe reellement sur le fil. tcpdump est l’outil standard de capture de paquets en ligne de commande sous Linux, installe sur pratiquement tous les serveurs et capable d’intercepter, filtrer et enregistrer le trafic reseau au niveau du paquet. C’est le moyen le plus rapide de diagnostiquer les problemes reseau directement sur un serveur de production.

Ce guide couvre l’utilisation pratique de tcpdump, des captures basiques au filtrage avance, l’analyse de protocoles et l’integration avec Wireshark pour une inspection visuelle.

Prerequis

Avant de commencer, assurez-vous d’avoir :

  • Un systeme Linux (Ubuntu, Debian, RHEL/CentOS, Fedora ou similaire)
  • Un acces terminal avec des privileges sudo (tcpdump necessite root pour la capture de paquets)
  • Une comprehension basique du reseau TCP/IP (adresses IP, ports, TCP vs UDP)

Installation de tcpdump

tcpdump est pre-installe sur la plupart des distributions Linux. Verifiez ou installez-le :

# Debian/Ubuntu
sudo apt update && sudo apt install tcpdump

# RHEL/Fedora/CentOS
sudo dnf install tcpdump

# Verify installation
tcpdump --version

Identification des Interfaces Reseau

Avant de capturer, identifiez quelle interface transporte le trafic que vous souhaitez inspecter :

# List all interfaces tcpdump can capture on
sudo tcpdump -D

# Or use ip to show interfaces
ip link show

Sortie typique :

1.eth0 [Up, Running, Connected]
2.lo [Up, Running, Loopback]
3.docker0 [Up, Running, Connected]
4.any (Pseudo-device that captures on all interfaces) [Up, Running]

Utilisez any pour capturer sur toutes les interfaces simultanement, ou specifiez une seule interface pour une sortie plus propre.

Capture Basique

Capturer Tout le Trafic sur une Interface

sudo tcpdump -i eth0

Cela affiche chaque paquet en temps reel. Appuyez sur Ctrl+C pour arreter. La sortie montre une ligne par paquet :

14:23:45.123456 IP 10.0.1.5.22 > 10.0.1.1.54321: Flags [P.], seq 1:53, ack 1, win 502, length 52

Champs : horodatage, protocole, IP source.port, IP destination.port, drapeaux TCP, numeros de sequence/acquittement, taille de fenetre et longueur de charge utile.

Limiter le Nombre de Paquets

# Stop after capturing 50 packets
sudo tcpdump -i eth0 -c 50

Sortie Detaillee

# More detail (TTL, IP options, checksum)
sudo tcpdump -i eth0 -v

# Even more detail
sudo tcpdump -i eth0 -vv

# Maximum verbosity
sudo tcpdump -i eth0 -vvv

Afficher les Adresses IP au Lieu des Noms d’Hotes

# Don't resolve hostnames (faster output)
sudo tcpdump -i eth0 -n

# Don't resolve hostnames or port names
sudo tcpdump -i eth0 -nn

Astuce : Utilisez toujours -nn en production. La resolution DNS pour chaque paquet ralentit la capture et peut generer du trafic supplementaire.

Filtres de Capture

Les filtres sont la fonctionnalite la plus importante de tcpdump. Ils utilisent la syntaxe BPF (Berkeley Packet Filter) et sont appliques pendant la capture, reduisant le bruit avant qu’il n’atteigne votre ecran.

Filtrer par Hote

# Traffic to or from a specific IP
sudo tcpdump -i eth0 host 10.0.1.5

# Only traffic FROM a specific IP
sudo tcpdump -i eth0 src host 10.0.1.5

# Only traffic TO a specific IP
sudo tcpdump -i eth0 dst host 10.0.1.5

Filtrer par Port

# HTTP traffic
sudo tcpdump -i eth0 port 80

# HTTPS traffic
sudo tcpdump -i eth0 port 443

# SSH traffic
sudo tcpdump -i eth0 port 22

# DNS traffic
sudo tcpdump -i eth0 port 53

# Source port only
sudo tcpdump -i eth0 src port 443

# Destination port only
sudo tcpdump -i eth0 dst port 8080

Filtrer par Protocole

# Only TCP packets
sudo tcpdump -i eth0 tcp

# Only UDP packets
sudo tcpdump -i eth0 udp

# Only ICMP (ping) packets
sudo tcpdump -i eth0 icmp

# Only ARP packets
sudo tcpdump -i eth0 arp

Filtrer par Reseau (Sous-reseau)

# All traffic to or from a subnet
sudo tcpdump -i eth0 net 10.0.1.0/24

# Traffic between two subnets
sudo tcpdump -i eth0 src net 10.0.1.0/24 and dst net 10.0.2.0/24

Combinaison de Filtres

Utilisez and, or et not (ou &&, ||, !) pour combiner les conditions :

# HTTPS traffic to a specific host
sudo tcpdump -i eth0 host 10.0.1.5 and port 443

# HTTP or HTTPS traffic
sudo tcpdump -i eth0 port 80 or port 443

# All traffic except SSH
sudo tcpdump -i eth0 not port 22

# Complex filter: HTTP traffic from one host, excluding a specific IP
sudo tcpdump -i eth0 'src host 10.0.1.5 and port 80 and not dst host 10.0.1.1'

Plages de Ports

# Ports 8000 through 8999
sudo tcpdump -i eth0 portrange 8000-8999

Filtrer par Drapeaux TCP

# Only SYN packets (new connections)
sudo tcpdump -i eth0 'tcp[tcpflags] & (tcp-syn) != 0'

# Only SYN-ACK packets (connection responses)
sudo tcpdump -i eth0 'tcp[tcpflags] & (tcp-syn|tcp-ack) == (tcp-syn|tcp-ack)'

# Only RST packets (connection resets)
sudo tcpdump -i eth0 'tcp[tcpflags] & (tcp-rst) != 0'

# Only FIN packets (connection closures)
sudo tcpdump -i eth0 'tcp[tcpflags] & (tcp-fin) != 0'

Sauvegarde et Lecture des Fichiers de Capture

Ecrire dans un Fichier pcap

# Save all traffic to a file
sudo tcpdump -i eth0 -w /tmp/capture.pcap

# Save with a filter
sudo tcpdump -i eth0 -w /tmp/https.pcap port 443

# Rotate files every 100MB, keeping 5 files
sudo tcpdump -i eth0 -w /tmp/capture-%Y%m%d-%H%M%S.pcap -C 100 -W 5

Lire un Fichier pcap

# Read all packets from a file
tcpdump -r /tmp/capture.pcap

# Read with filters (applied on display)
tcpdump -r /tmp/capture.pcap port 443

# Read with full detail
tcpdump -r /tmp/capture.pcap -nn -vvv

Transferer vers Wireshark

Le format pcap est universel. Copiez le fichier sur votre poste de travail et ouvrez-le dans Wireshark :

# Copy from server to local machine
scp user@server:/tmp/capture.pcap ~/Desktop/

# Or capture remotely and pipe directly to Wireshark
ssh user@server 'sudo tcpdump -i eth0 -w - port 443' | wireshark -k -i -

Affichage du Contenu des Paquets

Afficher la Charge Utile en ASCII

# Print packet content in ASCII
sudo tcpdump -i eth0 -A port 80

Ceci est utile pour inspecter les requetes et reponses HTTP en texte clair.

Afficher la Charge Utile en Hexadecimal et ASCII

# Hex + ASCII dump
sudo tcpdump -i eth0 -X port 80

# Hex + ASCII with link-layer header
sudo tcpdump -i eth0 -XX port 80

Controler la Taille de Capture

# Capture only first 96 bytes (headers only)
sudo tcpdump -i eth0 -s 96

# Capture full packets (no truncation)
sudo tcpdump -i eth0 -s 0

Exemples Pratiques de Resolution de Problemes

Diagnostiquer les Problemes de Resolution DNS

# Capture all DNS traffic
sudo tcpdump -i eth0 -nn port 53

# Watch for DNS queries and responses with detail
sudo tcpdump -i eth0 -nn -vv port 53

Recherchez : les requetes sans reponses (serveur DNS inaccessible), les reponses NXDOMAIN (le nom n’existe pas) ou des temps de reponse anormalement lents.

Deboguer les Problemes de Connexion HTTP

# See TCP handshake and HTTP requests
sudo tcpdump -i eth0 -nn -A 'host example.com and port 80'

# Check if connections are being reset
sudo tcpdump -i eth0 -nn 'host example.com and tcp[tcpflags] & (tcp-rst) != 0'

Identifier les Connexions Excessives

# Count connections to port 443 per source IP
sudo tcpdump -i eth0 -nn dst port 443 -c 10000 2>/dev/null | \
  awk '{print $3}' | cut -d. -f1-4 | sort | uniq -c | sort -rn | head -20

Surveiller le Trafic de Base de Donnees

# MySQL traffic (port 3306)
sudo tcpdump -i eth0 -nn port 3306

# PostgreSQL traffic (port 5432)
sudo tcpdump -i eth0 -nn port 5432 -c 100

Verifier les Attaques SYN Flood

# Count SYN packets per second
sudo tcpdump -i eth0 -nn 'tcp[tcpflags] == tcp-syn' 2>/dev/null | \
  awk '{print substr($1,1,8)}' | uniq -c

Capturer les Problemes ICMP (Ping)

# All ICMP traffic
sudo tcpdump -i eth0 -nn icmp

# Specific: ping to a host
sudo tcpdump -i eth0 -nn 'icmp and host 10.0.1.1'

Recherchez : les reponses “unreachable”, le depassement de TTL ou les reponses echo manquantes.

Deboguer la Poignee de Main TLS/SSL

# Capture TLS Client Hello (first message of TLS handshake)
sudo tcpdump -i eth0 -nn 'tcp port 443 and (tcp[((tcp[12:1] & 0xf0) >> 2):1] = 0x16)'

Considerations de Performance

Reduire la Charge de Sortie

# Disable DNS resolution (-nn)
# Limit capture length (-s 96) if you only need headers
# Write to file (-w) instead of displaying on screen
sudo tcpdump -i eth0 -nn -s 96 -w /tmp/capture.pcap port 443

Tampon Circulaire pour les Captures Longues

# Rotate files: 10 files of 50MB each (500MB total ring buffer)
sudo tcpdump -i eth0 -w /tmp/cap.pcap -C 50 -W 10

Lorsque le fichier 10 est plein, il ecrase le fichier 1, creant un tampon circulaire qui conserve les 500 Mo de trafic les plus recents.

Options d’Horodatage

# Microsecond timestamps (default)
sudo tcpdump -i eth0 -tt

# Human-readable timestamps
sudo tcpdump -i eth0 -tttt

# Delta from previous packet
sudo tcpdump -i eth0 -ttt

Reference Rapide tcpdump

OptionDescription
-i eth0Capturer sur une interface specifique
-i anyCapturer sur toutes les interfaces
-c 100Arreter apres 100 paquets
-nNe pas resoudre les noms d’hotes
-nnNe pas resoudre les noms d’hotes ni les ports
-v / -vv / -vvvAugmenter la verbosite
-AAfficher la charge utile en ASCII
-XAfficher la charge utile en hex + ASCII
-w file.pcapEcrire les paquets dans un fichier
-r file.pcapLire les paquets depuis un fichier
-s 0Capturer les paquets complets
-s 96Capturer uniquement les en-tetes
-C 100Rotation des fichiers tous les 100 Mo
-W 5Conserver au maximum 5 fichiers en rotation
-ttHorodatages Unix absolus
-tttHorodatages delta
-ttttHorodatages lisibles par l’homme

Expressions de Filtre Courantes

FiltreCapture
host 10.0.1.5Trafic vers/depuis une IP
src host 10.0.1.5Trafic depuis une IP
dst host 10.0.1.5Trafic vers une IP
port 443Trafic sur un port
portrange 8000-9000Plage de ports
tcp / udp / icmpProtocole
net 10.0.1.0/24Sous-reseau
not port 22Exclure SSH
host A and port 80Combine
port 80 or port 443L’un ou l’autre port

Resume

tcpdump est l’outil essentiel de capture de paquets pour le depannage reseau sous Linux :

  • Utilisez toujours -nn pour desactiver la resolution DNS afin d’obtenir une sortie plus rapide et plus propre
  • Appliquez des filtres de capture pour reduire le bruit : host, port, tcp, not port 22
  • Sauvegardez les captures longues dans des fichiers pcap avec -w et analysez-les ensuite avec Wireshark
  • Utilisez -c pour limiter la taille de capture et eviter de remplir le disque
  • Combinez les filtres avec and, or, not pour une isolation precise du trafic
  • Utilisez les filtres de drapeaux TCP pour diagnostiquer les problemes de connexion (SYN floods, problemes RST)
  • Les tampons circulaires (-C + -W) permettent des captures de longue duree sur des serveurs de production
  • Transferez les fichiers pcap vers Wireshark pour une analyse visuelle detaillee des protocoles

Pour des sujets connexes, consultez nos guides sur Configurer le Pare-feu UFW sur Ubuntu Server et Renforcement SSH pour les Serveurs Linux.