Les captures TCP / IP et UDP peuvent être effectuées à l'aide de tcpdump
/ dumpcap
et produisent un fichier pcap / pcapng qui peut être envoyé à Wireshark pour une analyse plus approfondie. Existe-t-il un outil similaire pour les sockets de domaine Unix nommés? (Une solution générale qui fonctionne pour les sockets abstraites serait bien aussi.)
strace
tel quel n'est pas suffisant, il n'est pas simple de filtrer les E / S des sockets de domaine Unix. Un proxy utilisant socat
ou similaire ne convient pas non plus car l'objectif est une analyse passive pour les programmes ouverts existants.
Comment puis-je obtenir une capture de paquets que je peux utiliser dans Wireshark pour l'analyse? Les exemples d'application de protocole sont X11 (Xorg, mon application actuelle) et cURL / PHP (HTTP). J'ai vu une CONFIG_UNIX_DIAG
option dans le noyau Linux, est-ce utile?
la source
-nolisten tcp
, il n'y a pas de socket TCP. Si tout échoue, je reviendrai probablement sur l'utilisation de xscope ou de votre astuce strace + text2pcap. Je serais toujours intéressé par une capture de socket Unix générique (pour les données uniquement, pas les données de canal latéral).Réponses:
À partir du noyau Linux v4.2-rc5, il n'est pas possible de capturer directement en utilisant les interfaces utilisées par libpcap. libpcap utilise le domaine spécifique à Linux
AF_PACKET
(aliasPF_PACKET
) qui vous permet uniquement de capturer des données pour des données passant par un " netdevice " (comme les interfaces Ethernet).Il n'y a pas d'interface noyau pour la capture à partir de
AF_UNIX
sockets. Les captures Ethernet standard ont un en-tête Ethernet avec la source / destination, etc. Les sockets Unix n'ont pas un tel faux en-tête et le registre des types d'en-tête de couche liaison ne répertorie aucun élément lié à cela.Les points d'entrée de base pour les données sont
unix_stream_recvmsg
etunix_stream_sendmsg
pourSOCK_STREAM
(SOCK_DGRAM
etSOCK_SEQPACKET
ont des fonctions nommées de manière similaire). Les données sont mises en mémoire tampon danssk->sk_receive_queue
et dans launix_stream_sendmsg
fonction , il n'y a pas de code qui conduit finalement à appeler latpacket_rcv
fonction pour les captures de paquets. Voir cette analyse par osgx sur SO pour plus de détails sur les internes de la capture de paquets en général.Revenons à la question d'origine sur la
AF_UNIX
surveillance des sockets, si vous êtes principalement intéressé par les données d'application, vous avez quelques options:strace
et capturez les appels système possibles qui effectuent des E / S. Il y a beaucoup d'entre eux,read
,pread64
,readv
,preadv
,recvmsg
et beaucoup d' autres ... Voir @ Stéphane Chazelas exemplexterm
. L'inconvénient de cette approche est que vous devez d'abord trouver votre descripteur de fichier, puis manquer des appels système. Avec strace, vous pouvez utiliser la-e trace=file
plupart d'entre eux (pread
n'est couvert que par-e trace=desc
, mais il n'est probablement pas utilisé pour les sockets Unix par la plupart des programmes).unix_stream_recvmsg
,unix_stream_sendmsg
(ouunix_dgram_*
ouunix_seqpacket_*
) dans le noyau et affichez les données quelque part. Vous pouvez utiliser SystemTap pour définir de tels points de trace, voici un exemple pour surveiller les messages sortants. Nécessite la prise en charge du noyau et la disponibilité des symboles de débogage .Actif (ne fonctionne que pour les nouveaux processus):
Utilisez un proxy qui écrit également des fichiers. Vous pouvez écrire un multiplexeur rapide vous-même ou pirater quelque chose comme ça qui génère également un pcap (méfiez-vous des limitations, par exemple, vous
AF_UNIX
pouvez passer des descripteurs de fichiers,AF_INET
ne pouvez pas):L'
CONFIG_UNIX_DIAG
option suggérée n'est malheureusement pas utile ici non plus, elle ne peut être utilisée que pour collecter des statistiques, pas pour acquérir des données en temps réel au fur et à mesure (voir linux / unix_diag.h ).Malheureusement, il n'existe actuellement aucun traceur parfait pour les sockets de domaine Unix qui produisent des pcaps (à ma connaissance). Idéalement, il y aurait un format libpcap qui a un en-tête contenant le PID source / dest (lorsqu'il est disponible) suivi de données supplémentaires facultatives (informations d'identification, descripteurs de fichier) et enfin les données. Faute de quoi, le mieux qui puisse être fait est le traçage des appels système.
Informations supplémentaires (pour le lecteur intéressé), voici quelques backtraces (acquises avec GDB se cassant sur
unix_stream_*
etrbreak packet.c:.
, Linux dans QEMU et socat sur Linux 4.2-rc5 principal):la source
J'ai écrit un outil pour capturer et vider le trafic de socket de domaine Unix. Il utilise
bpf/kprobe
pour sonder la fonction du noyauunix_stream_sendmsg
et vider le trafic vers l'espace utilisateur.L'outil dépend
bcc
, vous devez donc d'bcc
abord l' installer .Un exemple de course:
la source