¿Puedo monitorear un socket de dominio unix local como tcpdump?


59

Me gustaría monitorear las respuestas en un socket Unix sin alterar las conexiones originales y canalizarlas a un script para su procesamiento.

Sé cómo hacer esto con tcpdump para conexiones tcp, pero parece que no puedo encontrar una solución para los sockets locales de Unix.

¿Es esto posible?


Respuestas:


15

Hay un tipo que dice hacerlo creando una aplicación que actúa como una puerta de enlace entre dos sockets y registrando todos los datos que fluyen. Por lo tanto, no puede tocar un zócalo, pero si puede reiniciar el servicio y sintonizarlo para usar esta aplicación, podrá ver todo el tráfico.

Aquí está el enlace a la publicación: Unix Socket Sniffer

Hay otra forma que necesita para encontrar la identificación del proceso adjunta al socket, luego buscar con lsof el descriptor de archivo del socket y luego tocar el descriptor de archivo usando strace.

Si puede detener cualquier cliente / servidor que esté usando el socket y reconfigurarlo, siempre recomendaría el primer método, el segundo método es complicado y requiere que toque un proceso actual que en algunas aplicaciones podría causar que se bloquee.

Espero que alguien nos ilumine de otra manera :)

Buena suerte


Yah, puedes hacer el método de intermediario también con socat, pero espero una forma más directa sin modificar la configuración existente en otro lugar.
ck_

1
Entonces lsof y strace es la única forma en que soy consciente. Tenga cuidado con la producción cuando separe la parte del proceso, verifique que todo siga funcionando después de eso.
Valor

3
Después de investigar un poco más, encontré una pregunta similar con algunos detalles sobre por qué esto no es directamente posible en stackoverflow stackoverflow.com/questions/8394613/…
ck_

80

puedes usar socat.

sudo mv /path/to/sock /path/to/sock.original
sudo socat -t100 -x -v UNIX-LISTEN:/path/to/sock,mode=777,reuseaddr,fork UNIX-CONNECT:/path/to/sock.original

Lo que está sucediendo arriba: Primero mueva el zócalo original al calcetín. Original. Socat crea un nuevo socket ('UNIX-LISTEN') en la ubicación original y lo reenvía al original ('UNIX-connect'). El -v le dice a socat que también imprima la salida a STDERR.


3
¿Te gustaría agregar un poco más de explicación?
Kazark

44
Eso es fácil cuando el socket original de Unix tiene una ruta en el sistema de archivos. pero ¿qué pasa si se trata de un socket unix de espacio de nombres abstracto que realmente no puede mover?
Valerio Schiavoni

6

También puede intentar usar strace en uno de los procesos a cada lado del socket, ya que esto le permitirá ver lo que está escrito / leído. Encontré en mis entornos de producción, no tengo socat, pero tengo strace.

Para cualquier propósito útil, establecer -s en algo grande es imprescindible.


Esto funcionó bien para mí y fácil de hacer. Úselo strace -p <pid>para ver un proceso en ejecución.
Matt Munson

comando rápido: strace -s9999 -f $(for i in $( pidof php5-fpm ) ; do echo -n " -p $i "; done ) 2>&1 | tee /tmp/php.logy luego ejecuta las pruebas. Tiene el /tmp/php.log para verificar lentamente si el registro es demasiado grande. Si está recibiendo demasiado tráfico, haga una solicitud con una cadena de consulta con su nombre o algo así para que pueda buscarlo en los registros
higuita

1
@higuita Sé que ha pasado mucho tiempo, pero en lugar de ese ciclo, puedes dejar que se printfocupe de la repetición. printf " -p %s" $(pidof php5-fpm)prefijará cada argumento pid con -py es mucho más práctico escribirlo.
JoL

2
// backup the socket
sudo mv /var/run/docker.sock /var/run/docker.sock.original

// use tcp port 8089 proxy the original socket
sudo socat TCP-LISTEN:8089,reuseaddr,fork UNIX-CONNECT:/var/run/docker.sock.original

// use the new socket to proxy the 8089 port
sudo socat UNIX-LISTEN:/var/run/docker.sock,fork TCP-CONNECT:127.0.0.1:8089

entonces:

sudo tcpdump -i lo -netvv port 8089

1
el magnifeco! Gracias
typelogic
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.