tcpdump est un utilitaire de ligne de commande qui nous permet de capturer et d'analyser le trafic réseau passant par notre système. Selon les options de filtrage, nous pouvons utiliser cet outil pour aider efficacement à résoudre tout type de problème de réseau. C'est un outil très couramment utilisé par les ingénieurs sysadmin pour ces fonctionnalités.
Dans ce tutoriel, nous analyserons quelques-unes des façons d'utiliser tcpdump , mais pas tout. En effet, il y a tout simplement beaucoup trop d'options de filtrage impliquées dans cette commande, et il n'est pas possible de toutes les couvrir. Nous n'examinerons ici que certaines des options couramment utilisées. Vous pouvez trouver le reste sur la page de manuel.
Installation de la commande tcpdump
Vous pouvez vérifier si votre système a le tcpdump
commande, en tapant
tcpdump --version
Si le résultat indique qu'il n'est pas installé, vous pouvez l'obtenir directement à l'aide du gestionnaire de packages de votre système.
REMARQUE :Puisque nous allons capturer des paquets, nous avons besoin d'autorisations élevées. (sudo est requis). Nous allons préfixer tous les tcpdump
commandes avec sudo
en conséquence.
Répertorier les interfaces pour la capture de paquets
Avant de capturer activement des paquets, nous allons examiner les interfaces disponibles pour tcpdump
.
Nous pouvons lister les interfaces en utilisant le -D (Affichage).
sudo tcpdump -D
Vous obtiendrez une liste de toutes les interfaces disponibles sur votre machine. Cela dépendra d'un système à l'autre, donc le mien a d'autres interfaces comme Docker , puisque le service Docker est en cours d'exécution, à l'exception des interfaces réseau classiques.
L'interface spéciale any permet de capturer dans tout interface active.
Maintenant que nous connaissons les interfaces disponibles sur notre machine, commençons à capturer les paquets !
Capturer des paquets à l'aide de tcpdump
Capturez tous les paquets dans tout interface en exécutant cette commande :
sudo tcpdump -i any
Cela spécifiera l'interface comme étant n'importe laquelle , l'interface spéciale mentionnée précédemment.
tcpdump continue de capturer des paquets jusqu'à ce qu'il reçoive une interruption signal. Vous pouvez interrompre la capture en appuyant sur Ctrl+C
.
La sortie listera toutes les captures de paquets jusqu'à ce que le signal d'interruption soit reçu pour terminer tcpdump
.
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes 10:49:32.841984 IP 111.11.111.11.vultr.com.ssh > 123.45.678.90.48006: Flags [P.], seq 4132693749:4132693857, ack 3344962610, win 1002, options [nop,nop,TS val 135269404 ecr 1623818400], length 108 10:49:32.842057 IP 111.11.111.11.vultr.com.ssh > 123.45.678.90.48006: Flags [P.], seq 108:144, ack 1, win 1002, options [nop,nop,TS val 135269404 ecr 1623818400], length 36 10:49:32.842101 IP 111.11.111.11.vultr.com.ssh > 123.45.678.90.48006: Flags [P.], seq 144:260, ack 1, win 1002, options [nop,nop,TS val 135269404 ecr 1623818400], length 116 10:49:32.842135 IP 111.11.111.11.vultr.com.ssh > 123.45.678.90.48006: Flags [P.], seq 260:296, ack 1, win 1002, options [nop,nop,TS val 135269404 ecr 1623818400], length 36 ... ... ^C 264 packets captured 361 packets received by filter 91 packets dropped by kernel
Comme vous pouvez le constater, tcpdump
avait capturé 264 paquets. Par exemple, puisque je suis connecté à ce serveur en utilisant ssh
, tcpdump capturé tous ces paquets.
Limiter le nombre de captures de paquets
Pour limiter le nombre de paquets capturés et arrêter tcpdump
, utilisez le -c
option (limite de capture) :
sudo tcpdump -i any -c 2
Cela entraînera l'arrêt automatique de la capture de la commande tcpdump après 2 paquets. Nous n'aurons pas nécessairement besoin d'utiliser le signal d'interruption pour le terminer manuellement dans ce cas.
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes 10:57:31.284198 IP 111.11.111.11.vultr.com.ssh > 123.45.678.90.48006: Flags [P.], seq 4132754245:4132754353, ack 3344963698, win 1002, options [nop,nop,TS val 135747845 ecr 1624296856], length 108 10:57:31.284275 IP 111.11.111.11.vultr.com.ssh > 123.45.678.90.48006: Flags [P.], seq 108:144, ack 1, win 1002, options [nop,nop,TS val 135747845 ecr 1624296856], length 36 2 packets captured 16 packets received by filter 8 packets dropped by kernel
Cette option peut être très utile pour surveiller les connexions réseau afin de résoudre tout problème, s'il y a des problèmes de réseau.
Désactiver la résolution de nom et de port
Par défaut, tcpdump La commande résout les adresses IP et les ports en noms (tels que vultr.com.ssh , qui effectue la résolution de nom à partir des adresses IP et des ports).
Lors du dépannage de problèmes de réseau, il est souvent plus simple d'utiliser les adresses IP et les numéros de port; Nous pouvons désactiver la résolution de nom en utilisant l'option -n
et la résolution de port avec -nn
.
sudo tcpdump -i any -c 2 -nn
La commande ci-dessus capture 2 paquets sur n'importe quelle interface, tout en désactivant la résolution de port.
Ainsi, la sortie arrêtera désormais toute résolution de nom et renverra simplement les adresses IP et les numéros de port.
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes 11:00:36.459922 IP 111.11.111.11.22 > 123.45.678.90.48006: Flags [P.], seq 4132755513:4132755621, ack 3344963838, win 1002, options [nop,nop,TS val 135933020 ecr 1624482048], length 108 11:00:36.459982 IP 111.11.111.11.22 > 123.45.678.90.48006: Flags [P.], seq 108:144, ack 1, win 1002, options [nop,nop,TS val 135933020 ecr 1624482048], length 36 2 packets captured 8 packets received by filter 0 packets dropped by kernel
Ici, examinons une ligne de la sortie.
11:00:36.459922 IP 111.11.111.11.22 > 123.45.678.90.48006: Flags [P.], seq 4132755513:4132755621, ack 3344963838, win 1002, options [nop,nop,TS val 135933020 ecr 1624482048], length 108
Il s'agit d'un TCP typique capture de paquets. D'autres paquets et formats de protocole peuvent être référencés dans la page de manuel de la commande tcpdump.
Le premier champ, 11:00:36.459922 , représente l'horodatage du paquet reçu selon l'horloge locale.
Ensuite, IP
représente le protocole de couche réseau—dans ce cas, IPv4
. Pour IPv6
paquets, la valeur est IP6
.
Le champ suivant, 111.11.111.11.22 , est l'adresse IP source et le port. Ceci est suivi de l'adresse IP et du port de destination, représentés par 123.45.678.90.48006 .
Maintenant que nous connaissons le format de sortie de base, analysons quelques options de filtrage pour tcpdump
Filtrer les paquets
L'un des tcpdump les fonctionnalités les plus puissantes de la commande sont sa capacité à filtrer les paquets capturés en utilisant une variété de paramètres, tels que les adresses IP source et de destination, les ports, les protocoles, etc. Examinons quelques-uns des plus courants.
Filtrer en fonction du protocole
Pour filtrer les paquets en fonction du protocole, nous devons spécifier le protocole dans la commande.
Pour capturer ICMP paquets uniquement, nous pouvons filtrer en fonction de ICMP protocole.
sudo tcpdump -i any -c 5 icmp
Depuis le ping
la commande utilise ICMP paquets, nous pouvons analyser les paquets entrants en raison du ping
d'une autre machine.
Envoyons un ping à notre machine actuelle et capturons les paquets de ping entrants.
Ouvrez une session de terminal sur une autre machine et tapez
ping IP_ADDRESS_MACHINE_1
Maintenant, dans notre tcpdump
session de terminal, nous pouvons maintenant voir qu'il capture ces paquets de réponse ping ICMP.
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes 11:18:47.947475 IP 123.45.678.90 > 111.11.111.11.vultr.com: ICMP echo request, id 6068, seq 1, length 64 11:18:47.947554 IP 111.11.111.11.vultr.com > 123.45.678.90: ICMP echo reply, id 6068, seq 1, length 64 11:18:48.947669 IP 123.45.678.90 > 111.11.111.11.vultr.com: ICMP echo request, id 6068, seq 2, length 64 11:18:48.947752 IP 111.11.111.11.vultr.com > 123.45.678.90: ICMP echo reply, id 6068, seq 2, length 64 11:18:49.947853 IP 123.45.678.90 > 111.11.111.11.vultr.com: ICMP echo request, id 6068, seq 3, length 64 5 packets captured 6 packets received by filter 0 packets dropped by kernel
Ici, 123.45.678.90 est l'adresse IP de la machine (Machine 2) qui envoie le ping à notre tcpdump
système et 111.11.111.11 est l'adresse IP de la machine de filtrage de paquets (Machine 1).
Depuis que j'utilisais ssh
pour envoyer les requêtes ping, il existe une résolution de domaine (mais pas de résolution de nom) vers vultr.com
.
Filtrer en fonction de l'hôte
Pour limiter la capture aux seuls paquets liés à un hôte spécifique, nous pouvons utiliser le host
filtre
sudo tcpdump -i any -c5 -nn host 192.168.1.2
Dans cet exemple, tcpdump capture et affiche uniquement les paquets vers et depuis l'hôte 192.168.1.2
.
Filtrer en fonction du port
Pour filtrer les paquets en fonction du service ou du port souhaité, utilisez le port
filtre. Par exemple, capturez les paquets liés à une session ssh en utilisant cette commande (port 22 filtrage):
sudo tcpdump -i any -c5 -nn port 22
Filtre basé sur l'adresse IP source/le nom d'hôte
Vous pouvez également filtrer les paquets en fonction de l'adresse IP source ou de destination ou du nom d'hôte. Par exemple, pour capturer des paquets depuis l'hôte 192.168.1.2
sudo tcpdump -i any -c 5 -nn src 192.168.1.2
Nous pouvons utiliser dst
pour filtrer également par adresse IP/nom d'hôte de destination.
sudo tcpdump -i any -c 5 -nn src 172.168.1.2
Enregistrer les captures de paquets
Nous pouvons enregistrer les résultats des captures de paquets dans un fichier pour une analyse ultérieure.
Pour enregistrer les paquets dans un fichier au lieu de les afficher à l'écran, utilisez l'option -w
:
sudo tcpdump -i any -c 5 -nn -w sample.pcap port 22
Cette commande enregistre la sortie dans un fichier nommé sample.pcap
. Le .pcap
l'extension signifie "capture de paquets" et est la convention pour ce format de fichier.
Conclusion
Dans ce didacticiel, nous avons appris comment effectuer la capture et le filtrage de paquets en fonction de différentes options, en utilisant le tcpdump
commande.