Dans mon dernier article, Dépannage avec tcpdump, j'ai regardé le tcpdump
outil, quelques cas d'utilisation de base et parcouru une maquette d'un scénario du monde réel. Maintenant, je veux creuser un peu plus loin. Tous ceux qui utilisent cet outil dans une situation réelle remarquent immédiatement la quantité d'informations (je crois qu'ils appellent cela "verbeux"...) qui sont présentées à l'utilisateur. L'une des meilleures choses que vous puissiez faire pour vous-même est de trouver un moyen pratique de filtrer les informations dont vous avez besoin. Voyons comment vous pouvez le faire.
Options de filtrage courantes
Le tcpdump
L'outil dispose de plusieurs méthodes intégrées différentes pour filtrer la capture elle-même. Cela signifie que vous pouvez affiner les informations que vous recevez avant même que la capture ne commence. Ceci est hautement préférable et rend le filtrage post-capture beaucoup moins fastidieux. Certains des filtres de pré-capture que vous pouvez utiliser sont les suivants :
Pour filtrer par adresse IP :
$ sudo tcpdump host x.x.x.x
Pour filtrer par interface :
$ sudo tcpdump -i eth0
Pour filtrer par source :
$ sudo tcpdump src x.x.x.x
Pour filtrer par destination :
$ sudo tcpdump dst x.x.x.x
Pour filtrer par protocole :
$ sudo tcpdump icmp
Cette liste ne couvre pas toutes les options disponibles mais vous donne un bon point de départ. Ensuite, regardons quelques-unes des autres façons dont nous pouvons manipuler la capture.
Écrire des captures dans un fichier (pcap)
En raison de la nature du dépannage, je trouve utile de documenter ce que je vois lors de la capture avec tcpdump
. Heureusement, tcpdump
a un format de fichier de sortie qui capture toutes les données que nous voyons. Ce format est appelé capture de paquets file, alias PCAP, et est utilisé dans divers utilitaires, y compris les analyseurs de réseau et tcpdump
. Ici, nous écrivons dans un fichier PACAP appelé output_file en utilisant le -w
commutateur.
[root@server ~]# tcpdump -i enp0s8 -c100 -nn -w output_file
tcpdump: listening on enp0s8, link-type EN10MB (Ethernet), capture size 262144 bytes
100 packets captured
102 packets received by filter
0 packets dropped by kernel
Lecture des fichiers pcap
Vous pouvez lire les fichiers PCAP en utilisant le -r
interrupteur. Juste un avertissement :si vous essayez de lire un fichier PCAP par des moyens conventionnels (cat
, Vim, etc.), vous recevrez du charabia illisible. Si vous souhaitez utiliser ces programmes pour afficher votre sortie, continuez à lire.
$ tcpdump -r output_file
Écrire tcpdump dans .txt
Si vous souhaitez utiliser des moyens conventionnels pour lire votre fichier de sortie, vous devez réexécuter tcpdump
, à l'exclusion du -w
drapeau. Vous pouvez voir ci-dessous que nous utilisons le format standard de sortie vers fichier avec le nom de fichier output.txt .
[root@server ~]# tcpdump -i enp0s8 -c100 -nn > output.txt
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on enp0s8, link-type EN10MB (Ethernet), capture size 262144 bytes
100 packets captured
102 packets received by filter
0 packets dropped by kernel
Exemple
Avant d'aller plus loin, je souhaite vous expliquer le scénario que j'ai mis en place pour la suite de cet article. Nous avons trois machines virtuelles en cours d'exécution sur le même réseau. Le client 1 et le client 2 envoient un ping au serveur sans arrêt. Nous allons capturer le trafic ICMP sur l'interface enp0s8 sur la machine virtuelle du serveur, puis filtrez les paquets de chaque machine cliente. Je me rends compte que c'est un exercice assez simple, mais les principes peuvent être appliqués à des environnements réels plus complexes.
- Serveur - 172.25.1.5
- Client 1 - 172.25.1.4
- Client 2 - 172.25.1.7
Ensuite, nous regardons les deux commandes utilisées pour générer nos captures :
- Écrire dans le fichier PCAP -
tcpdump -i enp0s8 -c100 -nn -w output_file
- Écrire dans le fichier TXT -
tcpdump -i enp0s8 -c100 -nn > output.txt
La seule différence notable ici est le format de sortie. Vous voyez que nous avons capturé le trafic sur l'interface enp0s8 et que nous avons limité la capture à 100 paquets sans nom ni résolution de port. Maintenant, filtrons notre fichier pour n'afficher que le trafic du Client 1.
Pour ce faire, nous utilisons l'une des deux chaînes de commande (selon le format de fichier de notre capture) :
Filtrer la sortie PCAP - tcpdump -r output_file | grep -i 172.25.1.4
[root@server ~]# tcpdump -r output_file | grep -i 172.25.1.4
reading from file output_file, link-type EN10MB (Ethernet)
22:01:14.947643 IP 172.25.1.4 > server.example.com: ICMP echo request, id 1, seq 109, length 64
22:01:14.947704 IP server.example.com > 172.25.1.4: ICMP echo reply, id 1, seq 109, length 64
22:01:16.023097 IP 172.25.1.4 > server.example.com: ICMP echo request, id 1, seq 110, length 64
22:01:16.023153 IP server.example.com > 172.25.1.4: ICMP echo reply, id 1, seq 110, length 64
22:01:17.081338 IP 172.25.1.4 > server.example.com: ICMP echo request, id 1, seq 111, length 64
22:01:17.081386 IP server.example.com > 172.25.1.4: ICMP echo reply, id 1, seq 111, length 64
22:01:18.103740 IP 172.25.1.4 > server.example.com: ICMP echo request, id 1, seq 112, length 64
22:01:18.103784 IP server.example.com > 172.25.1.4: ICMP echo reply, id 1, seq 112, length 64
22:01:19.128568 IP 172.25.1.4 > server.example.com: ICMP echo request, id 1, seq 113, length 64
22:01:19.128646 IP server.example.com > 172.25.1.4: ICMP echo reply, id 1, seq 113, length 64
22:01:20.129531 IP 172.25.1.4 > server.example.com: ICMP echo request, id 1, seq 114, length 64
22:01:20.129577 IP server.example.com > 172.25.1.4: ICMP echo reply, id 1, seq 114, length 64
22:01:21.175573 IP 172.25.1.4 > server.example.com: ICMP echo request, id 1, seq 115, length 64
22:01:21.175631 IP server.example.com > 172.25.1.4: ICMP echo reply, id 1, seq 115, length 64
22:01:22.199852 IP 172.25.1.4 > server.example.com: ICMP echo request, id 1, seq 116, length 64
22:01:22.199899 IP server.example.com > 172.25.1.4: ICMP echo reply, id 1, seq 116, length 64
22:01:23.231032 IP 172.25.1.4 > server.example.com: ICMP echo request, id 1, seq 117, length 64
22:01:23.231083 IP server.example.com > 172.25.1.4: ICMP echo reply, id 1, seq 117, length 64
22:01:24.247585 IP 172.25.1.4 > server.example.com: ICMP echo request, id 1, seq 118, length 64
22:01:24.247660 IP server.example.com > 172.25.1.4: ICMP echo reply, id 1, seq 118, length 64
22:01:25.248875 IP 172.25.1.4 > server.example.com: ICMP echo request, id 1, seq 119, length 64
22:01:25.248937 IP server.example.com > 172.25.1.4: ICMP echo reply, id 1, seq 119, length 64
22:01:26.295889 IP 172.25.1.4 > server.example.com: ICMP echo request, id 1, seq 120, length 64
22:01:26.295946 IP server.example.com > 172.25.1.4: ICMP echo reply, id 1, seq 120, length 64
22:01:27.255274 ARP, Request who-has server.example.com tell 172.25.1.4, length 46
*Edited for length*
ou
Filtrer la sortie TXT - cat output.txt | grep -i 172.25.1.4
[root@server ~]# cat output.txt | grep -i 172.25.1.4
12:03:56.653494 IP 172.25.1.4 > 172.25.1.5: ICMP echo request, id 1, seq 342, length 64
12:03:56.653534 IP 172.25.1.5 > 172.25.1.4: ICMP echo reply, id 1, seq 342, length 64
12:03:57.674036 IP 172.25.1.4 > 172.25.1.5: ICMP echo request, id 1, seq 343, length 64
12:03:57.674089 IP 172.25.1.5 > 172.25.1.4: ICMP echo reply, id 1, seq 343, length 64
12:03:58.701049 IP 172.25.1.4 > 172.25.1.5: ICMP echo request, id 1, seq 344, length 64
12:03:58.701107 IP 172.25.1.5 > 172.25.1.4: ICMP echo reply, id 1, seq 344, length 64
12:03:59.721996 IP 172.25.1.4 > 172.25.1.5: ICMP echo request, id 1, seq 345, length 64
12:03:59.722134 IP 172.25.1.5 > 172.25.1.4: ICMP echo reply, id 1, seq 345, length 64
12:04:00.746748 IP 172.25.1.4 > 172.25.1.5: ICMP echo request, id 1, seq 346, length 64
12:04:00.746805 IP 172.25.1.5 > 172.25.1.4: ICMP echo reply, id 1, seq 346, length 64
12:04:01.774055 IP 172.25.1.4 > 172.25.1.5: ICMP echo request, id 1, seq 347, length 64
12:04:01.774130 IP 172.25.1.5 > 172.25.1.4: ICMP echo reply, id 1, seq 347, length 64
12:04:02.793968 IP 172.25.1.4 > 172.25.1.5: ICMP echo request, id 1, seq 348, length 64
12:04:02.794012 IP 172.25.1.5 > 172.25.1.4: ICMP echo reply, id 1, seq 348, length 64
12:04:03.846026 IP 172.25.1.4 > 172.25.1.5: ICMP echo request, id 1, seq 349, length 64
12:04:03.846082 IP 172.25.1.5 > 172.25.1.4: ICMP echo reply, id 1, seq 349, length 64
12:04:04.918800 IP 172.25.1.4 > 172.25.1.5: ICMP echo request, id 1, seq 350, length 64
12:04:04.918850 IP 172.25.1.5 > 172.25.1.4: ICMP echo reply, id 1, seq 350, length 64
12:04:05.930499 IP 172.25.1.4 > 172.25.1.5: ICMP echo request, id 1, seq 351, length 64
12:04:05.930543 IP 172.25.1.5 > 172.25.1.4: ICMP echo reply, id 1, seq 351, length 64
12:04:06.954222 IP 172.25.1.4 > 172.25.1.5: ICMP echo request, id 1, seq 352, length 64
12:04:06.954269 IP 172.25.1.5 > 172.25.1.4: ICMP echo reply, id 1, seq 352, length 64
12:04:07.990890 IP 172.25.1.4 > 172.25.1.5: ICMP echo request, id 1, seq 353, length 64
12:04:07.990937 IP 172.25.1.5 > 172.25.1.4: ICMP echo reply, id 1, seq 353, length 64
12:04:09.002781 IP 172.25.1.4 > 172.25.1.5: ICMP echo request, id 1, seq 354, length 64
12:04:09.002842 IP 172.25.1.5 > 172.25.1.4: ICMP echo reply, id 1, seq 354, length 64
12:04:10.032385 IP 172.25.1.4 > 172.25.1.5: ICMP echo request, id 1, seq 355, length 64
12:04:10.032451 IP 172.25.1.5 > 172.25.1.4: ICMP echo reply, id 1, seq 355, length 64
12:04:11.055533 IP 172.25.1.4 > 172.25.1.5: ICMP echo request, id 1, seq 356, length 64
12:04:11.055583 IP 172.25.1.5 > 172.25.1.4: ICMP echo reply, id 1, seq 356, length 64
12:04:12.074288 IP 172.25.1.4 > 172.25.1.5: ICMP echo request, id 1, seq 357, length 64
*Edited for length*
Pour vérifier le trafic vers/depuis le Client 2, nous avons seulement besoin de changer l'adresse IP dans le grep
requête. Cette méthode fonctionne pour les noms d'hôte, les numéros de port et tout autre mot clé que vous trouvez dans le fichier de capture. Cet exemple particulier montre la puissance du pré et du post-filtrage. Le pré-filtrage se produit lorsque nous capturons uniquement sur une interface spécifique, et le post-filtrage se produit lorsque nous appliquons un grep
requête au fichier de capture.
La vente à emporter
Ce que j'espère communiquer, c'est que tcpdump
est un outil incroyablement puissant. Pourtant, les technologies puissantes sont souvent truffées d'informations qui pourraient ne pas s'appliquer à vos besoins spécifiques. Avec un peu de réflexion et de planification, vous pouvez pré-filtrer votre capture pour réduire la quantité de trafic capturé, puis utiliser un grep
intelligent ou awk
requête sur le fichier de sortie pour trouver rapidement les interactions de trafic que vous recherchez. Ces stratégies, lorsqu'elles sont correctement appliquées, peuvent accélérer de manière exponentielle les efforts de dépannage. Maintenant, j'espère que vous n'aurez pas à mettre cela en pratique de sitôt.
[ Découvrez comment ajouter l'automatisation à votre boîte à outils de mise en réseau avec cet ebook gratuit. ]