Las capturas TCP / IP y UDP se pueden hacer usando tcpdump
/ dumpcap
y 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).
strace
as-is no es suficiente, no es sencillo filtrar por E / S de sockets de dominio Unix. Un proxy que usa socat
o 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_DIAG
opció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_UNIX
sockets. 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_recvmsg
yunix_stream_sendmsg
paraSOCK_STREAM
(SOCK_DGRAM
ySOCK_SEQPACKET
tienen funciones con nombres similares). Los datos están almacenados ensk->sk_receive_queue
launix_stream_sendmsg
función , y no hay ningún código que finalmente lleve a llamar a latpacket_rcv
funció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_UNIX
monitoreo de sockets, si está interesado principalmente en los datos de la aplicación, tiene algunas opciones:strace
y capture las posibles llamadas al sistema que realizan E / S. Hay un montón de ellos,read
,pread64
,readv
,preadv
,recvmsg
y 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=file
para la mayoría de ellos (pread
solo 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_UNIX
puede pasar descriptores de archivo,AF_INET
no puede):CONFIG_UNIX_DIAG
Desafortunadamente, 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/kprobe
para sondear la función del núcleounix_stream_sendmsg
y volcar el tráfico en el espacio del usuario.La herramienta depende de
bcc
, por lo que debe instalarbcc
primero.Un ejemplo de ejecución:
fuente