Sniff socket de dominio UNIX

9

Sé que algún proceso está escribiendo en un determinado socket de dominio Unix ( /var/run/asterisk/asterisk.ctl), pero no conozco el pid del remitente. ¿Cómo puedo averiguar quién está escribiendo en el socket? He intentado con:

sudo lsof /var/run/asterisk/asterisk.ctl

pero solo enumera el propietario del zócalo. Me gustaría saber quién está escribiendo / leyendo en este socket, y también me gustaría oler los datos. es posible?

dangonfast
fuente

Respuestas:

4

Las respuestas cortas son no y no fácilmente.

En Linux, lsof se basa /proc/net/unixpara recuperar la información sobre los sockets de dominio UNIX. Esta interfaz se enumeran todos los sockets, pero lo hace sin perder de vista los puntos finales. Entonces puede ver qué sockets existen, pero no puede ver qué está conectado a ellos. En algún lugar se rastrea esta información , se debe rastrear o de lo contrario las conexiones de sockets no funcionarían. Todavía tengo que encontrar algún mecanismo para recuperar la información de conexión.

La pregunta olfativa es un poco más interesante, pero no menos decepcionante. Lo que quise decir con "no fácilmente" es que no existe ningún gancho para colarse y obtener esos datos. El análogo más cercano está usando tcpdump o Wireshark, los cuales usan libpcap para hacer el trabajo pesado. Si bien la red (AF_INET) y el dominio UNIX (AF_UNIX) se crean utilizando la socket()llamada a la función, ambos se usan connect()para conectarse, usar read()y write()procesar datos, son manejados por diferentes subsistemas del kernel. Esto tiene el desafortunado efecto secundario de que libpcap no está diseñado para funcionar con sockets de dominio UNIX.

Hay un lado un poco menos oscuro del problema. Echa un vistazo a la página del manual para recv(2). Esta es una llamada de sistema de nivel inferior que read()hace uso de. Existe una bandera para recv()llamado MSG_PEEK. Esto le permitiría detectar el tráfico que pasa a través de un socket de dominio UNIX. Así que ese es el lado positivo, el lado oscuro es que, hasta donde sé, no existe ninguna aplicación actual diseñada para hacer esto. Entonces estás viendo un esfuerzo de desarrollo.

Realmente deseo que no era una buena respuesta simple de F'YEAH a ambas partes de su pregunta.

Scott Pack
fuente
4

Sé que esto no responde a la pregunta principal, pero terminé aquí, buscando solo olfatear la comunicación en un zócalo. He decidido publicar para otros como yo. Así es como lo hice:

$> sudo socat -t100 -x -v UNIX-LISTEN: /var/run/php5-fpm.sock.socat,mode=777,reuseaddr,fork UNIX-CONNECT: /var/run/php5-fpm.sock

Puede eliminar -x y simplemente dejar -v para la comunicación ascii. Espero que ayude a alguien.

Anton Valqk
fuente
funciona perfectamente
JSmyth
-1

socat -t100 UNIX-LISTEN: /tmp/file.sock,mode=777,reuseaddr,fork STDOUT

No hay duplicación de salida, no hay salida cíclica. Error del comentario anterior ".sock.socat"

srvf
fuente
2
Aunque puede ser un comando útil, agregue alguna explicación / aclaración (¿y en qué se diferencia de esta respuesta ?)
HBruijn
Lo siento. No hay duplicación de salida, no hay salida cíclica. Error del comentario anterior ".sock.socat"
srvf