Aller au contenu
Sécurité high

TCPDump : capturer et analyser le trafic réseau

30 min de lecture

logo tcpdump

Votre serveur est lent, mais vous ne savez pas pourquoi. Vos utilisateurs signalent des déconnexions aléatoires. Ou pire : vous suspectez une intrusion, mais vous n’avez aucune preuve. Comment voir ce qui transite réellement sur votre réseau ?

TCPDump est la réponse. Cet outil en ligne de commande capture et affiche les paquets réseau en temps réel, comme un stéthoscope pour votre infrastructure. En 10 minutes, vous saurez capturer du trafic, filtrer les données pertinentes, et identifier des comportements suspects.

Ce guide vous accompagne pas à pas : installation, premières captures, filtres essentiels, et cas d’usage en sécurité. Aucune connaissance préalable en analyse réseau n’est requise.

À la fin de ce guide, vous saurez :

  • Installer TCPDump sur Linux et macOS
  • Capturer le trafic d’une interface réseau spécifique
  • Filtrer les paquets par adresse IP, port, protocole
  • Sauvegarder et relire des captures pour analyse ultérieure
  • Détecter des menaces : scans de ports, attaques DoS, tentatives SSH
  • Exporter vers Wireshark pour une analyse graphique approfondie

Qu’est-ce que TCPDump ? (et pourquoi c’est indispensable)

Section intitulée « Qu’est-ce que TCPDump ? (et pourquoi c’est indispensable) »

Quand quelque chose ne va pas sur un réseau, les logs applicatifs ne suffisent pas toujours. Ils vous disent ce que l’application a fait, mais pas ce qui s’est passé sur le câble. Exemples de situations où les logs sont muets :

ProblèmeCe que les logs disentCe que TCPDump révèle
Connexion lente”Timeout après 30s”Le serveur met 5s à répondre au SYN
Échec d’authentification”Invalid credentials”Les paquets n’arrivent même pas au serveur
Service inaccessible”Connection refused”Un pare-feu bloque le trafic en amont
Fuite de donnéesRien du toutTrafic sortant suspect vers une IP inconnue

TCPDump vous donne la vérité brute : ce qui entre et sort réellement de votre machine, paquet par paquet.

Quand une machine envoie ou reçoit des données sur le réseau, elles transitent sous forme de paquets. Chaque paquet contient :

  • L’en-tête : adresses IP source/destination, port, protocole, flags TCP
  • La charge utile (payload) : les données réelles (requête HTTP, contenu de fichier…)

Normalement, une interface réseau ne traite que les paquets qui lui sont destinés. TCPDump met l’interface en mode promiscuous (promiscuité), ce qui lui permet de capturer tout le trafic qui passe, y compris celui destiné à d’autres machines (sur un réseau non commuté).

Flux de capture TCPDump : les paquets réseau sont capturés, filtrés par BPF, puis affichés ou sauvegardés en .pcap

Les deux outils lisent le même format de fichier (.pcap), mais ont des usages différents :

CritèreTCPDumpWireshark
InterfaceLigne de commandeGraphique
RessourcesLéger (~500 KB)Lourd (~100 MB)
DisponibilitéPré-installé sur LinuxÀ installer
Usage serveur✅ Idéal (pas de GUI)❌ Nécessite un bureau
Analyse approfondieBasiqueTrès avancée
Automatisation✅ Scripts bash❌ Manuel

Workflow recommandé : Capturez avec TCPDump sur le serveur, puis analysez le fichier .pcap avec Wireshark sur votre poste.

Sur la plupart des distributions Linux, TCPDump est pré-installé. Vérifiez avec :

Fenêtre de terminal
tcpdump --version

Résultat attendu :

tcpdump version 4.99.4
libpcap version 1.10.4 (with TPACKET_V3)

Si vous voyez command not found, passez à l’installation.

Fenêtre de terminal
sudo apt update
sudo apt install tcpdump

Vérification :

Fenêtre de terminal
tcpdump --version

Avant de capturer, identifiez l’interface à surveiller :

Fenêtre de terminal
tcpdump -D

Exemple de sortie :

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

Explications :

InterfaceDescription
eth0 / enp0s3Interface Ethernet principale
anyCapture sur toutes les interfaces
loLoopback (trafic local, 127.0.0.1)
docker0Bridge Docker
wlan0 / wlo1Interface Wi-Fi

Capturer tout le trafic (déconseillé en production)

Section intitulée « Capturer tout le trafic (déconseillé en production) »

La commande la plus simple :

Fenêtre de terminal
sudo tcpdump -i eth0

Pourquoi sudo ? La capture de paquets nécessite des privilèges root pour mettre l’interface en mode promiscuous.

Sortie (défile rapidement) :

15:42:01.234567 IP 192.168.1.100.22 > 192.168.1.50.51234: Flags [P.], seq 1:37, ack 1, win 501, length 36
15:42:01.234890 IP 192.168.1.50.51234 > 192.168.1.100.22: Flags [.], ack 37, win 502, length 0
15:42:01.235123 IP 192.168.1.100.22 > 192.168.1.50.51234: Flags [P.], seq 37:101, ack 1, win 501, length 64

Arrêter la capture : Ctrl + C

La sortie de TCPDump peut sembler cryptique au premier abord, mais chaque élément a une signification précise. Apprendre à lire cette sortie vous permettra de diagnostiquer rapidement des problèmes réseau ou de repérer des comportements anormaux.

Décortiquons une ligne typique :

15:42:01.234567 IP 192.168.1.100.22 > 192.168.1.50.51234: Flags [P.], seq 1:37, ack 1, win 501, length 36

Cette ligne nous indique qu’à 15h42, une machine (192.168.1.100) envoie 36 octets de données depuis son port 22 (SSH) vers une autre machine. Le flag [P.] signifie que les données doivent être transmises immédiatement (PUSH) et que le paquet précédent a été reçu (ACK).

ÉlémentSignification
15:42:01.234567Horodatage (heure:minute:seconde.microsecondes)
IPProtocole de couche réseau
192.168.1.100.22IP source + port source (22 = SSH)
>Direction (source → destination)
192.168.1.50.51234IP destination + port destination
Flags [P.]Flags TCP : P = PUSH, . = ACK
seq 1:37Numéros de séquence (37 octets de données)
ack 1Numéro d’acquittement
win 501Taille de fenêtre TCP
length 36Taille des données

Les flags TCP sont des indicateurs binaires dans l’en-tête de chaque paquet. Ils orchestrent le cycle de vie d’une connexion : ouverture, transmission, fermeture. Comprendre ces flags est crucial pour diagnostiquer des problèmes de connectivité ou détecter des attaques.

Par exemple, si vous voyez beaucoup de paquets [R] (RST), cela signifie que des connexions sont brutalement interrompues — peut-être un pare-feu qui bloque, ou un service qui refuse les connexions. Si vous voyez des [S] sans réponse [S.], le serveur distant ne répond pas.

FlagSymboleSignification
SYN[S]Demande d’ouverture de connexion
ACK[.]Accusé de réception
FIN[F]Demande de fermeture
RST[R]Reset (fermeture brutale)
PUSH[P]Données à transmettre immédiatement
SYN-ACK[S.]Réponse à un SYN (2ème étape handshake)

Exemple de handshake TCP (connexion normale) :

Handshake TCP en 3 étapes : SYN, SYN-ACK, ACK pour établir une connexion

TCPDump dispose de dizaines d’options, mais une poignée couvre 90% des besoins. Cette section présente les options que vous utiliserez quotidiennement, organisées par cas d’usage.

Par défaut, TCPDump affiche un résumé minimaliste de chaque paquet. Pour investiguer un problème, vous aurez souvent besoin de plus d’informations : TTL (durée de vie du paquet), options TCP, checksums… Les options de verbosité vous permettent de choisir le niveau de détail adapté à votre analyse.

OptionEffetExemple
-vVerbeux (TTL, checksum, ID)tcpdump -v -i eth0
-vvTrès verbeux (options TCP complètes)tcpdump -vv -i eth0
-vvvMaximum de détailstcpdump -vvv -i eth0
-qMode silencieux (moins de détails)tcpdump -q -i eth0

Sur un serveur en production, le trafic peut atteindre des milliers de paquets par seconde. Sans limitation, votre capture devient inexploitable — fichiers de plusieurs gigaoctets, terminal qui défile trop vite pour être lu. Ces options vous permettent de contrôler le volume de données capturées.

OptionEffetExemple
-c NArrêter après N paquetstcpdump -c 100 -i eth0
-s NCapturer N octets par paquet (0 = tout)tcpdump -s 0 -i eth0

Astuce : Par défaut, TCPDump capture seulement les 262144 premiers octets de chaque paquet. Pour capturer le contenu complet (utile pour l’analyse HTTP) :

Fenêtre de terminal
sudo tcpdump -s 0 -i eth0

Jusqu’ici, nous n’avons vu que les en-têtes des paquets (IP source, destination, port…). Mais parfois, vous avez besoin de voir le contenu : une requête HTTP mal formée, des credentials envoyés en clair, ou le payload d’une attaque. Ces options affichent les données transportées dans chaque paquet.

OptionEffetUtilité
-XHexadécimal + ASCIIVoir le contenu brut
-AASCII uniquementLire les requêtes HTTP
-xxInclut les en-têtes EthernetAnalyse bas niveau

Exemple : voir une requête HTTP en clair :

Fenêtre de terminal
sudo tcpdump -A -i eth0 port 80

Sortie :

GET /index.html HTTP/1.1
Host: example.com
User-Agent: curl/7.68.0
Accept: */*

Par défaut, TCPDump tente de résoudre les adresses IP en noms DNS, ce qui ralentit l’affichage :

Fenêtre de terminal
# Avec résolution (lent)
sudo tcpdump -i eth0
# Sans résolution (rapide)
sudo tcpdump -n -i eth0
# Sans résolution IP ni port (très rapide)
sudo tcpdump -nn -i eth0

Recommandation : utilisez toujours -nn pour des captures en temps réel.

Les filtres sont la vraie puissance de TCPDump. Sans filtre, vous êtes noyé sous les données. Avec les bons filtres, vous ciblez exactement ce que vous cherchez.

Le filtre le plus courant : isoler le trafic d’une machine spécifique. Utile pour suivre les communications d’un serveur suspect, analyser les échanges avec un client particulier, ou exclure le bruit du trafic général.

Fenêtre de terminal
# Tout le trafic vers/depuis une IP
sudo tcpdump -nn -i eth0 host 192.168.1.100
# Uniquement le trafic DEPUIS cette IP
sudo tcpdump -nn -i eth0 src 192.168.1.100
# Uniquement le trafic VERS cette IP
sudo tcpdump -nn -i eth0 dst 192.168.1.100
# Trafic d'un sous-réseau entier
sudo tcpdump -nn -i eth0 net 192.168.1.0/24

Filtrer par port permet d’isoler un service spécifique : le trafic web (80/443), SSH (22), DNS (53), bases de données (3306, 5432)… C’est particulièrement utile quand vous débuggez un service précis sans être parasité par le reste du trafic.

Fenêtre de terminal
# Tout le trafic sur le port 80 (HTTP)
sudo tcpdump -nn -i eth0 port 80
# Ports source ou destination spécifiques
sudo tcpdump -nn -i eth0 src port 22
sudo tcpdump -nn -i eth0 dst port 443
# Plage de ports
sudo tcpdump -nn -i eth0 portrange 8000-8080

Chaque protocole a ses caractéristiques : TCP pour les connexions fiables (HTTP, SSH), UDP pour le temps réel (DNS, VoIP), ICMP pour le diagnostic (ping, traceroute), ARP pour la résolution d’adresses. Filtrer par protocole vous permet de cibler la couche réseau pertinente pour votre analyse.

Fenêtre de terminal
# Uniquement TCP
sudo tcpdump -nn -i eth0 tcp
# Uniquement UDP
sudo tcpdump -nn -i eth0 udp
# Uniquement ICMP (ping)
sudo tcpdump -nn -i eth0 icmp
# Uniquement ARP
sudo tcpdump -nn -i eth0 arp

La vraie puissance des filtres BPF vient de leur combinaison. Avec les opérateurs logiques and, or, et not, vous pouvez construire des requêtes précises : “le trafic HTTP depuis cette IP”, “tout sauf mon trafic SSH”, “les connexions vers les ports 80 ou 443 depuis ce sous-réseau”. Plus votre filtre est précis, moins vous avez de bruit à trier.

Fenêtre de terminal
# Trafic HTTP depuis une IP spécifique
sudo tcpdump -nn -i eth0 src 192.168.1.100 and port 80
# Trafic SSH ou HTTPS
sudo tcpdump -nn -i eth0 port 22 or port 443
# Tout sauf le trafic SSH (exclure votre propre connexion)
sudo tcpdump -nn -i eth0 not port 22
# Combinaison complexe avec parenthèses
sudo tcpdump -nn -i eth0 'host 192.168.1.100 and (port 80 or port 443)'

Les filtres sur les flags TCP sont essentiels pour la sécurité. En ciblant les paquets SYN (début de connexion), vous pouvez détecter des scans de ports. En surveillant les RST, vous identifiez les connexions refusées. Cette syntaxe utilise la notation d’accès aux octets (tcp[13]) pour lire directement le byte des flags dans l’en-tête TCP.

Fenêtre de terminal
# Paquets SYN (début de connexion)
sudo tcpdump -nn -i eth0 'tcp[tcpflags] & tcp-syn != 0'
# Paquets SYN sans ACK (première étape du handshake)
sudo tcpdump -nn -i eth0 'tcp[13] == 2'
# Paquets RST (connexions refusées/interrompues)
sudo tcpdump -nn -i eth0 'tcp[tcpflags] & tcp-rst != 0'
# Paquets FIN (fermetures normales)
sudo tcpdump -nn -i eth0 'tcp[tcpflags] & tcp-fin != 0'

Explication : tcp[13] représente l’octet 13 de l’en-tête TCP (les flags). La valeur 2 correspond à SYN seul.

La capture en direct est utile pour le diagnostic immédiat, mais pour une analyse approfondie ou pour partager avec un collègue, vous aurez besoin d’un fichier. Le format PCAP (Packet Capture) est le standard de l’industrie : Wireshark, tshark, Zeek, Suricata — tous les outils le lisent. Sauvegarder une capture vous permet aussi de rejouer une situation problématique autant de fois que nécessaire.

Fenêtre de terminal
# Sauvegarder la capture
sudo tcpdump -nn -i eth0 -w capture.pcap
# Avec un filtre (ne sauvegarder que le trafic HTTP)
sudo tcpdump -nn -i eth0 port 80 -w http_traffic.pcap
# Limiter la taille du fichier (100 paquets max)
sudo tcpdump -nn -i eth0 -c 100 -w short_capture.pcap

Le fichier .pcap est au format standard PCAP (Packet Capture), lisible par tous les outils d’analyse réseau : Wireshark, tshark, NetworkMiner…

Une fois le fichier PCAP créé, vous pouvez le relire autant de fois que nécessaire, appliquer différents filtres, ou l’ouvrir dans Wireshark pour une analyse graphique. C’est aussi utile pour partager une capture avec un collègue qui n’a pas accès au serveur, ou pour documenter un incident de sécurité.

Fenêtre de terminal
# Lire et afficher tout le contenu
tcpdump -nn -r capture.pcap
# Appliquer un filtre sur le fichier existant
tcpdump -nn -r capture.pcap port 443
# Afficher avec les données ASCII
tcpdump -A -r capture.pcap

Pas besoin de sudo pour lire un fichier — seulement pour capturer en direct.

Sur un serveur de production, capturer pendant plusieurs heures peut générer des fichiers de dizaines de gigaoctets — impossible à analyser, et risque de saturer le disque. La rotation automatique résout ce problème : TCPDump crée un nouveau fichier à intervalles réguliers (par taille ou par temps), et peut même supprimer automatiquement les plus anciens. C’est essentiel pour la surveillance continue ou la capture d’incidents rares.

Fenêtre de terminal
# Nouveau fichier tous les 100 Mo (-C 100)
sudo tcpdump -nn -i eth0 -w capture.pcap -C 100
# Garder seulement les 5 derniers fichiers (-W 5)
sudo tcpdump -nn -i eth0 -w capture.pcap -C 100 -W 5
# Nouveau fichier toutes les 60 secondes (-G 60)
sudo tcpdump -nn -i eth0 -w 'capture_%Y%m%d_%H%M%S.pcap' -G 60

Résultat avec -G 60 :

capture_20260112_154200.pcap
capture_20260112_154300.pcap
capture_20260112_154400.pcap

TCPDump est un outil précieux pour la détection d’intrusions. Voici les scénarios les plus courants.

Un scan de port se caractérise par de nombreux paquets SYN vers différents ports depuis une même IP :

Détection d'un scan de ports : plusieurs paquets SYN vers des ports différents en quelques millisecondes

Fenêtre de terminal
# Capturer les paquets SYN sur les ports privilégiés (1-1024)
sudo tcpdump -nn -i eth0 'tcp[13] == 2 and portrange 1-1024'

Signe d’un scan : Si vous voyez des dizaines de paquets SYN vers des ports différents en quelques secondes, c’est probablement un scan.

Les attaques par dictionnaire sur SSH génèrent beaucoup de connexions sur le port 22 :

Fenêtre de terminal
# Capturer les tentatives de connexion SSH (SYN vers port 22)
sudo tcpdump -nn -i eth0 'dst port 22 and tcp[13] == 2'

Signe d’attaque : Plus de 10 connexions par minute depuis une même IP.

Script de comptage :

Fenêtre de terminal
# Compter les tentatives par IP source
sudo tcpdump -nn -i eth0 -c 1000 'dst port 22 and tcp[13] == 2' 2>/dev/null | \
awk '{print $3}' | cut -d. -f1-4 | sort | uniq -c | sort -rn

Sortie :

847 10.0.0.50
12 192.168.1.25
3 192.168.1.1

→ L’IP 10.0.0.50 a tenté 847 connexions : c’est une attaque brute-force.

Fenêtre de terminal
# Capturer le trafic ICMP
sudo tcpdump -nn -i eth0 icmp

Signe d’attaque : Volume anormal de paquets ICMP Echo Request (type 8).

Compter les pings par seconde :

Fenêtre de terminal
sudo tcpdump -nn -i eth0 'icmp[icmptype] == 8' 2>/dev/null | \
pv -l -i 1 -r > /dev/null

Surveiller le trafic DNS (exfiltration, tunneling)

Section intitulée « Surveiller le trafic DNS (exfiltration, tunneling) »

Le DNS (port 53) est souvent utilisé pour l’exfiltration de données car il est rarement bloqué :

Fenêtre de terminal
# Tout le trafic DNS
sudo tcpdump -nn -i eth0 port 53
# Voir le contenu des requêtes DNS
sudo tcpdump -nn -i eth0 -A port 53

Signes suspects :

  • Requêtes vers des domaines inhabituels
  • Sous-domaines très longs (encodage de données)
  • Volume anormal de requêtes DNS

Exemple de DNS tunneling (exfiltration de données) :

bXlzZWNyZXRkYXRh.evil-domain.com # Données encodées en base64 dans le sous-domaine

Vérifiez si une machine compromise communique vers l’extérieur :

Fenêtre de terminal
# Connexions sortantes vers des ports inhabituels
sudo tcpdump -nn -i eth0 'src net 192.168.1.0/24 and dst port 4444'
# Trafic sortant non HTTP/HTTPS
sudo tcpdump -nn -i eth0 'src net 192.168.1.0/24 and not (dst port 80 or dst port 443 or dst port 53)'

Le port 4444 est souvent utilisé par des outils de post-exploitation (Metasploit, reverse shells).

Voici des commandes TCPDump prêtes à copier-coller pour les situations les plus courantes. Chaque exemple résout un problème concret que vous rencontrerez en production.

Un utilisateur signale qu’une page ne se charge pas. Cette commande vous montre exactement ce que le serveur reçoit et renvoie — requête HTTP, headers, éventuelles erreurs.

Fenêtre de terminal
# Voir les requêtes HTTP vers un serveur spécifique
sudo tcpdump -nn -A -i eth0 'host example.com and port 80'

Débugger le réseau d’un conteneur Docker peut être frustrant car le trafic passe par des interfaces virtuelles. Cette approche capture le trafic sur le bridge Docker pour voir les communications entre conteneurs ou vers l’extérieur.

Fenêtre de terminal
# Trouver l'interface du conteneur
docker inspect -f '{{.NetworkSettings.Networks.bridge.NetworkID}}' mon_conteneur
# Capturer sur le bridge Docker
sudo tcpdump -nn -i docker0 'host 172.17.0.2'

Pour une analyse approfondie avec décodage complet des protocoles, filtres avancés et visualisation graphique, exportez votre capture vers Wireshark. L’option -s 0 garantit que tout le contenu des paquets est capturé, pas seulement les en-têtes.

Fenêtre de terminal
# Capture complète (tous les octets, toutes les interfaces pertinentes)
sudo tcpdump -nn -s 0 -i eth0 -w analyse_complete.pcap
# Puis ouvrir dans Wireshark
wireshark analyse_complete.pcap

Quand vous cherchez pourquoi des connexions échouent, filtrez directement sur les paquets d’erreur. Les RST indiquent des connexions refusées ou interrompues ; les ICMP type 3 signalent des destinations inaccessibles (port fermé, hôte down, réseau injoignable).

Fenêtre de terminal
# Paquets RST (connexions refusées)
sudo tcpdump -nn -i eth0 'tcp[tcpflags] & tcp-rst != 0'
# ICMP "destination unreachable"
sudo tcpdump -nn -i eth0 'icmp[icmptype] == 3'

”permission denied” ou “Operation not permitted”

Section intitulée « ”permission denied” ou “Operation not permitted” »

Cause : Vous n’avez pas les droits root.

Solution :

Fenêtre de terminal
# Utiliser sudo
sudo tcpdump -i eth0
# Ou ajouter la capability (permanent)
sudo setcap cap_net_raw,cap_net_admin=eip /usr/bin/tcpdump

Cause : L’interface n’existe pas ou est mal orthographiée.

Solution :

Fenêtre de terminal
# Lister les interfaces disponibles
tcpdump -D
# Vérifier le nom exact
ip link show

Causes possibles :

  1. Pas de trafic sur cette interface → essayez any
  2. Filtre trop restrictif → simplifiez-le
  3. Firewall bloque en amont → vérifiez avec iptables -L

Debug :

Fenêtre de terminal
# Capturer sans filtre d'abord
sudo tcpdump -nn -i any -c 10

Solution : Utilisez la rotation automatique :

Fenêtre de terminal
# Max 50 Mo par fichier, 10 fichiers max
sudo tcpdump -nn -i eth0 -w capture.pcap -C 50 -W 10
  1. TCPDump = stéthoscope réseau — Capture et affiche les paquets en temps réel pour diagnostiquer ou sécuriser.

  2. Toujours utiliser -nn — Désactive la résolution DNS pour des captures rapides et lisibles.

  3. Les filtres BPF sont essentiels — Sans filtre, vous êtes noyé. Avec host, port, tcp, and, or, vous ciblez précisément.

  4. Sauvegarder en .pcap — Capturez avec -w, analysez avec -r ou Wireshark. Le fichier est la preuve.

  5. Les flags TCP racontent l’histoire[S] = début, [.] = OK, [R] = problème, [F] = fin.

  6. Pour la sécurité : surveillez les SYNtcp[13] == 2 capture les débuts de connexion, révélant scans et attaques.

  • TCPDump installé (tcpdump --version)
  • Interfaces listées (tcpdump -D)
  • Interface principale identifiée (eth0, enp0s3…)
  • Première capture réussie (sudo tcpdump -nn -c 10 -i eth0)
  • Sauvegarde en fichier testée (-w capture.pcap)
  • Relecture de fichier testée (tcpdump -r capture.pcap)
  • Filtre par IP (host, src, dst)
  • Filtre par port (port, portrange)
  • Filtre par protocole (tcp, udp, icmp)
  • Combinaisons (and, or, not)
  • Détection de scan de ports testée
  • Surveillance SSH configurée
  • Rotation des fichiers activée pour captures longues