Sniff soquete de domínio UNIX


9

Eu sei que algum processo está gravando em um determinado soquete de domínio unix ( /var/run/asterisk/asterisk.ctl), mas não conheço o pid do remetente. Como posso descobrir quem está escrevendo no soquete? Eu tentei com:

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

mas apenas liste o proprietário do soquete. Gostaria de saber quem está escrevendo / lendo neste soquete e também gostaria de farejar os dados. Isso é possível?

Respostas:


4

As respostas curtas são não e não são fáceis.

No Linux, lsof depende /proc/net/unixpara recuperar as informações sobre soquetes de domínio UNIX. Essa interface lista todos os soquetes ligados, mas não controla os pontos de extremidade. Assim, você pode ver quais soquetes existem, mas não pode ver o que está conectado a eles. Em algum lugar onde essas informações são rastreadas, elas devem ser rastreadas, caso contrário as conexões dos soquetes não funcionariam. Ainda não encontrei nenhum mecanismo para recuperar as informações de conexão.

A questão de cheirar é um pouco mais interessante, mas não menos decepcionante. O que eu quis dizer com "não é fácil" é que não existe nenhum gancho para entrar e capturar esses dados. O analógico mais próximo é usar o tcpdump ou o Wireshark, e ambos usam o libpcap para realizar o trabalho pesado. Embora a rede (AF_INET) e o domínio UNIX (AF_UNIX) sejam criados usando a socket()chamada de função, ambos usados connect()para se conectar, usar read()e write()processar dados, eles são manipulados por diferentes subsistemas do kernel. Isso tem o efeito colateral lamentável de que o libpcap não foi projetado para funcionar com soquetes de domínio UNIX.

Há um lado um pouco menos sombrio do problema. Dê uma olhada na página de manual recv(2). Esta é uma chamada de sistema de nível inferior que read()utiliza. Existe um sinalizador para recv()chamado MSG_PEEK. Isso permitiria detectar o tráfego que passava por um soquete de domínio UNIX. Portanto, esse é o lado positivo, o lado obscuro é que, até onde eu sei, não existe nenhum aplicativo atual projetado para fazer isso. Então você está olhando para algum esforço de desenvolvimento.

Eu realmente gostaria que foi uma simples resposta agradável de F'YEAH para ambas as partes da sua pergunta.



3

Sei que isso não está respondendo à pergunta principal, mas acabei aqui, procurando apenas cheirar a comunicação em um soquete. Eu decidi postar para outras pessoas como eu. Aqui está como eu fiz isso:

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

Você pode remover -x e apenas deixar -v para comunicação ascii. Espero que ajude alguém.


funciona perfeitamente #
3150 JSmyth

-1

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

Não há duplicação de saída, nenhuma saída cíclica. Erro do comentário anterior ".sock.socat"


2
Embora isso possa ser um comando útil, por favor, adicione um pouco de explicação / clarificação (e como é que diferente de esta resposta ?)
HBruijn

Eu sinto Muito. Não há duplicação de saída, nenhuma saída cíclica. Erro do comentário anterior ".sock.socat"
srvf 21/02/19
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.