GNU/Linux >> Tutoriels Linux >  >> Linux

Une introduction à l'utilisation de tcpdump sur la ligne de commande Linux

Dans mon expérience en tant qu'administrateur système, j'ai souvent trouvé des problèmes de connectivité réseau difficiles à résoudre. Pour ces situations, tcpdump est un excellent allié.

Le Terminal Linux

  • Les 7 meilleurs émulateurs de terminaux pour Linux
  • 10 outils de ligne de commande pour l'analyse de données sous Linux
  • Télécharger maintenant :Aide-mémoire SSH
  • Aide-mémoire des commandes Linux avancées
  • Tutoriels de ligne de commande Linux

Tcpdump est un utilitaire de ligne de commande qui vous permet de capturer et d'analyser le trafic réseau passant par votre système. Il est souvent utilisé pour aider à résoudre les problèmes de réseau, ainsi qu'un outil de sécurité.

Outil puissant et polyvalent qui comprend de nombreuses options et filtres, tcpdump peut être utilisé dans une variété de cas. Puisqu'il s'agit d'un outil en ligne de commande, il est idéal pour s'exécuter sur des serveurs ou des appareils distants pour lesquels une interface graphique n'est pas disponible, afin de collecter des données pouvant être analysées ultérieurement. Il peut également être lancé en arrière-plan ou en tant que tâche planifiée à l'aide d'outils tels que cron.

Dans cet article, nous examinerons certaines des fonctionnalités les plus courantes de tcpdump.

1. Installation sous Linux

Tcpdump est inclus avec plusieurs distributions Linux, il y a donc de fortes chances que vous l'ayez déjà installé. Vérifiez si tcpdump est installé sur votre système avec la commande suivante :

$ which tcpdump
/usr/sbin/tcpdump

Si tcpdump n'est pas installé, vous pouvez l'installer mais en utilisant le gestionnaire de paquets de votre distribution. Par exemple, sur CentOS ou Red Hat Enterprise Linux, comme ceci :

$ sudo dnf install -y tcpdump

Tcpdump nécessite libpcap , qui est une bibliothèque pour la capture de paquets réseau. S'il n'est pas installé, il sera automatiquement ajouté en tant que dépendance.

Vous êtes prêt à commencer à capturer des paquets.

2. Capturer des paquets avec tcpdump

Pour capturer des paquets à des fins de dépannage ou d'analyse, tcpdump nécessite des autorisations élevées. Ainsi, dans les exemples suivants, la plupart des commandes sont précédées de sudo .

Pour commencer, utilisez la commande tcpdump --list-interfaces (ou -D pour faire court) pour voir quelles interfaces sont disponibles pour la capture :

$ sudo tcpdump -D
1.eth0
2.virbr0
3.eth1
4.any (Pseudo-device that captures on all interfaces)
5.lo [Loopback]

Dans l'exemple ci-dessus, vous pouvez voir toutes les interfaces disponibles dans ma machine. L'interface spéciale any permet la capture dans n'importe quelle interface active.

Utilisons-le pour commencer à capturer des paquets. Capturez tous les paquets dans n'importe quelle interface en exécutant cette commande :

$ sudo tcpdump --interface any
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
09:56:18.293641 IP rhel75.localdomain.ssh > 192.168.64.1.56322: Flags [P.], seq 3770820720:3770820916, ack 3503648727, win 309, options [nop,nop,TS val 76577898 ecr 510770929], length 196
09:56:18.293794 IP 192.168.64.1.56322 > rhel75.localdomain.ssh: Flags [.], ack 196, win 391, options [nop,nop,TS val 510771017 ecr 76577898], length 0
09:56:18.295058 IP rhel75.59883 > gateway.domain: 2486+ PTR? 1.64.168.192.in-addr.arpa. (43)
09:56:18.310225 IP gateway.domain > rhel75.59883: 2486 NXDomain* 0/1/0 (102)
09:56:18.312482 IP rhel75.49685 > gateway.domain: 34242+ PTR? 28.64.168.192.in-addr.arpa. (44)
09:56:18.322425 IP gateway.domain > rhel75.49685: 34242 NXDomain* 0/1/0 (103)
09:56:18.323164 IP rhel75.56631 > gateway.domain: 29904+ PTR? 1.122.168.192.in-addr.arpa. (44)
09:56:18.323342 IP rhel75.localdomain.ssh > 192.168.64.1.56322: Flags [P.], seq 196:584, ack 1, win 309, options [nop,nop,TS val 76577928 ecr 510771017], length 388
09:56:18.323563 IP 192.168.64.1.56322 > rhel75.localdomain.ssh: Flags [.], ack 584, win 411, options [nop,nop,TS val 510771047 ecr 76577928], length 0
09:56:18.335569 IP gateway.domain > rhel75.56631: 29904 NXDomain* 0/1/0 (103)
09:56:18.336429 IP rhel75.44007 > gateway.domain: 61677+ PTR? 98.122.168.192.in-addr.arpa. (45)
09:56:18.336655 IP gateway.domain > rhel75.44007: 61677* 1/0/0 PTR rhel75. (65)
09:56:18.337177 IP rhel75.localdomain.ssh > 192.168.64.1.56322: Flags [P.], seq 584:1644, ack 1, win 309, options [nop,nop,TS val 76577942 ecr 510771047], length 1060

---- SKIPPING LONG OUTPUT -----

09:56:19.342939 IP 192.168.64.1.56322 > rhel75.localdomain.ssh: Flags [.], ack 1752016, win 1444, options [nop,nop,TS val 510772067 ecr 76578948], length 0
^C
9003 packets captured
9010 packets received by filter
7 packets dropped by kernel
$

Tcpdump continue de capturer les paquets jusqu'à ce qu'il reçoive un signal d'interruption. Vous pouvez interrompre la capture en appuyant sur Ctrl+C . Comme vous pouvez le voir dans cet exemple, tcpdump capturé plus de 9 000 paquets. Dans ce cas, puisque je suis connecté à ce serveur en utilisant ssh , tcpdump a capturé tous ces paquets. Pour limiter le nombre de paquets capturés et arrêter tcpdump , utilisez le -c (pour compter ) :

$ sudo tcpdump -i any -c 5
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:21:30.242740 IP rhel75.localdomain.ssh > 192.168.64.1.56322: Flags [P.], seq 3772575680:3772575876, ack 3503651743, win 309, options [nop,nop,TS val 81689848 ecr 515883153], length 196
11:21:30.242906 IP 192.168.64.1.56322 > rhel75.localdomain.ssh: Flags [.], ack 196, win 1443, options [nop,nop,TS val 515883235 ecr 81689848], length 0
11:21:30.244442 IP rhel75.43634 > gateway.domain: 57680+ PTR? 1.64.168.192.in-addr.arpa. (43)
11:21:30.244829 IP gateway.domain > rhel75.43634: 57680 NXDomain 0/0/0 (43)
11:21:30.247048 IP rhel75.33696 > gateway.domain: 37429+ PTR? 28.64.168.192.in-addr.arpa. (44)
5 packets captured
12 packets received by filter
0 packets dropped by kernel
$

Dans ce cas, tcpdump a cessé de capturer automatiquement après avoir capturé cinq paquets. Ceci est utile dans différents scénarios, par exemple, si vous dépannez la connectivité et que la capture de quelques paquets initiaux est suffisante. Ceci est encore plus utile lorsque nous appliquons des filtres pour capturer des paquets spécifiques (voir ci-dessous).

Par défaut, tcpdump résout les adresses IP et les ports en noms, comme illustré dans l'exemple précédent. 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; désactiver la résolution de nom en utilisant l'option -n et la résolution de port avec -nn :

$ sudo tcpdump -i any -c5 -nn
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
23:56:24.292206 IP 192.168.64.28.22 > 192.168.64.1.35110: Flags [P.], seq 166198580:166198776, ack 2414541257, win 309, options [nop,nop,TS val 615664 ecr 540031155], length 196
23:56:24.292357 IP 192.168.64.1.35110 > 192.168.64.28.22: Flags [.], ack 196, win 1377, options [nop,nop,TS val 540031229 ecr 615664], length 0
23:56:24.292570 IP 192.168.64.28.22 > 192.168.64.1.35110: Flags [P.], seq 196:568, ack 1, win 309, options [nop,nop,TS val 615664 ecr 540031229], length 372
23:56:24.292655 IP 192.168.64.1.35110 > 192.168.64.28.22: Flags [.], ack 568, win 1400, options [nop,nop,TS val 540031229 ecr 615664], length 0
23:56:24.292752 IP 192.168.64.28.22 > 192.168.64.1.35110: Flags [P.], seq 568:908, ack 1, win 309, options [nop,nop,TS val 615664 ecr 540031229], length 340
5 packets captured
6 packets received by filter
0 packets dropped by kernel

Comme indiqué ci-dessus, la sortie de capture affiche désormais les adresses IP et les numéros de port. Cela empêche également tcpdump d'émettre des recherches DNS, ce qui contribue à réduire le trafic réseau tout en résolvant les problèmes de réseau.

Maintenant que vous êtes en mesure de capturer des paquets réseau, explorons ce que signifie cette sortie.

3. Comprendre le format de sortie

Tcpdump est capable de capturer et de décoder de nombreux protocoles différents, tels que TCP, UDP, ICMP et bien d'autres. Bien que nous ne puissions pas tous les couvrir ici, pour vous aider à démarrer, explorons le paquet TCP. Vous pouvez trouver plus de détails sur les différents formats de protocole dans les pages de manuel de tcpdump. Un paquet TCP typique capturé par tcpdump ressemble à ceci :

08:41:13.729687 IP 192.168.64.28.22 > 192.168.64.1.41916: Flags [P.], seq 196:568, ack 1, win 309, options [nop,nop,TS val 117964079 ecr 816509256], length 372

Les champs peuvent varier selon le type de paquet envoyé, mais c'est le format général.

Le premier champ, 08:41:13.729687, 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, 192.168.64.28.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 192.168.64.1.41916 .

Après la source et la destination, vous pouvez trouver les drapeaux TCP Flags [P.] . Les valeurs typiques pour ce champ incluent :

Valeur Type de drapeau Description
S SYN Démarrage de la connexion
F FIN Fin de la connexion
P APPUYER Push de données
R RST Réinitialisation de la connexion
. ACK Reconnaissance

Ce champ peut également être une combinaison de ces valeurs, comme [S.] pour un SYN-ACK paquet.

Vient ensuite le numéro de séquence des données contenues dans le paquet. Pour le premier paquet capturé, il s'agit d'un nombre absolu. Les paquets suivants utilisent un nombre relatif pour faciliter le suivi. Dans cet exemple, la séquence est seq 196:568, ce qui signifie que ce paquet contient les octets 196 à 568 de ce flux.

Ceci est suivi du numéro d'accusé de réception :ack 1 . Dans ce cas, c'est 1 puisque c'est le côté qui envoie les données. Pour le côté recevant les données, ce champ représente le prochain octet (données) attendu sur ce flux. Par exemple, le numéro d'accusé de réception du paquet suivant dans ce flux serait 568.

Le champ suivant est la taille de la fenêtre win 309 , qui représente le nombre d'octets disponibles dans le tampon de réception, suivi d'options TCP telles que MSS (Maximum Segment Size) ou Window Scale. Pour plus de détails sur les options de protocole TCP, consultez Paramètres TCP (Transmission Control Protocol).

Enfin, nous avons la longueur du paquet, length 372 , qui représente la longueur, en octets, des données utiles. La longueur est la différence entre le dernier et le premier octet du numéro de séquence.

Voyons maintenant comment filtrer les paquets pour affiner les résultats et faciliter le dépannage de problèmes spécifiques.

4. Filtrer les paquets

Comme mentionné ci-dessus, tcpdump peut capturer trop de paquets, dont certains ne sont même pas liés au problème que vous résolvez. Par exemple, si vous résolvez un problème de connectivité avec un serveur Web, vous n'êtes pas intéressé par le trafic SSH. Par conséquent, la suppression des paquets SSH de la sortie facilite le travail sur le vrai problème.

L'une des fonctionnalités les plus puissantes de tcpdump est sa capacité à filtrer les paquets capturés à l'aide de divers paramètres, tels que les adresses IP source et de destination, les ports, les protocoles, etc. Examinons quelques-uns des plus courants.

Protocole

Pour filtrer les paquets en fonction du protocole, spécifiez le protocole dans la ligne de commande. Par exemple, capturez les paquets ICMP uniquement à l'aide de cette commande :

$ sudo tcpdump -i any -c5 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

Dans un autre terminal, essayez d'envoyer un ping à une autre machine :

$ ping opensource.com
PING opensource.com (54.204.39.132) 56(84) bytes of data.
64 bytes from ec2-54-204-39-132.compute-1.amazonaws.com (54.204.39.132): icmp_seq=1 ttl=47 time=39.6 ms

De retour dans la capture tcpdump, notez que tcpdump capture et affiche uniquement les paquets liés à ICMP. Dans ce cas, tcpdump n'affiche pas les paquets de résolution de noms qui ont été générés lors de la résolution du nom opensource.com :

09:34:20.136766 IP rhel75 > ec2-54-204-39-132.compute-1.amazonaws.com: ICMP echo request, id 20361, seq 1, length 64
09:34:20.176402 IP ec2-54-204-39-132.compute-1.amazonaws.com > rhel75: ICMP echo reply, id 20361, seq 1, length 64
09:34:21.140230 IP rhel75 > ec2-54-204-39-132.compute-1.amazonaws.com: ICMP echo request, id 20361, seq 2, length 64
09:34:21.180020 IP ec2-54-204-39-132.compute-1.amazonaws.com > rhel75: ICMP echo reply, id 20361, seq 2, length 64
09:34:22.141777 IP rhel75 > ec2-54-204-39-132.compute-1.amazonaws.com: ICMP echo request, id 20361, seq 3, length 64
5 packets captured
5 packets received by filter
0 packets dropped by kernel

Hébergeur

Limitez la capture aux seuls paquets liés à un hôte spécifique en utilisant le host filtre :

$ sudo tcpdump -i any -c5 -nn host 54.204.39.132
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
09:54:20.042023 IP 192.168.122.98.39326 > 54.204.39.132.80: Flags [S], seq 1375157070, win 29200, options [mss 1460,sackOK,TS val 122350391 ecr 0,nop,wscale 7], length 0
09:54:20.088127 IP 54.204.39.132.80 > 192.168.122.98.39326: Flags [S.], seq 1935542841, ack 1375157071, win 28960, options [mss 1460,sackOK,TS val 522713542 ecr 122350391,nop,wscale 9], length 0
09:54:20.088204 IP 192.168.122.98.39326 > 54.204.39.132.80: Flags [.], ack 1, win 229, options [nop,nop,TS val 122350437 ecr 522713542], length 0
09:54:20.088734 IP 192.168.122.98.39326 > 54.204.39.132.80: Flags [P.], seq 1:113, ack 1, win 229, options [nop,nop,TS val 122350438 ecr 522713542], length 112: HTTP: GET / HTTP/1.1
09:54:20.129733 IP 54.204.39.132.80 > 192.168.122.98.39326: Flags [.], ack 113, win 57, options [nop,nop,TS val 522713552 ecr 122350438], length 0
5 packets captured
5 packets received by filter
0 packets dropped by kernel

Dans cet exemple, tcpdump capture et affiche uniquement les paquets vers et depuis l'hôte 54.204.39.132 .

Port

Pour filtrer les paquets en fonction du service ou du port souhaité, utilisez le port filtre. Par exemple, capturez les paquets liés à un service Web (HTTP) à l'aide de cette commande :

$ sudo tcpdump -i any -c5 -nn port 80
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
09:58:28.790548 IP 192.168.122.98.39330 > 54.204.39.132.80: Flags [S], seq 1745665159, win 29200, options [mss 1460,sackOK,TS val 122599140 ecr 0,nop,wscale 7], length 0
09:58:28.834026 IP 54.204.39.132.80 > 192.168.122.98.39330: Flags [S.], seq 4063583040, ack 1745665160, win 28960, options [mss 1460,sackOK,TS val 522775728 ecr 122599140,nop,wscale 9], length 0
09:58:28.834093 IP 192.168.122.98.39330 > 54.204.39.132.80: Flags [.], ack 1, win 229, options [nop,nop,TS val 122599183 ecr 522775728], length 0
09:58:28.834588 IP 192.168.122.98.39330 > 54.204.39.132.80: Flags [P.], seq 1:113, ack 1, win 229, options [nop,nop,TS val 122599184 ecr 522775728], length 112: HTTP: GET / HTTP/1.1
09:58:28.878445 IP 54.204.39.132.80 > 192.168.122.98.39330: Flags [.], ack 113, win 57, options [nop,nop,TS val 522775739 ecr 122599184], length 0
5 packets captured
5 packets received by filter
0 packets dropped by kernel

IP source/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 les paquets de l'hôte 192.168.122.98 :

$ sudo tcpdump -i any -c5 -nn src 192.168.122.98
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:02:15.220824 IP 192.168.122.98.39436 > 192.168.122.1.53: 59332+ A? opensource.com. (32)
10:02:15.220862 IP 192.168.122.98.39436 > 192.168.122.1.53: 20749+ AAAA? opensource.com. (32)
10:02:15.364062 IP 192.168.122.98.39334 > 54.204.39.132.80: Flags [S], seq 1108640533, win 29200, options [mss 1460,sackOK,TS val 122825713 ecr 0,nop,wscale 7], length 0
10:02:15.409229 IP 192.168.122.98.39334 > 54.204.39.132.80: Flags [.], ack 669337581, win 229, options [nop,nop,TS val 122825758 ecr 522832372], length 0
10:02:15.409667 IP 192.168.122.98.39334 > 54.204.39.132.80: Flags [P.], seq 0:112, ack 1, win 229, options [nop,nop,TS val 122825759 ecr 522832372], length 112: HTTP: GET / HTTP/1.1
5 packets captured
5 packets received by filter
0 packets dropped by kernel

Notez que tcpdumps a capturé des paquets avec l'adresse IP source 192.168.122.98 pour plusieurs services tels que la résolution de noms (port 53) et HTTP (port 80). Les paquets de réponse ne sont pas affichés car leur IP source est différente.

Inversement, vous pouvez utiliser le dst filter pour filtrer par adresse IP/nom d'hôte de destination :

$ sudo tcpdump -i any -c5 -nn dst 192.168.122.98
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:05:03.572931 IP 192.168.122.1.53 > 192.168.122.98.47049: 2248 1/0/0 A 54.204.39.132 (48)
10:05:03.572944 IP 192.168.122.1.53 > 192.168.122.98.47049: 33770 0/0/0 (32)
10:05:03.621833 IP 54.204.39.132.80 > 192.168.122.98.39338: Flags [S.], seq 3474204576, ack 3256851264, win 28960, options [mss 1460,sackOK,TS val 522874425 ecr 122993922,nop,wscale 9], length 0
10:05:03.667767 IP 54.204.39.132.80 > 192.168.122.98.39338: Flags [.], ack 113, win 57, options [nop,nop,TS val 522874436 ecr 122993972], length 0
10:05:03.672221 IP 54.204.39.132.80 > 192.168.122.98.39338: Flags [P.], seq 1:643, ack 113, win 57, options [nop,nop,TS val 522874437 ecr 122993972], length 642: HTTP: HTTP/1.1 302 Found
5 packets captured
5 packets received by filter
0 packets dropped by kernel

Expressions complexes

Vous pouvez également combiner des filtres en utilisant les opérateurs logiques and et or pour créer des expressions plus complexes. Par exemple, pour filtrer les paquets à partir de l'adresse IP source 192.168.122.98 et service HTTP uniquement, utilisez cette commande :

$ sudo tcpdump -i any -c5 -nn src 192.168.122.98 and port 80
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:08:00.472696 IP 192.168.122.98.39342 > 54.204.39.132.80: Flags [S], seq 2712685325, win 29200, options [mss 1460,sackOK,TS val 123170822 ecr 0,nop,wscale 7], length 0
10:08:00.516118 IP 192.168.122.98.39342 > 54.204.39.132.80: Flags [.], ack 268723504, win 229, options [nop,nop,TS val 123170865 ecr 522918648], length 0
10:08:00.516583 IP 192.168.122.98.39342 > 54.204.39.132.80: Flags [P.], seq 0:112, ack 1, win 229, options [nop,nop,TS val 123170866 ecr 522918648], length 112: HTTP: GET / HTTP/1.1
10:08:00.567044 IP 192.168.122.98.39342 > 54.204.39.132.80: Flags [.], ack 643, win 239, options [nop,nop,TS val 123170916 ecr 522918661], length 0
10:08:00.788153 IP 192.168.122.98.39342 > 54.204.39.132.80: Flags [F.], seq 112, ack 643, win 239, options [nop,nop,TS val 123171137 ecr 522918661], length 0
5 packets captured
5 packets received by filter
0 packets dropped by kernel

Vous pouvez créer des expressions plus complexes en regroupant le filtre avec des parenthèses. Dans ce cas, placez l'intégralité de l'expression de filtre entre guillemets pour éviter que le shell ne les confond avec des expressions de shell :

$ sudo tcpdump -i any -c5 -nn "port 80 and (src 192.168.122.98 or src 54.204.39.132)"
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:10:37.602214 IP 192.168.122.98.39346 > 54.204.39.132.80: Flags [S], seq 871108679, win 29200, options [mss 1460,sackOK,TS val 123327951 ecr 0,nop,wscale 7], length 0
10:10:37.650651 IP 54.204.39.132.80 > 192.168.122.98.39346: Flags [S.], seq 854753193, ack 871108680, win 28960, options [mss 1460,sackOK,TS val 522957932 ecr 123327951,nop,wscale 9], length 0
10:10:37.650708 IP 192.168.122.98.39346 > 54.204.39.132.80: Flags [.], ack 1, win 229, options [nop,nop,TS val 123328000 ecr 522957932], length 0
10:10:37.651097 IP 192.168.122.98.39346 > 54.204.39.132.80: Flags [P.], seq 1:113, ack 1, win 229, options [nop,nop,TS val 123328000 ecr 522957932], length 112: HTTP: GET / HTTP/1.1
10:10:37.692900 IP 54.204.39.132.80 > 192.168.122.98.39346: Flags [.], ack 113, win 57, options [nop,nop,TS val 522957942 ecr 123328000], length 0
5 packets captured
5 packets received by filter
0 packets dropped by kernel

Dans cet exemple, nous filtrons les paquets pour le service HTTP uniquement (port 80) et les adresses IP source 192.168.122.98 ou 54.204.39.132 . C'est un moyen rapide d'examiner les deux côtés d'un même flux.

5. Vérification du contenu du paquet

Dans les exemples précédents, nous vérifions uniquement les en-têtes des paquets pour des informations telles que la source, les destinations, les ports, etc. Parfois, c'est tout ce dont nous avons besoin pour résoudre les problèmes de connectivité réseau. Parfois, cependant, nous devons inspecter le contenu du paquet pour nous assurer que le message que nous envoyons contient ce dont nous avons besoin ou que nous avons reçu la réponse attendue. Pour voir le contenu du paquet, tcpdump fournit deux drapeaux supplémentaires :-X pour imprimer le contenu en hexadécimal, et ASCII ou -A pour imprimer le contenu en ASCII.

Par exemple, inspectez le contenu HTTP d'une requête Web comme ceci :

$ sudo tcpdump -i any -c10 -nn -A port 80
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
13:02:14.871803 IP 192.168.122.98.39366 > 54.204.39.132.80: Flags [S], seq 2546602048, win 29200, options [mss 1460,sackOK,TS val 133625221 ecr 0,nop,wscale 7], length 0
E..<..@[email protected].'[email protected]............
............................
13:02:14.910734 IP 54.204.39.132.80 > 192.168.122.98.39366: Flags [S.], seq 1877348646, ack 2546602049, win 28960, options [mss 1460,sackOK,TS val 525532247 ecr 133625221,nop,wscale 9], length 0
E..<..@./..a6.'...zb.P..o..&...A..q a..........
.R.W.......     ................
13:02:14.910832 IP 192.168.122.98.39366 > 54.204.39.132.80: Flags [.], ack 1, win 229, options [nop,nop,TS val 133625260 ecr 525532247], length 0
E..4..@[email protected].'....P...Ao..'...........
.....R.W................
13:02:14.911808 IP 192.168.122.98.39366 > 54.204.39.132.80: Flags [P.], seq 1:113, ack 1, win 229, options [nop,nop,TS val 133625261 ecr 525532247], length 112: HTTP: GET / HTTP/1.1
E.....@[email protected].'....P...Ao..'...........
.....R.WGET / HTTP/1.1
User-Agent: Wget/1.14 (linux-gnu)
Accept: */*
Host: opensource.com
Connection: Keep-Alive

................
13:02:14.951199 IP 54.204.39.132.80 > 192.168.122.98.39366: Flags [.], ack 113, win 57, options [nop,nop,TS val 525532257 ecr 133625261], length 0
E..4.F@./.."6.'...zb.P..o..'.......9.2.....
.R.a....................
13:02:14.955030 IP 54.204.39.132.80 > 192.168.122.98.39366: Flags [P.], seq 1:643, ack 113, win 57, options [nop,nop,TS val 525532258 ecr 133625261], length 642: HTTP: HTTP/1.1 302 Found
E....G@./...6.'...zb.P..o..'.......9.......
.R.b....HTTP/1.1 302 Found
Server: nginx
Date: Sun, 23 Sep 2018 17:02:14 GMT
Content-Type: text/html; charset=iso-8859-1
Content-Length: 207
X-Content-Type-Options: nosniff
Location: https://opensource.com/
Cache-Control: max-age=1209600
Expires: Sun, 07 Oct 2018 17:02:14 GMT
X-Request-ID: v-6baa3acc-bf52-11e8-9195-22000ab8cf2d
X-Varnish: 632951979
Age: 0
Via: 1.1 varnish (Varnish/5.2)
X-Cache: MISS
Connection: keep-alive

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>302 Found</title>
</head><body>
<h1>Found</h1>
<p>The document has moved <a href="https://opensource.com/%3C/span%3Ehttps%3A%3Cspan%20class%3D"sy0">//opensource.com/">here</a>.</p>
</body></html>
................
13:02:14.955083 IP 192.168.122.98.39366 > 54.204.39.132.80: Flags [.], ack 643, win 239, options [nop,nop,TS val 133625304 ecr 525532258], length 0
E..4..@[email protected].'....P....o..............
.....R.b................
13:02:15.195524 IP 192.168.122.98.39366 > 54.204.39.132.80: Flags [F.], seq 113, ack 643, win 239, options [nop,nop,TS val 133625545 ecr 525532258], length 0
E..4..@[email protected].'....P....o..............
.....R.b................
13:02:15.236592 IP 54.204.39.132.80 > 192.168.122.98.39366: Flags [F.], seq 643, ack 114, win 57, options [nop,nop,TS val 525532329 ecr 133625545], length 0
E..4.H@./.. 6.'...zb.P..o..........9.I.....
.R......................
13:02:15.236656 IP 192.168.122.98.39366 > 54.204.39.132.80: Flags [.], ack 644, win 239, options [nop,nop,TS val 133625586 ecr 525532329], length 0
E..4..@[email protected].'....P....o..............
.....R..................
10 packets captured
10 packets received by filter
0 packets dropped by kernel

Ceci est utile pour résoudre les problèmes liés aux appels d'API, en supposant que les appels utilisent le protocole HTTP simple. Pour les connexions chiffrées, cette sortie est moins utile.

6. Enregistrement des captures dans un fichier

Une autre fonctionnalité utile fournie par tcpdump est la possibilité d'enregistrer la capture dans un fichier afin que vous puissiez analyser les résultats ultérieurement. Cela vous permet de capturer des paquets en mode batch pendant la nuit, par exemple, et de vérifier les résultats le matin. Cela aide également lorsqu'il y a trop de paquets à analyser, car la capture en temps réel peut se produire trop rapidement.

Pour enregistrer les paquets dans un fichier au lieu de les afficher à l'écran, utilisez l'option -w (pour écrire ):

$ sudo tcpdump -i any -c10 -nn -w webserver.pcap port 80
[sudo] password for ricardo:
tcpdump: listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes
10 packets captured
10 packets received by filter
0 packets dropped by kernel

Cette commande enregistre la sortie dans un fichier nommé webserver.pcap . Le .pcap signifie "capture de paquets" et est la convention pour ce format de fichier.

Comme le montre cet exemple, rien ne s'affiche à l'écran et la capture se termine après la capture de 10 paquets, selon l'option -c10 . Si vous voulez des commentaires pour vous assurer que les paquets sont capturés, utilisez l'option -v .

Tcpdump crée un fichier au format binaire, vous ne pouvez donc pas simplement l'ouvrir avec un éditeur de texte. Pour lire le contenu du fichier, exécutez tcpdump avec le -r (pour lire ) :

$ tcpdump -nn -r webserver.pcap
reading from file webserver.pcap, link-type LINUX_SLL (Linux cooked)
13:36:57.679494 IP 192.168.122.98.39378 > 54.204.39.132.80: Flags [S], seq 3709732619, win 29200, options [mss 1460,sackOK,TS val 135708029 ecr 0,nop,wscale 7], length 0
13:36:57.718932 IP 54.204.39.132.80 > 192.168.122.98.39378: Flags [S.], seq 1999298316, ack 3709732620, win 28960, options [mss 1460,sackOK,TS val 526052949 ecr 135708029,nop,wscale 9], length 0
13:36:57.719005 IP 192.168.122.98.39378 > 54.204.39.132.80: Flags [.], ack 1, win 229, options [nop,nop,TS val 135708068 ecr 526052949], length 0
13:36:57.719186 IP 192.168.122.98.39378 > 54.204.39.132.80: Flags [P.], seq 1:113, ack 1, win 229, options [nop,nop,TS val 135708068 ecr 526052949], length 112: HTTP: GET / HTTP/1.1
13:36:57.756979 IP 54.204.39.132.80 > 192.168.122.98.39378: Flags [.], ack 113, win 57, options [nop,nop,TS val 526052959 ecr 135708068], length 0
13:36:57.760122 IP 54.204.39.132.80 > 192.168.122.98.39378: Flags [P.], seq 1:643, ack 113, win 57, options [nop,nop,TS val 526052959 ecr 135708068], length 642: HTTP: HTTP/1.1 302 Found
13:36:57.760182 IP 192.168.122.98.39378 > 54.204.39.132.80: Flags [.], ack 643, win 239, options [nop,nop,TS val 135708109 ecr 526052959], length 0
13:36:57.977602 IP 192.168.122.98.39378 > 54.204.39.132.80: Flags [F.], seq 113, ack 643, win 239, options [nop,nop,TS val 135708327 ecr 526052959], length 0
13:36:58.022089 IP 54.204.39.132.80 > 192.168.122.98.39378: Flags [F.], seq 643, ack 114, win 57, options [nop,nop,TS val 526053025 ecr 135708327], length 0
13:36:58.022132 IP 192.168.122.98.39378 > 54.204.39.132.80: Flags [.], ack 644, win 239, options [nop,nop,TS val 135708371 ecr 526053025], length 0
$

Puisque vous ne capturez plus les paquets directement depuis l'interface réseau, sudo n'est pas nécessaire pour lire le fichier.

Vous pouvez également utiliser l'un des filtres dont nous avons parlé pour filtrer le contenu du fichier, comme vous le feriez avec des données en temps réel. Par exemple, inspectez les paquets dans le fichier de capture à partir de l'adresse IP source 54.204.39.132 en exécutant cette commande :

$ tcpdump -nn -r webserver.pcap src 54.204.39.132
reading from file webserver.pcap, link-type LINUX_SLL (Linux cooked)
13:36:57.718932 IP 54.204.39.132.80 > 192.168.122.98.39378: Flags [S.], seq 1999298316, ack 3709732620, win 28960, options [mss 1460,sackOK,TS val 526052949 ecr 135708029,nop,wscale 9], length 0
13:36:57.756979 IP 54.204.39.132.80 > 192.168.122.98.39378: Flags [.], ack 113, win 57, options [nop,nop,TS val 526052959 ecr 135708068], length 0
13:36:57.760122 IP 54.204.39.132.80 > 192.168.122.98.39378: Flags [P.], seq 1:643, ack 113, win 57, options [nop,nop,TS val 526052959 ecr 135708068], length 642: HTTP: HTTP/1.1 302 Found
13:36:58.022089 IP 54.204.39.132.80 > 192.168.122.98.39378: Flags [F.], seq 643, ack 114, win 57, options [nop,nop,TS val 526053025 ecr 135708327], length 0

Quelle est la prochaine ?

Ces fonctionnalités de base de tcpdump vous aideront à démarrer avec cet outil puissant et polyvalent. Pour en savoir plus, consultez le site Web et les pages de manuel de tcpdump.

The tcpdump command line interface provides great flexibility for capturing and analyzing network traffic. If you need a graphical tool to understand more complex flows, look at Wireshark.

One benefit of Wireshark is that it can read .pcap files captured by tcpdump. You can use tcpdump to capture packets in a remote machine that does not have a GUI and analyze the result file with Wireshark, but that is a topic for another day.


This article was originally published in October 2018 and has been updated by Seth Kenlon.


Linux
  1. 8 conseils pour la ligne de commande Linux

  2. Introduction à la commande Linux chown

  3. Comment extraire le fichier tar.gz sous Linux à l'aide de la ligne de commande

  4. Comment supprimer un utilisateur sous Linux à l'aide de la ligne de commande

  5. Introduction à la commande alternatives sous Linux

Résoudre Wordle en utilisant la ligne de commande Linux

Utiliser plus pour afficher les fichiers texte sur la ligne de commande Linux

Utilisation de less pour afficher les fichiers texte sur la ligne de commande Linux

Utilisation de la commande gratuite Linux

Maîtrisez la ligne de commande Linux

Tutoriel sur l'utilisation de la commande Timeout sous Linux