Chaque fois que vous ouvrez une page Web sur votre ordinateur, des paquets de données sont envoyés et reçus sur votre interface réseau. Parfois, l'analyse de ces paquets devient importante pour de nombreuses raisons. Heureusement, Linux propose un utilitaire de ligne de commande qui affiche les informations relatives à ces paquets de données en sortie.
Dans cet article, nous aborderons les bases de l'outil en question - tcpdump . Mais avant cela, il convient 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 également sur d'autres distributions Linux comme CentOS, Fedora, Gentoo et Arch Linux.
Commande Linux tcpdump
La commande tcpdump sous Linux vous 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 style Q&A qui devraient vous donner une meilleure idée du fonctionnement de la commande tcpdump.
Q1. Comment utiliser tcpdump ?
Avant d'utiliser tcpdump pour renifler les paquets de données, vous devriez idéalement savoir sur quelle interface réseau vous voulez que l'outil fonctionne. Pour obtenir une liste des interfaces réseau disponibles sur le système, utilisez 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 vous avez une liste d'interfaces, vous pouvez en choisir une et transmettre son nom comme 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 sortir tcpdump après avoir reçu un nombre défini de paquets ?
Ceci peut être réalisé en utilisant l'option de ligne de commande -c. Par exemple, si vous souhaitez que tcpdump n'affiche que les informations relatives à 10 paquets, vous pouvez 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 :
Ainsi, vous pouvez voir que 10 paquets ont été capturés.
Q3. Comment faire en sorte que tcpdump affiche l'en-tête au niveau du lien dans la sortie ?
Cela peut être fait 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
...
...
Ainsi, vous pouvez voir que des en-têtes au niveau du lien ont été produits dans la sortie.
Q4. Comment faire en sorte que tcpdump affiche numériquement les adresses IP étrangères ?
Ceci peut être réalisé 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 exemple de ce type 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 paquet en sortie, utilisez le --number option de ligne de commande.
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
...
...
...
Ainsi, vous pouvez voir que chaque ligne commence maintenant par un chiffre.
Q6. Comment rendre la sortie d'impression tcpdump plus courte ?
Cela peut être fait 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 :
Vous pouvez donc voir que moins d'informations ont été produites en sortie cette fois.
Q7. Comment omettre les informations d'horodatage de la sortie tcpdump ?
Utilisez 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
...
...
Ainsi, vous pouvez 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 en sorte que tcpdump produise une sortie détaillée ?
Vous pouvez 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 venons de gratter la surface ici car la commande tcpdump offre de nombreuses options de ligne de commande. Une fois que vous avez fini de les pratiquer, vous pouvez vous diriger vers la page de manuel de l'outil pour en savoir plus.