Posso monitorar um soquete de domínio unix local como o tcpdump?


59

Gostaria de monitorar as respostas em um soquete unix sem perturbar as conexões originais e canalizá-las para um script para processamento.

Eu sei como fazer isso com tcpdump para conexões tcp, mas não consigo encontrar uma solução para soquetes unix locais.

Isso é possível?


Respostas:


15

Há um cara que afirma fazer isso criando um aplicativo que atua como um gateway entre dois soquetes e registrando todos os dados que fluem. Portanto, você não pode tocar em um soquete, mas se puder reiniciar o serviço e ajustá-lo para usar esse aplicativo, poderá ver todo o tráfego.

Aqui está o link para o post: Unix Socket Sniffer

Existe uma outra maneira que você precisa para encontrar a identificação do processo anexada ao soquete, depois encontre com lsof o descritor de arquivo do soquete e toque no descritor de arquivo usando strace.

Se você pode parar o cliente / servidor que estiver usando o soquete e reconfigurá-lo, recomendo sempre o primeiro método, o segundo método é complicado e exige que você toque em um processo atual que, em alguns aplicativos, pode causar falhas.

Espero que alguém nos esclareça de maneira anoter :)

Boa sorte


Sim, você pode usar o método intermediário também com o socat, mas espero ter uma maneira mais direta, sem modificar as configurações existentes em outros lugares.
ck_

11
Então lsof and strace é a única maneira que tenho consciência. Cuidado com a produção ao desconectar o traço do processo, verifique se tudo continua funcionando depois disso.
Valor

3
Depois de mais algumas investigações, encontrei uma pergunta semelhante com alguns detalhes sobre por que isso não é diretamente possível em stackoverflow stackoverflow.com/questions/8394613/…
ck_

80

você pode 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

O que está acontecendo acima: Primeiro mova o soquete original para sock.original. O Socat cria um novo soquete ('UNIX-LISTEN') no local dos originais e encaminha tudo para o original ('UNIX-connect'). O -v diz ao socat para imprimir também a saída para STDERR.


3
Gostaria de adicionar um pouco mais de explicação?
Kazark

4
Isso é fácil quando o soquete unix original tem um caminho no sistema de arquivos. mas e se for um soquete unix de espaço para nome abstrato que você não pode realmente mover?
Valerio Schiavoni

6

Você também pode tentar usar strace em um dos processos em ambos os lados do soquete, pois isso permitirá que você observe o que está escrito / lido. Encontrei nos meus ambientes de produção, não tenho socat, mas tenho traço.

Para qualquer finalidade útil, definir -s para algo grande é uma obrigação.


Isso funcionou bem para mim e fácil de fazer. Use strace -p <pid>para assistir a um processo em execução.
quer

comando rápido: strace -s9999 -f $(for i in $( pidof php5-fpm ) ; do echo -n " -p $i "; done ) 2>&1 | tee /tmp/php.loge, em seguida, execute os testes. Você tem o /tmp/php.log para verificar lentamente se o log é muito grande. Se você está recebendo muito tráfego, fazer um pedido com um query-string com o seu nome ou algo assim você pode procurá-lo nos logs
higuita

11
@ higuita Eu sei que faz muito tempo, mas em vez desse loop, você pode deixar printflidar com a repetição. printf " -p %s" $(pidof php5-fpm)irá prefixar cada argumento pid com -pe é muito mais prático de escrever.
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

então:

sudo tcpdump -i lo -netvv port 8089

11
el magnifeco! Obrigado
typelogic 30/10
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.