GNU/Linux >> Tutoriels Linux >  >> Linux

Commande Tcpdump sous Linux

tcpdump est un utilitaire de ligne de commande que vous pouvez utiliser pour capturer et inspecter le trafic réseau entrant et sortant de votre système. Il s'agit de l'outil le plus couramment utilisé par les administrateurs réseau pour résoudre les problèmes de réseau et tester la sécurité.

Malgré son nom, avec tcpdump , vous pouvez également capturer le trafic non TCP tel que UDP, ARP ou ICMP. Les paquets capturés peuvent être écrits dans un fichier ou une sortie standard. L'une des fonctionnalités les plus puissantes de tcpdump commande est sa capacité à utiliser des filtres et à capturer uniquement les données que vous souhaitez analyser.

Dans cet article, nous couvrirons les bases de l'utilisation du tcpdump commande sous Linux.

Installation de tcpdump #

tcpdump est installé par défaut sur la plupart des distributions Linux et macOS. Pour vérifier si le tcpdump La commande est disponible sur votre type de système :

tcpdump --version

Le résultat devrait ressembler à ceci :

tcpdump version 4.9.2
libpcap version 1.8.1
OpenSSL 1.1.1b  26 Feb 2019

Si tcpdump n'est pas présent sur votre système, la commande ci-dessus affichera "tcpdump:command not found". Vous pouvez facilement installer tcpdump en utilisant le gestionnaire de paquets de votre distribution.

Installation de tcpdump sur Ubuntu et Debian #

sudo apt update && sudo apt install tcpdump

Installation de tcpdump sur CentOS et Fedora #

sudo yum install tcpdump

Installation de tcpdump sur Arch Linux #

sudo pacman -S tcpdump

Capturer des paquets avec tcpdump #

La syntaxe générale pour le tcpdump commande est la suivante :

tcpdump [options] [expression]
  • La commande options vous permettent de contrôler le comportement de la commande.
  • Le filtre expression définit quels paquets seront capturés.

Uniquement root ou utilisateur avec sudo les privilèges peuvent exécuter tcpdump . Si vous essayez d'exécuter la commande en tant qu'utilisateur non privilégié, vous obtiendrez une erreur indiquant :"Vous n'avez pas l'autorisation de capturer sur cet appareil".

Le cas d'utilisation le plus simple consiste à invoquer tcpdump sans options ni filtres :

sudo tcpdump
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens3, link-type EN10MB (Ethernet), capture size 262144 bytes
15:47:24.248737 IP linuxize-host.ssh > desktop-machine.39196: Flags [P.], seq 201747193:201747301, ack 1226568763, win 402, options [nop,nop,TS val 1051794587 ecr 2679218230], length 108
15:47:24.248785 IP linuxize-host.ssh > desktop-machine.39196: Flags [P.], seq 108:144, ack 1, win 402, options [nop,nop,TS val 1051794587 ecr 2679218230], length 36
15:47:24.248828 IP linuxize-host.ssh > desktop-machine.39196: Flags [P.], seq 144:252, ack 1, win 402, options [nop,nop,TS val 1051794587 ecr 2679218230], length 108

... Long output suppressed

23116 packets captured
23300 packets received by filter
184 packets dropped by kernel

tcpdump continuera à capturer des paquets et à écrire sur la sortie standard jusqu'à ce qu'il reçoive un signal d'interruption. Utilisez le Ctrl+C combinaison de touches pour envoyer un signal d'interruption et arrêter la commande.

Pour une sortie plus détaillée, passez le -v ou -vv pour une sortie encore plus détaillée :

sudo tcpdump -vv

Vous pouvez spécifier le nombre de paquets à capturer en utilisant le -c option. Par exemple, pour ne capturer que dix paquets, vous saisiriez :

sudo tcpdump -c 10

Après avoir capturé les paquets, tcpdump s'arrêtera.

Lorsqu'aucune interface n'est spécifiée, tcpdump utilise la première interface qu'il trouve et vide tous les paquets passant par cette interface.

Utilisez le -D option pour imprimer une liste de toutes les interfaces réseau disponibles à partir desquelles tcpdump peut collecter des paquets :

sudo tcpdump -D

Pour chaque interface, la commande imprime le nom de l'interface, une courte description et un index (numéro) associé :

1.ens3 [Up, Running]
2.any (Pseudo-device that captures on all interfaces) [Up, Running]
3.lo [Up, Running, Loopback]

La sortie ci-dessus montre que ens3 est la première interface trouvée par tcpdump et utilisé lorsqu'aucune interface n'est fournie à la commande. La seconde interface any est un appareil spécial qui vous permet de capturer toutes les interfaces actives.

Pour spécifier l'interface sur laquelle vous souhaitez capturer le trafic, appelez la commande avec le -i option suivie du nom de l'interface ou de l'index associé. Par exemple, pour capturer tous les paquets de toutes les interfaces, vous devez spécifier le any interface :

sudo tcpdump -i any

Par défaut, tcpdump effectue une résolution DNS inverse sur les adresses IP et traduit les numéros de port en noms. Utilisez le -n option pour désactiver la traduction :

sudo tcpdump -n

Ignorer la recherche DNS évite de générer du trafic DNS et rend la sortie plus lisible. Il est recommandé d'utiliser cette option chaque fois que vous invoquez tcpdump .

Au lieu d'afficher la sortie à l'écran, vous pouvez la rediriger vers un fichier à l'aide des opérateurs de redirection > et >> :

sudo tcpdump -n -i any > file.out

Vous pouvez également regarder les données tout en enregistrant dans un fichier en utilisant le tee commande :

sudo tcpdump -n -l | tee file.out

Le -l l'option dans la commande ci-dessus indique tcpdump pour mettre la ligne de sortie en mémoire tampon. Lorsque cette option n'est pas utilisée, la sortie ne sera pas écrite à l'écran lorsqu'une nouvelle ligne est générée.

Comprendre le tcpdump Sortie #

tcpdump produit des informations pour chaque paquet capturé sur une nouvelle ligne. Chaque ligne comprend un horodatage et des informations sur ce paquet, selon le protocole.

Le format typique d'une ligne de protocole TCP est le suivant :

[Timestamp] [Protocol] [Src IP].[Src Port] > [Dst IP].[Dst Port]: [Flags], [Seq], [Ack], [Win Size], [Options], [Data Length]

Allons champ par champ et expliquons la ligne suivante :

15:47:24.248737 IP 192.168.1.185.22 > 192.168.1.150.37445: Flags [P.], seq 201747193:201747301, ack 1226568763, win 402, options [nop,nop,TS val 1051794587 ecr 2679218230], length 108
  • 15:47:24.248737 - L'horodatage du paquet capturé est en heure locale et utilise le format suivant :hours:minutes:seconds.frac , où frac est une fraction de seconde depuis minuit.

  • IP - Le protocole paquet. Dans ce cas, IP signifie la version 4 du protocole Internet (IPv4).

  • 192.168.1.185.22 - L'adresse IP source et le port, séparés par un point (. ).

  • 192.168.1.150.37445 - L'adresse IP et le port de destination, séparés par un point (. ).

  • Flags [P.] - Champ Indicateurs TCP. Dans cet exemple, [P.] signifie Push Acknowledgement packet, qui est utilisé pour accuser réception du paquet précédent et envoyer des données. Les autres valeurs typiques de champ d'indicateur sont les suivantes :

    • [.] - ACK (accusé de réception)
    • [S] - SYN (démarrer la connexion)
    • [P] - PSH (envoi de données)
    • [F] - FIN (Finir la connexion)
    • [R] - RST (réinitialiser la connexion)
    • [S.] - SYN-ACK (paquet SynAcK)
  • seq 201747193:201747301 - Le numéro de séquence est dans le first:last notation. Il indique le nombre de données contenues dans le paquet. À l'exception du premier paquet du flux de données où ces nombres sont absolus, tous les paquets suivants utilisent des positions d'octet relatives. Dans cet exemple, le nombre est 201747193:201747301 , ce qui signifie que ce paquet contient les octets 201747193 à 201747301 du flux de données. Utilisez le -S option pour imprimer des numéros de séquence absolus.

  • ack 1226568763 Le numéro d'accusé de réception est le numéro de séquence des prochaines données attendues par l'autre extrémité de cette connexion.

  • win 402 - Le numéro de fenêtre est le nombre d'octets disponibles dans le tampon de réception.

  • options [nop,nop,TS val 1051794587 ecr 2679218230] - Option TCP. nop , ou "aucune opération" est un remplissage utilisé pour rendre l'en-tête TCP multiple de 4 octets. TS val est un horodatage TCP, et ecr représente une réponse en écho. Consultez la documentation IANA pour plus d'informations sur les options TCP.

  • length 108 - La longueur des données utiles

tcpdump Filtres #

Lorsque tcpdump est invoqué sans filtres, il capture tout le trafic et produit une énorme quantité de sortie qui rend très difficile la recherche et l'analyse des paquets d'intérêt.

Les filtres sont l'une des fonctionnalités les plus puissantes de tcpdump commande. Ils vous permettent de capturer uniquement les paquets correspondant à l'expression. Par exemple, lors du dépannage de problèmes liés à un serveur Web, vous pouvez utiliser des filtres pour obtenir uniquement le trafic HTTP.

tcpdump utilise la syntaxe Berkeley Packet Filter (BPF) pour filtrer les paquets capturés à l'aide de divers paramètres d'usinage tels que les protocoles, les adresses IP source et de destination et les ports, etc.

Dans cet article, nous allons examiner certains des filtres les plus courants. Pour une liste de tous les filtres disponibles, consultez la page pcap-filterman.

Filtrage par numéro de protocole

Pour limiter la capture à un protocole particulier, spécifiez le protocole en tant que filtre. Par exemple, pour capturer uniquement le trafic UDP, vous exécuteriez :

sudo tcpdump -n udp

Une autre façon de définir le protocole est d'utiliser le proto qualificateur, suivi du numéro de protocole. La commande suivante filtrera le numéro de protocole 17 et produira le même résultat que celui ci-dessus :

sudo tcpdump -n proto 17

Pour plus d'informations sur les numéros, consultez la liste des numéros de protocole IP.

Filtrage par numéro d'hôte

Pour capturer uniquement les paquets liés à un hôte spécifique, utilisez le host qualificatif :

sudo tcpdump -n host 192.168.1.185

L'hôte peut être soit une adresse IP, soit un nom.

Vous pouvez également filtrer la sortie sur une plage IP donnée en utilisant le net qualificatif. Par exemple, pour vider uniquement les paquets liés à 10.10.0.0/16 vous utiliseriez :

sudo tcpdump -n net 10.10

Filtrage par numéro de port

Pour limiter la capture uniquement aux paquets depuis ou vers un port spécifique, utilisez le port qualificatif. La commande ci-dessous capture les paquets liés au service SSH (port 22) en utilisant cette commande :

sudo tcpdump -n port 23

La portrange qualificateur vous permet de capturer le trafic dans une plage de ports :

sudo tcpdump -n portrange 110-150

Filtrage par source et destination #

Vous pouvez également filtrer les paquets en fonction du port source ou de destination ou de l'hôte à l'aide de la balise are src , dst , src and dst , et src or dst qualificatifs.

La commande suivante capture les paquets provenant d'un hôte avec l'IP 192.168.1.185 :

sudo tcpdump -n src host 192.168.1.185

Pour trouver le trafic provenant de n'importe quelle source vers le port 80, vous utiliseriez :

sudo tcpdump -n dst port 80

Filtres complexes #

Les filtres peuvent être combinés à l'aide de and (&& ), or (|| ), et nop (! ) opérateurs.

Par exemple, pour capturer tout le trafic HTTP provenant d'une adresse IP source 192.168.1.185, vous utiliserez cette commande :

sudo tcpdump -n src 192.168.1.185 and tcp port 80

Vous pouvez également utiliser des parenthèses pour regrouper et créer des filtres plus complexes :

sudo tcpdump -n 'host 192.168.1.185 and (tcp port 80 or tcp port 443)'

Pour éviter les erreurs d'analyse lors de l'utilisation de caractères spéciaux, placez les filtres entre guillemets simples.

Voici un autre exemple de commande pour capturer tout le trafic sauf SSH à partir d'une adresse IP source 192.168.1.185 :

sudo tcpdump -n src 192.168.1.185 and not dst port 22

Numéro d'inspection de paquet

Par défaut tcpdump , capture uniquement les en-têtes de paquet. Cependant, vous devrez parfois inspecter le contenu des paquets.

tcpdump permet d'imprimer le contenu des paquets en ASCII et HEX.

Le -A l'option indique tcpdump pour imprimer chaque paquet en ASCII et -x en HEX :

sudo tcpdump -n -A

Pour afficher le contenu du paquet à la fois en HEX et en ASCII, utilisez le -X choix :

sudo tcpdump -n -X

Lecture et écriture de captures dans un fichier #

Une autre fonctionnalité utile de tcpdump est d'écrire les paquets dans un fichier. Ceci est pratique lorsque vous capturez un grand nombre de paquets ou capturez des paquets pour une analyse ultérieure.

Pour commencer à écrire dans un fichier, utilisez le -w option suivie du fichier de capture de sortie :

sudo tcpdump -n -w data.pcap

Cette commande ci-dessus enregistrera la capture dans un fichier nommé data.pcap . Vous pouvez nommer le fichier comme vous le souhaitez, mais il est courant d'utiliser le .pcap extension (capture de paquets).

Lorsque le -w est utilisée, la sortie n'est pas affichée à l'écran. tcpdump écrit des paquets bruts et crée un fichier binaire qui ne peut pas être lu avec un éditeur de texte normal.

Pour inspecter le contenu du fichier, invoquez tcpdump avec le -r choix :

sudo tcpdump -r data.pcap

Si vous souhaitez exécuter tcpdump en arrière-plan, ajoutez le symbole esperluette (& ) à la fin de la commande.

Le fichier de capture peut également être inspecté avec d'autres outils d'analyse de paquets tels que Wireshark.

Lors de la capture de paquets sur une longue période, vous pouvez activer la rotation des fichiers. tcpdump vous permet de créer de nouveaux fichiers et de faire pivoter le fichier de vidage sur un intervalle de temps spécifié ou une taille fixe. La commande suivante créera jusqu'à dix fichiers de 200 Mo, nommés file.pcap0 , file.pcap1 , et ainsi de suite :avant d'écraser les anciens fichiers.

sudo tcpdump -n -W 10 -C 200 -w /tmp/file.pcap

Une fois dix fichiers générés, les anciens fichiers seront écrasés.

Veuillez noter que vous ne devez exécuter que tcpdump uniquement lors de problèmes de dépannage.

Si vous voulez démarrer tcpdump à un moment précis, vous pouvez utiliser un cronjob. tcpdump n'a pas la possibilité de quitter après un certain temps. Vous pouvez utiliser le timeout commande pour arrêter tcpdump après quelque temps. Par exemple, pour quitter après 5 minutes, vous utiliserez :

sudo timeout 300 tcpdump -n -w data.pcap

Conclusion #

tcpdump est un outil de ligne de commande pour analyser et résoudre les problèmes liés au réseau.

Cet article vous a présenté les bases de tcpdump usage et syntaxe. Pour une documentation plus détaillée, visitez le site Web tcpdump.

Si vous avez des questions ou des commentaires, n'hésitez pas à laisser un commentaire.


Linux
  1. Comment capturer et analyser des paquets avec la commande tcpdump sous Linux

  2. Commande Linux mv

  3. Linux du command

  4. Commande IP Linux

  5. Commande cd Linux

Commande W sous Linux

Commande Tcpdump sous Linux

À la commande sous Linux

Commande Df sous Linux

Commande Linux tcpdump

Analyseur de paquets :15 exemples de commandes TCPDUMP