2022-11-26 08:04 Temps de lecture : 17 min

Comment capturer et analyser le trafic réseau avec tcpdump ?

L'analyse du trafic réseau est grandement facilitée par tcpdump, un outil en ligne de commande d'une efficacité remarquable. C'est une référence incontournable pour la capture et l'étude des paquets TCP/IP.

L'utilitaire tcpdump s'avère extrêmement précieux lors de la résolution de problèmes liés au réseau. Il permet d'enregistrer les paquets dans un fichier pour une analyse ultérieure. Une surveillance régulière de votre réseau à l'aide de cet outil est une pratique judicieuse.

Interprétation des données issues de tcpdump

tcpdump scrute les en-têtes des paquets TCP/IP, affichant une ligne pour chaque paquet capturé. L'exécution de la commande se poursuit jusqu'à ce qu'elle soit interrompue par la combinaison de touches Ctrl + C.

Examinons une ligne de sortie comme exemple :

    20:58:26.765637 IP 10.0.0.50.80 > 10.0.0.1.53181: Flags [F.], seq 1, ack 2, win 453, options [nop,nop,TS val 3822939 ecr 249100129], length 0
  

Chaque ligne présente les informations suivantes :

  • Horodatage Unix (20:58:26.765637) : indique le moment précis de la capture du paquet.
  • Protocole (IP) : spécifie le protocole utilisé pour la transmission des données.
  • Adresse IP et numéro de port source (10.0.0.50.80) : identifie l'expéditeur du paquet.
  • Adresse IP et numéro de port de destination (10.0.0.1.53181) : indique le destinataire du paquet.
  • Indicateurs TCP (Flags [F.]) : les drapeaux reflètent l'état actuel de la connexion. Plusieurs valeurs peuvent être présentes, comme [F.] (FIN-ACK) dans cet exemple. Les valeurs possibles sont :
    • S - SYN : signifie la première étape de l'établissement d'une connexion.
    • F - FIN : indique la fin de la connexion.
    • . - ACK : signifie qu'un paquet d'accusé de réception a été reçu avec succès.
    • P - PUSH : demande au récepteur de traiter les paquets immédiatement sans les mettre en mémoire tampon.
    • R - RST : indique un arrêt soudain de la communication.
  • Numéro de séquence des données (seq 1) : indique l'ordre des données dans le flux.
  • Numéro d'accusé de réception (ack 2) : confirme la réception des données précédentes.
  • Taille de la fenêtre (win 453) : précise le nombre d'octets disponibles dans le tampon de réception, suivi des options TCP.
  • Longueur de la charge utile de données (length 0) : spécifie le nombre d'octets de données contenus dans le paquet.

Installation de tcpdump

Sur les systèmes basés sur Debian, l'installation de tcpdump s'effectue via la commande APT :

    # apt install tcpdump -y
  

Sur les systèmes basés sur RPM, utilisez la commande YUM :

    # yum install tcpdump -y
  

Ou encore, sur RHEL 8, la commande DNF :

    # dnf install tcpdump -y
  

Options de la commande tcpdump

L'exécution de tcpdump requiert les privilèges root. L'outil offre une multitude d'options et de filtres. Lancé sans aucune option, tcpdump capturera tous les paquets transitant par l'interface par défaut.

Pour afficher la liste des interfaces réseau disponibles sur le système, susceptibles d'être utilisées par tcpdump pour la capture de paquets :

    # tcpdump -D
  

Ou alternativement :

    # Tcpdump --list-interfaces
  
    1.eth0
    2.nflog (Linux netfilter log (NFLOG) interface)
    3.nfqueue (Linux netfilter queue (NFQUEUE) interface)
    4.eth1
    5.any (Pseudo-device that captures on all interfaces)
    6.lo [Loopback]
  

Cette commande est particulièrement utile sur les systèmes qui ne disposent pas d'une commande spécifique pour lister les interfaces.

Pour capturer les paquets transitant par une interface spécifique, utilisez l'option -i suivie du nom de l'interface. Sans cette option, tcpdump choisira la première interface réseau rencontrée.

    # tcpdump -i eth1
  
    tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
    listening on eth1, link-type EN10MB (Ethernet), capture size 262144 bytes
    01:06:09.278817 IP vagrant-ubuntu-trusty-64 > 10.0.0.51: ICMP echo request, id 4761, seq 1, length 64
    01:06:09.279374 IP 10.0.0.51 > vagrant-ubuntu-trusty-64: ICMP echo reply, id 4761, seq 1, length 64
    01:06:10.281142 IP vagrant-ubuntu-trusty-64 > 10.0.0.51: ICMP echo request, id 4761, seq 2, length 64
  

L'option -v augmente la quantité d'informations affichées sur les paquets, et -vv offre encore plus de détails.

Par défaut, tcpdump convertit les adresses IP en noms d'hôtes et utilise les noms de service au lieu des numéros de port. Si le DNS est défaillant ou si vous souhaitez éviter les requêtes de nom, utilisez l'option -n.

    # tcpdump -n
  
    listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
    04:19:07.675216 IP 10.0.2.15.22 > 10.0.2.2.50422: Flags [P.], seq 2186733178:2186733278, ack 204106815, win 37232, length 100
    04:19:07.675497 IP 10.0.2.2.50422 > 10.0.2.15.22: Flags [.], ack 100, win 65535, length 0
    04:19:07.675747 IP 10.0.2.15.22 > 10.0.2.2.50422: Flags [P.], seq 100:136, ack 1, win 37232, length 36
    04:19:07.675902 IP 10.0.2.2.50422 > 10.0.2.15.22: Flags [.], ack 136, win 65535, length 0
    04:19:07.676142 IP 10.0.2.15.22 > 10.0.2.2.50422: Flags [P.], seq 136:236, ack 1, win 37232, length 100
  

Pour limiter le nombre de lignes capturées, par exemple à 5, utilisez l'option -c :

    #tcpdump -c 5
  
    04:19:07.675216 IP 10.0.2.15.22 > 10.0.2.2.50422: Flags [P.], seq 2186733178:2186733278, ack 204106815, win 37232, length 100
    04:19:07.675497 IP 10.0.2.2.50422 > 10.0.2.15.22: Flags [.], ack 100, win 65535, length 0
    04:19:07.675747 IP 10.0.2.15.22 > 10.0.2.2.50422: Flags [P.], seq 100:136, ack 1, win 37232, length 36
    04:19:07.675902 IP 10.0.2.2.50422 > 10.0.2.15.22: Flags [.], ack 136, win 65535, length 0
    04:19:07.676142 IP 10.0.2.15.22 > 10.0.2.2.50422: Flags [P.], seq 136:236, ack 1, win 37232, length 100
    5 packets captured
  

La sortie standard de tcpdump utilise des horodatages Unix. Pour obtenir un affichage plus lisible de l'horodatage :

    # tcpdump -tttt
  
    2020-07-06 04:30:12.203638 IP 10.0.2.15.22 > 10.0.2.2.50422: Flags [P.], seq 2186734102:2186734138, ack 204107103, win 37232, length 36
    2020-07-06 04:30:12.203910 IP 10.0.2.2.50422 > 10.0.2.15.22: Flags [.], ack 36, win 65535, length 0
    2020-07-06 04:30:12.204292 IP 10.0.2.15.22 > 10.0.2.2.50422: Flags [P.], seq 36:72, ack 1, win 37232, length 36
    2020-07-06 04:30:12.204524 IP 10.0.2.2.50422 > 10.0.2.15.22: Flags [.], ack 72, win 65535, length 0
    2020-07-06 04:30:12.204658 IP 10.0.2.15.22 > 10.0.2.2.50422: Flags [P.], seq 72:108, ack 1, win 37232, length 36
  

Expressions de filtrage de tcpdump

Les expressions de filtrage permettent de sélectionner les en-têtes de paquet à afficher. En l'absence de filtre, tous les en-têtes sont affichés. Les filtres couramment utilisés sont : port, host, src, dst, tcp, udp, et icmp.

Filtrage par port

Utilisez ce filtre pour afficher les paquets qui transitent par un port spécifique :

    # Tcpdump -i eth1 -c 5 port 80
  
    23:54:24.978612 IP 10.0.0.1.53971 > 10.0.0.50.80: Flags [SEW], seq 53967733, win 65535, options [mss 1460,nop,wscale 5,nop,nop,TS val 256360128 ecr 0,sackOK,eol], length 0
    23:54:24.978650 IP 10.0.0.50.80 > 10.0.0.1.53971: Flags [S.E], seq 996967790, ack 53967734, win 28960, options [mss 1460,sackOK,TS val 5625522 ecr 256360128,nop,wscale 6], length 0
    23:54:24.978699 IP 10.0.0.1.53972 > 10.0.0.50.80: Flags [SEW], seq 226341105, win 65535, options [mss 1460,nop,wscale 5,nop,nop,TS val 256360128 ecr 0,sackOK,eol], length 0
    23:54:24.978711 IP 10.0.0.50.80 > 10.0.0.1.53972: Flags [S.E], seq 1363851389, ack 226341106, win 28960, options [mss 1460,sackOK,TS val 5625522 ecr 256360128,nop,wscale 6], length 0
  

Filtrage par hôte

Pour capturer tous les paquets qui entrent ou sortent de l'hôte dont l'adresse IP est 10.0.2.15 :

    # tcpdump host 10.0.2.15
  
    03:48:06.087509 IP 10.0.2.15.22 > 10.0.2.2.50225: Flags [P.], seq 3862934963:3862934999, ack 65355639, win 37232, length 36
    03:48:06.087806 IP 10.0.2.2.50225 > 10.0.2.15.22: Flags [.], ack 36, win 65535, length 0
    03:48:06.088087 IP 10.0.2.15.22 > 10.0.2.2.50225: Flags [P.], seq 36:72, ack 1, win 37232, length 36
    03:48:06.088274 IP 10.0.2.2.50225 > 10.0.2.15.22: Flags [.], ack 72, win 65535, length 0
    03:48:06.088440 IP 10.0.2.15.22 > 10.0.2.2.50225: Flags [P.], seq 72:108, ack 1, win 37232, length 36
  

Pour capturer les paquets d'un type de protocole spécifique, par exemple ICMP, sur l'interface eth1 :

    # tcpdump -i eth1 icmp
  
    04:03:47.408545 IP vagrant-ubuntu-trusty-64 > 10.0.0.51: ICMP echo request, id 2812, seq 75, length 64
    04:03:47.408999 IP 10.0.0.51 > vagrant-ubuntu-trusty-64: ICMP echo reply, id 2812, seq 75, length 64
    04:03:48.408697 IP vagrant-ubuntu-trusty-64 > 10.0.0.51: ICMP echo request, id 2812, seq 76, length 64
    04:03:48.409208 IP 10.0.0.51 > vagrant-ubuntu-trusty-64: ICMP echo reply, id 2812, seq 76, length 64
    04:03:49.411287 IP vagrant-ubuntu-trusty-64 > 10.0.0.51: ICMP echo request, id 2812, seq 77, length 64
  

Combinaison d'expressions de filtrage

Il est possible de combiner ces expressions de filtre à l'aide des opérateurs AND, OR et NOT. Cela permet de formuler des commandes plus spécifiques pour isoler des paquets avec une plus grande précision :

Par exemple, les paquets provenant d'une adresse IP spécifique et destinés à un port spécifique :

    # tcpdump -n -i eth1 src 10.0.0.1 and dst port 80
  
    00:18:17.155066 IP 10.0.0.1.54222 > 10.0.0.50.80: Flags [F.], seq 500773341, ack 2116767648, win 4117, options [nop,nop,TS val 257786173 ecr 5979014], length 0
    00:18:17.155104 IP 10.0.0.1.54225 > 10.0.0.50.80: Flags [S], seq 904045691, win 65535, options [mss 1460,nop,wscale 5,nop,nop,TS val 257786173 ecr 0,sackOK,eol], length 0
    00:18:17.157337 IP 10.0.0.1.54221 > 10.0.0.50.80: Flags [P.], seq 4282813257:4282813756, ack 1348066220, win 4111, options [nop,nop,TS val 257786174 ecr 5979015], length 499: HTTP: GET / HTTP/1.1
    00:18:17.157366 IP 10.0.0.1.54225 > 10.0.0.50.80: Flags [.], ack 1306947508, win 4117, options [nop,nop,TS val 257786174 ecr 5983566], length 0
  

Pour capturer tous les paquets sauf ceux de type ICMP, utilisez l'opérateur NOT :

    # tcpdump -i eth1 not icmp
  

Enregistrement des en-têtes de paquets dans un fichier

Étant donné que la sortie de tcpdump peut défiler rapidement, il est possible de sauvegarder les en-têtes de paquets dans un fichier en utilisant l'option -w. Les fichiers de sortie utilisent le format pcap et ont l'extension .pcap.

PCAP signifie "capture de paquets". La commande suivante enregistre 10 lignes de sortie de l'interface eth1 vers le fichier icmp.pcap.

    # tcpdump -i eth1 -c 10 -w icmp.pcap
  
    tcpdump: listening on eth1, link-type EN10MB (Ethernet), capture size 262144 bytes
    10 packets captured
    10 packets received by filter
    0 packets dropped by kernel
  

Ce fichier peut être lu grâce à l'option -r :

    tcpdump -r icmp.pcap
  
    reading from file icmp.pcap, link-type EN10MB (Ethernet)
    05:33:20.852732 IP vagrant-ubuntu-trusty-64 > 10.0.0.51: ICMP echo request, id 3261, seq 33, length 64
    05:33:20.853245 IP 10.0.0.51 > vagrant-ubuntu-trusty-64: ICMP echo reply, id 3261, seq 33, length 64
    05:33:21.852586 IP vagrant-ubuntu-trusty-64 > 10.0.0.51: ICMP echo request, id 3261, seq 34, length 64
    05:33:21.853104 IP 10.0.0.51 > vagrant-ubuntu-trusty-64: ICMP echo reply, id 3261, seq 34, length 64
    05:33:22.852615 IP vagrant-ubuntu-trusty-64 > 10.0.0.51: ICMP echo request, id 3261, seq 35, length 64
  

Affichage des détails des paquets

Jusqu'à présent, nous n'avons examiné que les en-têtes de paquets. Pour afficher le contenu du paquet, utilisez l'option -A. Cela affichera le contenu du paquet au format ASCII, ce qui peut s'avérer utile lors du dépannage du réseau. L'option -X permet un affichage au format hexadécimal. Il est à noter que ces options peuvent ne pas être très informatives si la connexion est chiffrée.

    # tcpdump -c10 -i eth1 -n -A port 80
  
    23:35:53.109306 IP 10.0.0.1.53916 > 10.0.0.50.80: Flags [P.], seq 2366590408:2366590907, ack 175457677, win 4111, options [nop,nop,TS val 255253117 ecr 5344866], length 499: HTTP: GET / HTTP/1.1
    E..'[email protected]@.%.
    ...
    ..2...P..M.
    uE............
    .6.}.Q.bGET / HTTP/1.1
    Host: 10.0.0.50
    Connection: keep-alive
    Cache-Control: max-age=0
    Upgrade-Insecure-Requests: 1
    User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
    Accept-Encoding: gzip, deflate
    Accept-Language: en-US,en;q=0.9
    If-Modified-Since: Tue, 04 Mar 2014 11:46:45 GMT
  

En guise de conclusion

tcpdump est un outil simple à configurer. Une fois que vous êtes familiarisé avec la sortie, les différentes options et les filtres, il peut être utilisé pour dépanner les problèmes de mise en réseau et sécuriser votre infrastructure réseau.

Auteur
France

Rédacteur tech, guides pratiques et astuces numériques.