6 votes

Pourquoi tcpdump ne reconnaît-il pas l'entrée par pipeline ?

  1. J'ai obtenu un fichier de capture de paquets :

    $ sudo tcpdump -w file.pcap
  2. Je peux ensuite analyser ce fichier :

    $ tcpdump -r file.pcap

    Je peux même utiliser la redirection de fichiers pour lire à partir de l'entrée standard :

    $ tcpdump -r - < file.pcap
  3. Cependant, je ne peux pas utiliser un tuyau pour lire à partir de l'entrée standard :

    $ cat file.pcap | tcpdump -r -
    tcpdump: unknown file format

    Este devrait travail. Qu'est-ce qui se passe ?

OS X Yosemite 10.10
tcpdump version 4.3.0 -- Apple version 59
libpcap version 1.5.3 - Apple version 47


J'essaie en fait de sudo tcpdump -w - | tee file.pcap | tcpdump -r - ce qui donne lieu au même problème, qui semble toutefois se poser avec n'importe quelle forme d'entrée canalisée.

6voto

micolous Points 66

Ce problème est toujours d'actualité avec OS X Mojave 10.14.2 (libpcap 1.0.1 Apple 79.200.4, tcpdump 4.9.2 Apple 83.200.2). Il s'agit en fait d'un bogue dans les correctifs d'Apple pour libpcap et tcpdump.

En plus de l'utilisation en amont tcpdump (qui est disponible dans Homebrew), vous pouvez aussi :

  • Utilisation tshark (qui fait partie de Wireshark), qui fonctionne de manière similaire à tcpdump .

  • Écrire les paquets dans un fichier temporaire.

  • Préfixe le flux avec 4 octets nuls :

    sudo tcpdump -i en0 -w - | cat <(printf "\0\0\0\0") - | tcpdump -nvr -

Cause (et pourquoi l'insertion de zéros fonctionne)

Apple a apporté un correctif à son logiciel tcpdump de telle sorte qu'il essaie de lire les fichiers au format PCAP-NG en premier :

#else /* __APPLE__ */
        pd = pcap_ng_open_offline(RFileName, ebuf);

Ils ont également ajouté un -P pour émettre des paquets en pcapng format.

pcap_ng_open_offline se retrouve dans pcap_fopen_offline_internal(..., isng=1) . Ce flux appelle pcap_ng_check_header précoce (voir if (isng) en pcap_fopen_offline_internal ), et en cas d'échec, saute dans le bad: étiquette.

Cela bad: l'étiquette tente de fseeko pour rechercher le fichier au début :

 bad:
    fseeko(fp, offset, SEEK_SET);
    if (p != NULL)
        free(p);
    return (NULL);

Mais on ne peut pas chercher un FIFO, donc on lit toujours au même endroit ! fseeko renverrait une erreur, mais cette erreur est ignorée .

Sur pcap_ng_open_offline renvoyant une erreur, le correctif d'Apple appelle alors la fonction pcap_open_offline qui suit un flux de contrôle similaire à celui de pcap normal. Cependant, comme le pointeur de fichier sur la FIFO est encore avancé de 4 octets, le prochain jeu d'en-têtes a la magie de la FIFO, et donc tcpdump abandonne.

Vous pouvez contourner ce problème en insérant 4 NULL au début de votre pipe, avec une petite astuce shell-script :

tcpdump -i en0 -w - | cat <(printf "\0\0\0\0") - | tcpdump -nvr -

Cela signifie que lorsque fseeko Si vous ne réussissez pas, vous serez au bon endroit dans la FIFO pour la magie "réelle".

Cependant, certaines limites subsistent :

  • tcpdump -P (spécifique à Apple pcapng ) ne fonctionne toujours pas.
  • Ces fichiers ne sont plus valides pcap des dossiers. Si vous vouliez le lire avec un autre outil (ou même avec un ordinateur qui n'est pas d'Apple), vous ne seriez pas en mesure de le faire. tcpdump ), vous devrez tee la sortie avant cat .

Cela fonctionne également avec tshark (qui peut produire pcapng et ne fonctionne pas comme source sans cette solution de contournement) :

tshark -F pcapng -w - | cat <(printf "\0\0\0\0") - | tcpdump -nvr -

Toutefois, je ne recommanderais pas d'utiliser cette solution de contournement à long terme. Elle sera interrompue dès qu'Apple aura corrigé ce bogue, ou si vos utilisateurs ont un ordinateur qui n'est pas de marque Apple tcpdump sur OSX (comme avec Homebrew).

1voto

Judith Cohn Points 11

J'ai le même problème avec Mavericks (10.9.5). Ce n'est probablement pas la meilleure réponse, mais j'ai téléchargé la version open source de tcpdump (tcpdump-4.6.2) et je l'ai placée dans mon chemin d'accès avant la version système et elle fonctionne avec des tuyaux. Bien sûr, vous perdez la fonctionnalité supplémentaire spécifique à Apple.

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X