Las capturas TCP / IP y UDP se pueden hacer usando tcpdump/ dumpcapy produce un archivo pcap / pcapng que se puede alimentar a Wireshark para su posterior análisis. ¿Existe una herramienta similar para los sockets de dominio Unix con nombre? (Sin embargo, una solución general que funcione para sockets abstractos también sería buena).
straceas-is no es suficiente, no es sencillo filtrar por E / S de sockets de dominio Unix. Un proxy que usa socato no tampoco es adecuado ya que el objetivo es el análisis pasivo de los programas abiertos existentes.
¿Cómo puedo obtener una captura de paquetes que pueda usar en Wireshark para el análisis? Las aplicaciones de protocolo de ejemplo son X11 (Xorg, mi aplicación actual) y cURL / PHP (HTTP). He visto una CONFIG_UNIX_DIAGopción en el kernel de Linux, ¿es útil?
fuente

-nolisten tcp, no hay un socket TCP. Si todo falla, probablemente volveré a usar xscope o tu truco ordenado strace + text2pcap. Sin embargo, todavía estaría interesado en una captura genérica de socket Unix (solo para datos, no datos de canal lateral).Respuestas:
A partir del kernel de Linux v4.2-rc5, no es posible capturar directamente utilizando las interfaces que libpcap está utilizando. libpcap utiliza el dominio específico de Linux
AF_PACKET(aliasPF_PACKET) que solo le permite capturar datos para los datos que pasan por un " dispositivo de red " (como las interfaces Ethernet).No hay interfaz de kernel para capturar desde
AF_UNIXsockets. Las capturas estándar de Ethernet tienen un encabezado Ethernet con origen / destino, etc. Los sockets Unix no tienen dicho encabezado falso y el registro de tipos de encabezado de capa de enlace no enumera nada relacionado con esto.Los puntos de entrada básicos para los datos son
unix_stream_recvmsgyunix_stream_sendmsgparaSOCK_STREAM(SOCK_DGRAMySOCK_SEQPACKETtienen funciones con nombres similares). Los datos están almacenados ensk->sk_receive_queuelaunix_stream_sendmsgfunción , y no hay ningún código que finalmente lleve a llamar a latpacket_rcvfunción para la captura de paquetes. Consulte este análisis de osgx en SO para obtener más detalles sobre los aspectos internos de la captura de paquetes en general.Volviendo a la pregunta original sobre el
AF_UNIXmonitoreo de sockets, si está interesado principalmente en los datos de la aplicación, tiene algunas opciones:stracey capture las posibles llamadas al sistema que realizan E / S. Hay un montón de ellos,read,pread64,readv,preadv,recvmsgy muchos más ... Ver @ Stéphane Chazelas ejemplo paraxterm. La desventaja de este enfoque es que primero tiene que encontrar su descriptor de archivo y luego aún puede perder llamadas del sistema. Con strace puedes usarlo-e trace=filepara la mayoría de ellos (preadsolo está cubierto por-e trace=desc, pero probablemente no se usa para sockets Unix en la mayoría de los programas).unix_stream_recvmsg,unix_stream_sendmsg(ounix_dgram_*ounix_seqpacket_*) en el núcleo y generar los datos, en algún lugar. Puede usar SystemTap para configurar dichos puntos de rastreo, aquí hay un ejemplo para monitorear los mensajes salientes. Requiere soporte de kernel y disponibilidad de símbolos de depuración .Activo (solo funciona para nuevos procesos):
Use un proxy que también escriba archivos. Puede escribir un multiplexor rápido usted mismo o piratear algo como esto que también genera un pcap (tenga cuidado con las limitaciones, por ejemplo,
AF_UNIXpuede pasar descriptores de archivo,AF_INETno puede):CONFIG_UNIX_DIAGDesafortunadamente, la opción sugerida tampoco es útil aquí, solo se puede usar para recopilar estadísticas, no para adquirir datos en tiempo real a medida que fluyen (consulte linux / unix_diag.h ).Desafortunadamente, no hay trazadores perfectos en este momento para los sockets de dominio Unix que producen pcaps (que yo sepa). Lo ideal sería un formato libpcap que tenga un encabezado que contenga el PID de origen / destino (cuando esté disponible) seguido de datos adicionales opcionales (credenciales, descriptores de archivo) y finalmente los datos. A falta de eso, lo mejor que se puede hacer es el seguimiento de syscall.
Información adicional (para el lector interesado), aquí hay algunos retrocesos (adquiridos con GDB rompiendo
unix_stream_*yrbreak packet.c:.Linux en QEMU y socat en Linux 4.2-rc5 mainline):fuente
Escribí una herramienta para capturar y volcar el tráfico de socket de dominio Unix. Se utiliza
bpf/kprobepara sondear la función del núcleounix_stream_sendmsgy volcar el tráfico en el espacio del usuario.La herramienta depende de
bcc, por lo que debe instalarbccprimero.Un ejemplo de ejecución:
fuente