Fondamentaux de la capture de paquets sous Linux
L'utilitaire tcpdump est un analyseur de paquets en ligne de commande de référence pour les systèmes d'exploitation de type UNIX. Il permet d'intercepter et d'inspecter le trafic transitant par les interfaces réseau. Son architecture repose sur la bibliothèque libpcap. Au niveau du noyau Linux, le mécanisme de capture fonctionne en créant un socket brut (raw socket). Lorsqu'une carte réseau (NIC) reçoit une trame, le noyau duplique cette dernière et la transmet au socket d'écoute avant même que les piles protocolaires standard (comme TCP/IP) ne la traitent. Ce processus passif garantit que l'outil d'analyse n'interfère pas avec le flux de données légitime.
Préparation : Vérification des interfaces
Avant d'initier une capture, il est impératif d'identifier les interfaces réseau actives et leur état. Bien que des outils historiques existent, l'utilisation de la suite iproute2 est aujourd'hui recommandée pour obtenir des statistiques détaillées.
[admin@srv-prod ~]$ ip -s link show eth0
3: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000
link/ether 00:1a:2b:3c:4d:5e brd ff:ff:ff:ff:ff:ff
RX: bytes packets errors dropped overrun mcast
854920114 1254302 0 12 0 340
TX: bytes packets errors dropped carrier collsns
204958112 982110 0 0 0 0
- eth0 : Identifiant de l'interface réseau.
- mtu 1500 : Taille maximale de l'unité de transmission (Maximum Transmission Unit).
- RX / TX : Compteurs respectifs pour la réception et la transmission. Ils détaillent le volume en octets (bytes), le nombre de paquets (packets), ainsi que les anomalies telles que les erreurs, les pertes (dropped) ou les débordements de tampon (overrun).
Syntaxe du filtre BPF (Berkeley Packet Filter)
La puissance de l'outil réside dans son moteur de filtrage. Les expressions logiques permettent de cibler précisément le trafic d'intérêt. Ces filtres sont compilés en bytecode BPF pour une évaluation performante directement au niveau du noyau.
Primitives de qualification
- host : Cible une adresse IP ou un nom d'hôte spécifique (ex:
host 172.16.0.10). - net : Définit un sous-réseau au format CIDR (ex:
net 192.168.10.0/24). - port : Isole un port de couche transport (ex:
port 3306). - portrange : Capture une plage de ports (ex:
portrange 8000-9000).
Primitives de direction
- src : Restreint la correspondance à l'adresse source.
- dst : Restreint la correspondance à l'adresse de destination.
Primitives de protocole
Par défaut, tous les protocoles sont capturés. Il est possible de filtrer par : ip, ip6, arp, tcp, udp, icmp, ou vlan.
Opérateurs logiques
Les expressions peuvent être combinées en utilisant les opérateurs booléens suivants : and (ou &&), or (ou ||), et not (ou !). Les parenthèses doivent être échappées dans le shell (ex: \( et \)).
Options d'exécution et de formatage
Les arguments passés à la commande modifient le comportement de la capture et le rendu des données.
Contrôle de la capture
-i <interface>: Spécifie l'interface à écouter. Utiliseranypour capturer sur toutes les interfaces simultanément.-c <nombre>: Interrompt la capture après avoir traité un nombre défini de paquets.-s <taille>: Définit la "snaplen" (longueur de capture). Par défaut, seuls les premiers octets sont capturés. Utiliser-s 0ou-s 65535est obligatoire pour extraire l'intégralité du payload applicatif.-w <fichier>: Écrit les données brutes dans un fichier PCAP sans les afficher à l'écran, idéal pour une analyse ultérieure avec Wireshark.-r <fichier>: Lit et applique des filtres sur un fichier PCAP existant.-p: Désactive le mode promiscuous (l'interface ne capture que le trafic qui lui est explicitement destiné ou broadcasté).
Rendu de l'information
-n: Désactive la résolution DNS inverse des adresses IP.-nn: Désactive la résolution DNS et la traduction des numéros de port en noms de services.-v,-vv,-vvv: Incrémente le niveau de verbosité pour afficher des détails comme le TTL, les identifiants IP ou les options TCP.-A: Affiche le contenu du paquet en format ASCII (utile pour le trafic HTTP non chiffré).-X: Affiche les données en hexadécimal et en ASCII simultanément.-e: Inclut l'en-tête de la couche liaison (adresses MAC) dans la sortie.-q: Mode silencieux, réduit la quantité d'informations protocolaires affichées.-t: Supprime l'horodatage de chaque ligne.
Anatomie d'une ligne de capture
Voici un exemple d'exécution avec une analyse de la sortie standard générée :
[admin@srv-prod ~]$ sudo tcpdump -i eth0 -nn -c 5 tcp port 443
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
16:45:02.109382 IP 192.168.1.15.52144 > 10.0.0.50.443: Flags [S], seq 38471920, win 65535, options [mss 1460,nop,wscale 8], length 0
16:45:02.109415 IP 10.0.0.50.443 > 192.168.1.15.52144: Flags [S.], seq 9182736, ack 38471921, win 29200, options [mss 1460,nop,wscale 7], length 0
16:45:02.110120 IP 192.168.1.15.52144 > 10.0.0.50.443: Flags [.], ack 1, win 256, length 0
16:45:02.110550 IP 192.168.1.15.52144 > 10.0.0.50.443: Flags [P.], seq 1:518, ack 1, win 256, length 517
16:45:02.110610 IP 10.0.0.50.443 > 192.168.1.15.52144: Flags [.], ack 518, win 237, length 0
5 packets captured
12 packets received by filter
0 packets dropped by kernel
La première ligne capturée se décompose ainsi :
Horodatage (16:45:02.109382) | Couche Réseau (IP) | Source (192.168.1.15.52144 : IP + port éphémère) | Destination (10.0.0.50.443 : IP + port applicatif) | Flags TCP ([S] indique un paquet SYN d'initialisation) | Numéro de séquence (seq) | Fenêtre TCP (win) | Options (MSS, Window Scale) | Payload (length 0).
Scénarios d'application et filtres avancés
1. Isoler un flux bidirectionnel entre deux nœuds
Pour diagnostiquer les échanges exclusifs entre deux serveurs, en ignorant le reste du trafic du réseau local.
[admin@srv-prod ~]$ sudo tcpdump -i bond0 -nn 'host 10.0.0.5 and host 10.0.0.8'
2. Extraire le trafic sortant d'un service spécifique
Capture uniquement les paquets émis par un serveur de base de données MariaDB, sans capturer les requêtes entrantes des clients.
[admin@srv-prod ~]$ sudo tcpdump -i eth0 -n src host 172.16.0.25 and src port 3306
3. Débogage web avec exclusion du trafic d'administration
Surveille les requêtes HTTP/HTTPS sur toutes les interfaces, tout en filtrant les connexions SSH (port 22) pour éviter de polluer la sortie avec sa propre session terminal.
[admin@srv-prod ~]$ sudo tcpdump -i any -nn 'tcp port 80 or tcp port 443' and not port 22
4. Enregistrement intégral d'un flux pour analyse hors ligne
Capture l'intégralité des paquets (sans troncature) provenant d'un sous-réseau IoT vers un collecteur Elasticsearch, et sauvegarde le tout dans un fichier PCAP.
[admin@srv-prod ~]$ sudo tcpdump -i wlan0 -s 0 -w iot_traffic_debug.pcap src net 192.168.50.0/24 and dst port 9200
5. Inspection du payload TCP en temps réel
Affiche le contenu ASCII des paquets, mais applique un filtre BPF complexe pour ne conserver que les paquets TCP contenant effectivement des données utiles (en ignorant les paquets de contrôle comme les ACK vides ou les SYN).
[admin@srv-prod ~]$ sudo tcpdump -i eth0 -A -s 0 'tcp port 8080 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'