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).