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
-nnen 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
| Option | Description |
|---|---|
-i eth0 | Capturer sur une interface specifique |
-i any | Capturer sur toutes les interfaces |
-c 100 | Arreter apres 100 paquets |
-n | Ne pas resoudre les noms d’hotes |
-nn | Ne pas resoudre les noms d’hotes ni les ports |
-v / -vv / -vvv | Augmenter la verbosite |
-A | Afficher la charge utile en ASCII |
-X | Afficher la charge utile en hex + ASCII |
-w file.pcap | Ecrire les paquets dans un fichier |
-r file.pcap | Lire les paquets depuis un fichier |
-s 0 | Capturer les paquets complets |
-s 96 | Capturer uniquement les en-tetes |
-C 100 | Rotation des fichiers tous les 100 Mo |
-W 5 | Conserver au maximum 5 fichiers en rotation |
-tt | Horodatages Unix absolus |
-ttt | Horodatages delta |
-tttt | Horodatages lisibles par l’homme |
Expressions de Filtre Courantes
| Filtre | Capture |
|---|---|
host 10.0.1.5 | Trafic vers/depuis une IP |
src host 10.0.1.5 | Trafic depuis une IP |
dst host 10.0.1.5 | Trafic vers une IP |
port 443 | Trafic sur un port |
portrange 8000-9000 | Plage de ports |
tcp / udp / icmp | Protocole |
net 10.0.1.0/24 | Sous-reseau |
not port 22 | Exclure SSH |
host A and port 80 | Combine |
port 80 or port 443 | L’un ou l’autre port |
Resume
tcpdump est l’outil essentiel de capture de paquets pour le depannage reseau sous Linux :
- Utilisez toujours
-nnpour 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
-wet analysez-les ensuite avec Wireshark - Utilisez
-cpour limiter la taille de capture et eviter de remplir le disque - Combinez les filtres avec
and,or,notpour 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.