Posso monitorare un socket di dominio unix locale come tcpdump?


Risposte:


15

C'è un ragazzo che afferma di farlo creando un'app che funge da gateway tra due socket e registrando tutti i dati che fluiscono. Quindi non puoi toccare un socket ma se riesci a riavviare il servizio e sintonizzarlo per utilizzare questa app guy, sarai in grado di vedere tutto il traffico.

Ecco il link al post: Unix Socket Sniffer

Esiste un altro modo per trovare l'id di processo collegato al socket, quindi trovare con lsof il descrittore di file del socket e quindi toccare il descrittore di file usando strace.

Se riesci a interrompere qualsiasi client / server utilizzi il socket e riconfiguralo, consiglierei sempre il primo metodo, il secondo metodo è complicato e richiede di toccare un processo corrente che su alcune app potrebbe causarne l'arresto anomalo.

Spero che qualcuno ci illumini con un modo anoter :)

In bocca al lupo


Sì, puoi fare il metodo dell'intermediario anche con socat ma spero in un modo più diretto senza modificare le impostazioni esistenti altrove.
ck_

1
Quindi lsof e strace è l'unico modo di cui sono a conoscenza. Fai attenzione alla produzione quando ti allontani dalla procedura, controlla che tutto continui a funzionare dopo.
Valor

3
Dopo un po 'di più a scavare in giro ho trovato una domanda simile con alcuni dettagli su questo il motivo per cui non è direttamente possibile su StackOverflow stackoverflow.com/questions/8394613/...
ck_

80

puoi usare 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

Cosa sta succedendo sopra: prima sposta il socket originale su sock.original. Socat crea un nuovo socket ('UNIX-LISTEN') nella posizione degli originali e inoltra tutto all'originale ('UNIX-connect'). -V dice a socat di stampare anche l'output su STDERR.


3
Vuoi aggiungere qualche spiegazione in più?
Kazark

4
È facile quando il socket unix originale ha un percorso sul filesystem. ma cosa succede se si tratta di un socket unix astratto dello spazio dei nomi che non è possibile spostare effettivamente?
Valerio Schiavoni,

6

Potresti anche provare a usare strace su uno dei processi su entrambi i lati del socket, poiché questo ti permetterà di guardare ciò che è scritto / letto. Ho trovato nei miei ambienti di produzione, non ho socat, ma ho una traccia.

Per qualsiasi scopo utile, l'impostazione di qualcosa di grande è un must.


Questo ha funzionato bene per me e facile da fare. Utilizzare strace -p <pid>per guardare un processo in esecuzione.
Matt Munson,

comando rapido: strace -s9999 -f $(for i in $( pidof php5-fpm ) ; do echo -n " -p $i "; done ) 2>&1 | tee /tmp/php.loge quindi eseguire i test. Hai /tmp/php.log per controllare lentamente se il registro è troppo grande. Se stai ricevendo troppo traffico, fai una richiesta con una stringa di query con il tuo nome o qualcosa del genere in modo da poterlo cercare nei registri
higuita

1
@higuita So che è passato molto tempo, ma invece di quel ciclo puoi lasciare printfgestire la ripetizione. printf " -p %s" $(pidof php5-fpm)anteporrà ogni argomento pid con -ped è molto più pratico da scrivere.
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

poi:

sudo tcpdump -i lo -netvv port 8089

1
el magnifeco! Grazie
dattiloscritto il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.