Tutoriel de la commande tcpdump de Linux pour les débutants (8 exemples)

Chaque fois que tu ouvres une page Web sur ton ordinateur, des paquets de données sont envoyés et reçus sur ton interface réseau. Parfois, l’analyse de ces paquets devient importante pour de nombreuses raisons. Heureusement, Linux propose un utilitaire en ligne de commande qui décharge les informations relatives à ces paquets de données en sortie.

Dans cet article, nous allons aborder les bases de l’outil en question – tcpdump. Mais avant cela, il est bon de mentionner que tous les exemples ici ont été testés sur une machine Ubuntu 18.04 LTS et sur Debian 10, mais cela fonctionnera aussi sur d’autres distributions Linux comme CentOS, Fedora, Gentoo et Arch Linux.

Commande tcpdump de Linux

La commande tcpdump de Linux te permet de vider le trafic sur un réseau. Voici sa syntaxe en bref :

tcpdump [OPTIONS]

Voici la syntaxe détaillée :

tcpdump [ -AbdDefhHIJKlLnNOpqStuUvxX# ] [ -B buffer_size ]
               [ -c count ]
               [ -C file_size ] [ -G rotate_seconds ] [ -F file ]
               [ -i interface ] [ -j tstamp_type ] [ -m module ] [ -M secret ]
               [ --number ] [ -Q in|out|inout ]
               [ -r file ] [ -V file ] [ -s snaplen ] [ -T type ] [ -w file ]
               [ -W filecount ]
               [ -E [email protected] algo:secret,...  ]
               [ -y datalinktype ] [ -z postrotate-command ] [ -Z user ]
               [ --time-stamp-precision=tstamp_precision ]
               [ --immediate-mode ] [ --version ]
               [ expression ]

Et voici comment la page de manuel de l’outil l’explique :

Tcpdump prints out a description of the contents of packets on a network interface that match the 
boolean expression; the description is preceded by a time stamp, printed, by default, as hours,
minutes, seconds, and fractions of a second  since  midnight.  

It can  also  be  run with the -w flag, which causes it to save the packet data to a file for
later analysis, and/or with the -r flag, which causes it to read from a saved packet file rather
than to read packets from a network interface.  It can also be run with the -V  flag,  which causes
it to read a list of saved packet files.

In all cases, only packets that match expression will be processed by tcpdump.

Voici quelques exemples de type Q&R qui devraient te donner une meilleure idée du fonctionnement de la commande tcpdump.

Q1. Comment utiliser tcpdump ?

Avant d’utiliser tcpdump pour renifler des paquets de données, tu dois idéalement savoir sur quelle interface réseau tu veux que l’outil fonctionne. Pour obtenir une liste des interfaces réseau disponibles sur le système, utilise l’option de ligne de commande -D avec tcpdump.

tcpdump -D

Voici comment la page de manuel explique cette option :

Print the list of the network interfaces available on the system and on which tcpdump can capture 
packets. For each network interface, a number and an interface name, possibly followed by a text
description of the interface, is printed. The interface name or the number can be supplied to the
-i flag to specify an interface on which to capture.

This can be useful on systems that don't have a command to list them (e.g., Windows systems, or
UNIX systems lacking  ifconfig -a); the number can be useful on Windows 2000 and later systems,
where the interface name is a somewhat complex string.

The  -D  flag  will not be supported if tcpdump was built with an older version of libpcap that
lacks the pcap_findalldevs() function.

Par exemple, dans mon cas, la sortie suivante a été produite :

1.wlx18a6f713679b [Up, Running]
2.any (Pseudo-device that captures on all interfaces) [Up, Running]
3.lo [Up, Running, Loopback]
4.enp3s0 [Up]
5.nflog (Linux netfilter log (NFLOG) interface)
6.nfqueue (Linux netfilter queue (NFQUEUE) interface)
7.usbmon1 (USB bus number 1)
8.usbmon2 (USB bus number 2)
9.usbmon3 (USB bus number 3)
10.usbmon4 (USB bus number 4)

Maintenant que tu as une liste d’interfaces, tu peux en choisir une et passer son nom en entrée à l’option de ligne de commande -i de tcpdump. Par exemple :

tcpdump -i wlx18a6f713679b

Voici une partie de la sortie produite par cette commande dans mon cas :

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on wlx18a6f713679b, link-type EN10MB (Ethernet), capture size 262144 bytes
11:53:11.408964 IP 192.168.2.132.52898 > 239.255.255.250.3702: UDP, length 656
11:53:11.409492 IP himanshu.57383 > one.one.one.one.domain: 8572+ [1au] PTR? 250.255.255.239.in-addr.arpa. (57)
11:53:11.409588 IP 192.168.2.140.49690 > 239.255.255.250.1900: UDP, length 174
11:53:11.409954 IP 192.168.2.147.mdns > 224.0.0.251.mdns: 1 [2q] PTR (QU)? _%9E5E7C8F47989526C9BCD95D24084F6F0B27C5ED._sub._googlecast._tcp.local. PTR (QU)? _googlecast._tcp.local. (94)
11:53:11.499220 IP one.one.one.one.domain > himanshu.57383: 8572 NXDomain 0/1/1 (114)
11:53:11.499950 IP himanshu.34201 > one.one.one.one.domain: 12068+ [1au] PTR? 132.2.168.192.in-addr.arpa. (55)
11:53:11.591291 IP one.one.one.one.domain > himanshu.34201: 12068 NXDomain* 0/1/2 (278)
11:53:11.592195 IP himanshu.55501 > one.one.one.one.domain: 31630+ [1au] PTR? 1.1.1.1.in-addr.arpa. (49)
11:53:11.842603 IP himanshu.57253 > one.one.one.one.domain: 16905+ [1au] PTR? 140.2.168.192.in-addr.arpa. (55)
11:53:11.951226 IP himanshu.52662 > one.one.one.one.domain: 52377+ [1au] PTR? 251.0.0.224.in-addr.arpa. (53)
11:53:12.428931 IP 192.168.2.140.49690 > 239.255.255.250.1900: UDP, length 174
11:53:12.437905 IP 192.168.2.147.mdns > 224.0.0.251.mdns: 2 [2q] PTR (QM)? _%9E5E7C8F47989526C9BCD95D24084F6F0B27C5ED._sub._googlecast._tcp.local. PTR (QM)? _googlecast._tcp.local. (94)
11:53:12.438730 IP6 fe80::eccc:59f2:fc78:9e07.52899 > ff02::c.3702: UDP, length 656
11:53:12.439017 IP himanshu.33194 > one.one.one.one.domain: 15679+ [1au] PTR? c.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.2.0.f.f.ip6.arpa. (101)
11:53:12.572386 IP one.one.one.one.domain > himanshu.33194: 15679 NXDomain 0/1/1 (165)
11:53:12.642129 IP 192.168.2.11.mdns > 224.0.0.251.mdns: 0*- [0q] 1/0/3 PTR Google-Home-Mini-e3a3ae72a03e3d1c60d24653d4666ca6._googlecast._tcp.local. (356)
...
...

Q2. Comment faire en sorte que tcpdump se termine après avoir reçu un nombre donné de paquets ?

Tu peux le faire en utilisant l’option de ligne de commande -c. Par exemple, si tu veux que tcpdump n’affiche que les informations relatives à 10 paquets, tu peux le faire de la manière suivante :

tcpdump -c 10

Par exemple, dans mon cas, j’ai exécuté la commande suivante :

tcpdump -c 10 -i wlx18a6f713679b

Voici la sortie qui a été produite :

Comment faire en sorte que tcpdump se termine après avoir reçu un nombre donné de paquets ?

Tu peux donc voir que 10 paquets ont été capturés.

Q3. Comment faire pour que tcpdump affiche l’en-tête de niveau lien dans la sortie ?

Tu peux le faire en utilisant l’option de ligne de commande -e. Par exemple :

tcpdump -e -i wlx18a6f713679b

Et voici la sortie produite :

listening on wlx18a6f713679b, link-type EN10MB (Ethernet), capture size 262144 bytes
12:14:07.951396 3c:a8:2a:a7:7b:c1 (oui Unknown) > Broadcast, ethertype IPv4 (0x0800), length 197: 192.168.2.55.17500 > 255.255.255.255.17500: UDP, length 155
12:14:07.952111 3c:a8:2a:a7:7b:c1 (oui Unknown) > Broadcast, ethertype IPv4 (0x0800), length 197: 192.168.2.55.17500 > 192.168.2.255.17500: UDP, length 155
...
...

Tu peux donc voir que les en-têtes de niveau lien ont été produits dans la sortie.

Q4. Comment faire pour que tcpdump affiche les adresses IP étrangères sous forme numérique ?

Tu peux le faire en utilisant l’option de ligne de commande -f.

tcpdump -f -i [INTERFACE]

Faire en sorte que tcpdump affiche les adresses IPv4 `étrangères’ numériquement plutôt que symboliquement a ses avantages dans certaines situations. Un tel exemple est mentionné dans la page de manuel de l’outil :

this option is intended to get around serious brain damage in Sun's NIS server — usually it hangs 
forever translating non-local internet numbers

Q5. Comment faire en sorte que tcpdump produise des numéros de paquets en sortie ?

Pour que tcpdump produise des numéros de paquets en sortie, utilise l’option de ligne de commande –number.

Par exemple, j’ai exécuté la commande suivante :

tcpdump --number -i wlx18a6f713679b

Et voici une partie de la sortie qui a été produite :

listening on wlx18a6f713679b, link-type EN10MB (Ethernet), capture size 262144 bytes
    1  12:38:35.522944 ARP, Request who-has 192.168.2.196 tell _gateway, length 46
    2  12:38:35.523265 IP6 fe80::8ab4:a6ff:fe9d:a6bb > ff02::16: HBH ICMP6, multicast listener report v2, 1 group record(s), length 28
    3  12:38:35.523578 IP6 fe80::8ab4:a6ff:fe9d:a6bb > ip6-allrouters: ICMP6, router solicitation, length 16
    4  12:38:35.523861 ARP, Request who-has 192.168.2.15 tell 192.168.2.170, length 28
...
...
...

Tu peux donc voir que chaque ligne commence maintenant par un numéro.

Q6. Comment faire pour que tcpdump imprime une sortie plus courte ?

Tu peux le faire en utilisant l’option de ligne de commande -q. Voici comment la page de manuel de l’outil l’explique :

Quick (quiet?) output.  Print less protocol information so output lines are shorter.

Voici un exemple de cette option :

Comment faire en sorte que tcpdump imprime une sortie plus courte

Tu peux donc voir que moins d’informations ont été produites en sortie cette fois-ci.

Q7. Comment omettre les informations d’horodatage de la sortie de tcpdump ?

Utilise l’option de ligne de commande -t pour cela. Voici un exemple de commande :

tcpdump -t -i wlx18a6f713679b

Et voici sa sortie :

listening on wlx18a6f713679b, link-type EN10MB (Ethernet), capture size 262144 bytes
IP himanshu.56992 > mails11.telegram.org.https: Flags [.], ack 3090054317, win 965, options [nop,nop,TS val 226976758 ecr 3781653930], length 0
IP himanshu.41122 > one.one.one.one.domain: 12755+ [1au] PTR? 22.171.154.149.in-addr.arpa. (56)
IP mails11.telegram.org.https > himanshu.56824: Flags [.], ack 273652159, win 1001, options [nop,nop,TS val 3781656472 ecr 226966324], length 0
ARP, Request who-has 192.168.2.48 tell _gateway, length 46
ARP, Request who-has 192.168.2.135 tell _gateway, length 46
...
...

Tu peux donc voir que les informations d’horodatage (qui se trouvent généralement au début de chaque ligne) ne sont pas présentes dans la sortie maintenant.

Q8. Comment faire pour que tcpdump produise une sortie détaillée ?

Tu peux utiliser l’option de ligne de commande -v dans ce cas. Voici comment la page de manuel de l’outil explique cette option :

tcpdump -v -i [INTERFACE]
When parsing and printing, produce (slightly more) verbose output. For example, the time to live,
identification, total length and options in an IP packet are printed. Also enables additional
packet integrity checks such as verifying the IP and ICMP header checksum.

When writing to a file with the -w option, report, every 10 seconds, the number of packets captured

Conclusion

Nous n’avons fait qu’effleurer la surface ici car la commande tcpdump offre de nombreuses options de ligne de commande. Une fois que tu as fini de t’exercer, tu peux te rendre sur la page de manuel de l’outil pour en savoir plus.

Vous aimerez aussi...