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

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

Valor
fuente
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.

storoj
fuente
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.

omnigrok
fuente
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
任喜军
fuente
1
el magnifeco! Gracias
typelogic