GNU/Linux >> Tutoriels Linux >  >> Linux

Tcpdump Exemples - Capturer le trafic réseau sous Linux

Tcpdump est une commande de dépannage réseau, également connue sous le nom de renifleur de paquets, utilisée pour capturer et afficher les paquets d'un réseau. Tcpdump permet aux utilisateurs de capturer et d'afficher les paquets TCP/IP et autres (UDP, ARP ou ICMP) transmis ou reçus sur le réseau auquel l'ordinateur est connecté.

Vous pouvez appliquer des filtres aux paquets et éviter le trafic que vous ne voulez pas voir. Vous pouvez capturer toutes les données passant par votre réseau local et mettre ces données dans un fichier pour une analyse ultérieure. Pour exécuter la commande tcpdump, vous avez besoin d'un root ou d'un utilisateur avec des privilèges sudo.

Dans ce tutoriel, nous allons apprendre à utiliser les commandes tcpdump pour analyser le trafic circulant sur une machine Linux.

1. Capturer le trafic sur l'interface

Lorsque vous utilisez tcpdump sans aucune option, il analysera le trafic sur toutes les interfaces, exécutez la commande suivante :

$ sudo tcpdump

Vous devez appuyer sur le bouton Ctrl + C pour l'arrêter.

Pour capturer le trafic sur une interface spécifique, utilisez -i et limitez le nombre de paquets à par -c choix :

L'exemple tcpdump suivant analyse l'interface 'ens160' et limite le paquet à 5 :

$ sudo tcpdump -i ens160 -c 5
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens160, link-type EN10MB (Ethernet), capture size 262144 bytes
22:37:57.488830 IP Ubuntu.ssh > static.vnpt.vn.50302: Flags [P.], seq 904499689:904499877, ack 2322684183, win 501, options [nop,nop,TS val 215651573 ecr 764510174], length 188
22:37:57.489727 IP Ubuntu.33256 > dns.google.domain: 5774+ [1au] PTR? 219.62.249.14.in-addr.arpa. (55)
22:37:57.496238 IP static.vnpt.vn.50302 > Ubuntu.ssh: Flags [.], ack 188, win 2045, options [nop,nop,TS val 764510247 ecr 215651573], length 0
22:37:57.546212 ARP, Request who-has 42.112.22.189 tell 42.112.22.254, length 46
22:37:57.549223 ARP, Request who-has 42.112.22.162 tell 42.112.22.254, length 46
5 packets captured

2) Capturer le trafic sur un hôte spécifique

Vous pouvez capturer les paquets entrants et sortants d'un hôte spécifique en utilisant -host option.

$ sudo tcpdump -i ens160 -c 5 -ttttnnvvS host 14.249.62.219

Maintenant, vous pouvez voir à la fois les paquets de requête et de réponse :

tcpdump: listening on ens160, link-type EN10MB (Ethernet), capture size 262144 bytes
2020-06-22 06:07:36.407733 IP (tos 0x12,ECT(0), ttl 64, id 60196, offset 0, flags [DF], proto TCP (6), length 176)
    100.9.8.40.22 > 14.249.62.219.49396: Flags [P.], cksum 0x60a7 (incorrect -> 0x8547), seq 296088568:296088692, ack 3491435441, win 501, options [nop,nop,TS val 242630491 ecr 673952638], length 124
2020-06-22 06:07:36.407905 IP (tos 0x12,ECT(0), ttl 64, id 60197, offset 0, flags [DF], proto TCP (6), length 208)
    100.9.8.40.22 > 14.249.62.219.49396: Flags [P.], cksum 0x60c7 (incorrect -> 0xeed4), seq 296088692:296088848, ack 3491435441, win 501, options [nop,nop,TS val 242630492 ecr 673952638], length 156
2020-06-22 06:07:36.407967 IP (tos 0x12,ECT(0), ttl 64, id 60198, offset 0, flags [DF], proto TCP (6), length 288)
    100.9.8.40.22 > 14.249.62.219.49396: Flags [P.], cksum 0x6117 (incorrect -> 0x82ca), seq 296088848:296089084, ack 3491435441, win 501, options [nop,nop,TS val 242630492 ecr 673952638], length 236
2020-06-22 06:07:36.408018 IP (tos 0x12,ECT(0), ttl 64, id 60199, offset 0, flags [DF], proto TCP (6), length 408)
    100.9.8.40.22 > 14.249.62.219.49396: Flags [P.], cksum 0x618f (incorrect -> 0xebc8), seq 296089084:296089440, ack 3491435441, win 501, options [nop,nop,TS val 242630492 ecr 673952638], length 356
2020-06-22 06:07:36.408049 IP (tos 0x12,ECT(0), ttl 64, id 60200, offset 0, flags [DF], proto TCP (6), length 208)
    100.9.8.40.22 > 14.249.62.219.49396: Flags [P.], cksum 0x60c7 (incorrect -> 0x3db7), seq 296089440:296089596, ack 3491435441, win 501, options [nop,nop,TS val 242630492 ecr 673952638], length 156

3) Rechercher un paquet par port

Pour trouver des paquets vers un numéro de port spécifié, utilisez -port option.

En supposant que vous souhaitiez analyser l'interface réseau 'ens160' et limiter le nombre de paquets à 5 depuis le port 22, exécutons la commande suivante :

$ sudo tcpdump -i ens160 -c 5 -nn port 22
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens160, link-type EN10MB (Ethernet), capture size 262144 bytes
22:55:11.567754 IP 100.9.8.40.22 > 14.249.62.219.50302: Flags [P.], seq 904502461:904502649, ack 2322684399, win 501, options [nop,nop,TS val 216685651 ecr 765506106], length 188
22:55:11.567973 IP 100.9.8.40.22 > 14.249.62.219.50302: Flags [P.], seq 188:408, ack 1, win 501, options [nop,nop,TS val 216685652 ecr 765506106], length 220
22:55:11.568102 IP 100.9.8.40.22 > 14.249.62.219.50302: Flags [P.], seq 408:604, ack 1, win 501, options [nop,nop,TS val 216685652 ecr 765506106], length 196
22:55:11.568184 IP 100.9.8.40.22 > 14.249.62.219.50302: Flags [P.], seq 604:800, ack 1, win 501, options [nop,nop,TS val 216685652 ecr 765506106], length 196
22:55:11.568262 IP 100.9.8.40.22 > 14.249.62.219.50302: Flags [P.], seq 800:996, ack 1, win 501, options [nop,nop,TS val 216685652 ecr 765506106], length 196

Pour ignorer un port lorsque vous interceptez des paquets, utilisez not port .

Si vous souhaitez analyser un port d'interface réseau 'ens160' autre que 22, exécutez la commande suivante :

$ sudo tcpdump -i ens160 -nn not port 22

Vous pouvez utiliser une gamme de ports afin de capturer votre trafic réseau.

Par exemple, si vous souhaitez analyser l'interface réseau ens160 dans la plage de ports :du port 20 au port 23, exécutez la commande suivante :

$ sudo tcpdump -i ens160 -c 3 -nns 0 portrange 20-23

4) Capturer des paquets à partir d'un protocole spécifique

Vous pouvez décider de capturer uniquement les paquets ICMP (Internet Control Message Protocol) ou TCP (Transmission Control Protocol). La commande suivante ne capturera que les paquets TCP :

$ sudo tcpdump -i ens160 -c 5 -nn tcp
Output
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens160, link-type EN10MB (Ethernet), capture size 262144 bytes
23:13:04.283421 IP 10.9.8.40.22 > 14.249.62.219.50302: Flags [P.], seq 904505569:904505677, ack 2322684631, win 501, options [nop,nop,TS val 217758367 ecr 766570531], length 108
23:13:04.283512 IP 100.9.8.40.22 > 14.249.62.219.50302: Flags [P.], seq 108:144, ack 1, win 501, options [nop,nop,TS val 217758367 ecr 766570531], length 36
23:13:04.283588 IP 100.9.8.40.22 > 14.249.62.219.50302: Flags [P.], seq 144:260, ack 1, win 501, options [nop,nop,TS val 217758367 ecr 766570531], length 116
23:13:04.283642 IP 100.9.8.40.22 > 14.249.62.219.50302: Flags [P.], seq 260:296, ack 1, win 501, options [nop,nop,TS val 217758367 ecr 766570531], length 36
23:13:04.283863 IP 100.9.8.40.22 > 14.249.62.219.50302: Flags [P.], seq 296:508, ack 1, win 501, options [nop,nop,TS val 217758368 ecr 766570531], length 212

5) Enregistrer le journal dans un fichier spécifique

Il est possible de sauvegarder les paquets capturés dans un fichier. Par défaut, lors de la capture de paquets dans un fichier, il n'enregistrera que 68 octets de données de chaque paquet. Le reste des informations est ignoré.

Vous pouvez utiliser -s option pour indiquer à tcpdump linux le nombre d'octets pour chaque paquet à enregistrer et spécifier 0 comme la longueur de l'instantané des paquets indique à tcpdump d'enregistrer l'intégralité du paquet, utilisez la commande suivante :

$ sudo tcpdump -i ens160 -c 5 -nn tcp -w packets-record.pcap -s 0

Output
tcpdump: listening on ens160, link-type EN10MB (Ethernet), capture size 262144 bytes
5 packets captured

6) Lire le fichier d'enregistrement tcpdump

Vous ne pouvez pas lire le contenu d'un fichier qui enregistre les paquets tcpdump avec les commandes courantes telles que 'cat' ou 'less' mais vous devez utiliser le -r paramètre de la commande tcpdump :

$ sudo tcpdump -r packets-record.pcap 

Vous pouvez maintenant lire le contenu du fichier d'enregistrement tcpdump :

reading from file packets-record.pcap, link-type EN10MB (Ethernet)
23:18:57.823581 IP Ubuntu.ssh > static.vnpt.vn.50302: Flags [P.], seq 904507573:904507617, ack 2322684767, win 501, options [nop,nop,TS val 218111907 ecr 766921765], length 44
23:18:57.823697 IP Ubuntu.ssh > static.vnpt.vn.50302: Flags [P.], seq 44:160, ack 1, win 501, options [nop,nop,TS val 218111907 ecr 766921765], length 116
23:18:57.823778 IP Ubuntu.ssh > static.vnpt.vn.50302: Flags [P.], seq 160:196, ack 1, win 501, options [nop,nop,TS val 218111907 ecr 766921765], length 36
23:18:57.832656 IP static.vnpt.vn.50302 > Ubuntu.ssh: Flags [.], ack 44, win 2047, options [nop,nop,TS val 766921826 ecr 218111907], length 0
23:18:57.832685 IP static.vnpt.vn.50302 > Ubuntu.ssh: Flags [.], ack 160, win 2045, options [nop,nop,TS val 766921826 ecr 218111907], length 0

Vous pouvez également utiliser ce fichier pcap pour l'afficher avec Wireshark pour l'analyser.

7) Filtrer les paquets provenant d'une source spécifique

Afin de filtrer les paquets provenant d'une adresse IP source spécifique, vous pouvez utiliser src option.

$ sudo tcpdump src 100.9.8.40

De la même manière si vous voulez voir le trafic dans une autre direction, utilisez dst choix :

$ sudo tcpdump dst 14.249.62.219

8) Capturer les paquets par réseau

Pour capturer les entrées et les sorties d'un réseau, utilisez -net option. La commande suivante capture le trafic du réseau 192.168.0.0/24 :

$ sudu tcpdump net 192.169.0.0/24

9) Capturer des paquets en ASCII

Pour afficher les paquets capturés en ASCII, utilisez -A option pratique pour capturer des pages Web.

$ sudo tcpdump -A -i eth0

Tcpdump peut également afficher le contenu des paquets au format Hex et ASCII, puis utiliser -X choix :

$ sudo tcpdump -X -i eth0

10) Capturer les paquets IPV6

Nous pouvons capturer le trafic IPV6 en utilisant ip6 option et proto pour spécifier le protocole TCP ou UDP.

proto 6 - TCP

proto 17 - UDP

Les éléments suivants capturent tout le trafic ipv6 à l'aide du protocole tcp :

$ sudo tcpdump -nn ip6 proto 6

11) Filtrer l'agent utilisateur HTTP

La commande suivante filtre l'agent utilisateur HTTP et l'hôte à partir de l'en-tête de requête http :

$ sudo tcpdump -nn -A -s1500 -l | egrep -i 'User-Agent:|Host:'

Pour capturer les cookies, utilisez la commande suivante :

$ sudo tcpdump -nn -A -s0 -l | egrep -i 'Set-Cookie|Host:|Cookie:'

12) Liste des interfaces disponibles

Vous pouvez utiliser tcpdump pour lister l'interface disponible avec le -D option.

Par exemple :

$ sudo tcpdump -D
Output
1.ens160 [Up, Running]
2.any (Pseudo-device that captures on all interfaces) [Up, Running]
3.lo [Up, Running, Loopback]
4.docker0 [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)

13) Faire pivoter les fichiers de capture

Si vous capturez du trafic à l'aide de tcpdump pendant une longue période, il est bon de créer un nouveau fichier lorsqu'une certaine taille de fichier ou une certaine durée est atteinte.

La commande suivante créera un nouveau fichier 'network-02-30.pcap' toutes les 30 minutes (-G 1800) avec un fichier limité à 100 Mo (-C 100) avec un nombre de fichiers de 24 (-W 48).

$ sudo tcpdump -i ens160 -w /tmp/network-%H-%M.pcap -W 48 -G 300 -C 100

Options de vidage Tcp

Tcpdump fournit plusieurs options qui améliorent ou modifient sa sortie, vérifions lesquelles :

  • -i <interface> :écoute sur l'interface spécifiée.
  • -n :Ne résolvez pas les noms d'hôte. Vous pouvez utiliser -nn pour ne pas résoudre les noms d'hôte ou les noms de port.
  • -t :Affiche un horodatage lisible par l'homme sur chaque ligne de vidage, -tttt  :Donner une sortie d'horodatage lisible par l'homme au maximum.
  • -X  :affiche le contenu du paquet à la fois en hexadécimal et en ascii.
  • -v , -vv , -vvv  :Augmentez la quantité d'informations sur les paquets que vous récupérez.
  • -c N  :N'obtenez que le nombre N de paquets, puis arrêtez.
  • -s :définit la longueur d'accrochage (taille) de la capture en octets. Utilisez -s0 pour tout obtenir, à moins que vous n'en capturiez intentionnellement moins.
  • -S :Affiche les numéros de séquence absolus.
  • -q  :Afficher moins d'informations sur le protocole.
  • -w <file name> :écrivez plutôt les paquets bruts dans un fichier

Puissance de l'opérateur and, or and not

La commande Tcpdump prend en charge la combinaison des opérateurs "et", "ou" et "non" pour filtrer des résultats plus précis.

Capturez le trafic provenant de 10.20.0.0/16 et allant vers le réseau 10.30.0.0/16 en affichant des horodatages lisibles par l'homme (tt), sans résolution des noms d'hôte ou des numéros de port (nn), une sortie détaillée (vv) et en utilisant une séquence absolue chiffres (S):

$ sudo  -ttnnvvS tcpdump src net 10.20.0.0/16 and dst net 10.30.0.0/16

Afficher le trafic provenant de la source 192.168.0.10 qui n'est pas le protocole UDP :

$ sudo tcpdump src 192.168.0.10 and src net and not udp

Pour capturer le trafic arp ou ping pour un hôte spécifique et enregistrer la sortie dans un fichier nommé packetfile.txt :

$ sudo tcpdump -nnti eth0 arp or icmp and host 192.168.0.1 -w packetfile.txt

Format de sortie Tcpdump

Prenons une nouvelle ligne de la sortie tcpdump pour comprendre son format.

10:31:13.440803 IP Ubuntu.ssh > 117.6.129.86.50736: Flags [P.], seq 188:400, ack 1, win 501, options [nop,nop,TS val 468736347 ecr 335665367], length 212

Où :

10:31:13.401128 - Heure à laquelle le paquet a été capturé en heure locale.

IP - Il a indiqué que le protocole de paquet est IPV4.

Ubuntu.ssh - Cela indique l'adresse IP source ou le nom d'hôte source et .ssh signifie port (ici ce sera 22).

117.6.129.86.50376 - Cela indique l'adresse IP de destination et le point (.) séparés par le numéro de port.

Drapeaux :

[P.] - Ceci est le champ des drapeaux TCP.

[.] - ACK (accusé de réception).

[S] - SYN (démarrer la connexion).

[P] - PSH (pousser les données).

[F] - FIN (Terminer la connexion).

[R] - RST (Réinitialiser la connexion).

[S.] - SYN-ACK (paquet SynAcK).

seq 188:400 - Le numéro de séquence indique que le paquet contient les octets '188' à '400' de données.

win 501 - Ce champ correspond à la taille de la fenêtre, qui représente le nombre d'octets disponibles dans le tampon de réception.

options [nop,nop,TS val 468736347 ecr 335665367] - Il s'agit d'options TCP telles que le MSS (Maximum Segment Size) ou Window Scale. Vous pouvez en savoir plus sur les options de protocole TCP.

length 212 - Cela représente la longueur des données utiles en octets.

Conclusion

Bien que les renifleurs de paquets soient des outils de diagnostic utiles, ils peuvent également faire l'objet d'abus. Par exemple, des individus peu scrupuleux peuvent exécuter des renifleurs de paquets pour capturer les mots de passe que d'autres envoient sur le réseau. Selon la configuration de votre réseau, cette astuce peut fonctionner même si le renifleur de paquets ne s'exécute pas sur l'ordinateur d'envoi ou de réception.

Pour cette raison, de nombreuses organisations ont des politiques interdisant l'utilisation de renifleurs de paquets, sauf dans des circonstances limitées.

J'espère que vous avez apprécié la lecture des commandes tcpdump et veuillez laisser votre suggestion dans la section des commentaires ci-dessous.


Linux
  1. 7 Exemples de commandes Linux df

  2. 8 Exemples de commandes Linux TR

  3. Service de système d'exploitation Linux "réseau"

  4. Exemples d'utilisation de la commande tcpdump pour le dépannage du réseau

  5. Exemples de commande rm sous Linux

Network Manager sur Linux avec des exemples

10 exemples de commande Linux ss pour surveiller les connexions réseau

Exemples de commandes Linux ifconfig

Exemples utiles de tcpdump Linux pour l'administrateur réseau

10 exemples de commande Linux brctl pour le pont réseau Ethernet

Exemples de commandes id sous Linux