As capturas TCP / IP e UDP podem ser feitas usando tcpdump
/ dumpcap
e produz um arquivo pcap / pcapng que pode ser alimentado no Wireshark para análise posterior. Existe uma ferramenta semelhante para soquetes de domínio Unix nomeados? (Uma solução geral que funcione para soquetes abstratos também seria interessante.)
strace
como está não é suficiente, não é fácil filtrar E / S de soquetes de domínio Unix. Um proxy usando socat
ou semelhante também não é adequado, pois o objetivo é a análise passiva para programas abertos existentes.
Como posso obter uma captura de pacote que posso usar no Wireshark para análise? Exemplos de aplicativos de protocolo são X11 (Xorg, meu aplicativo atual) e cURL / PHP (HTTP). Eu vi uma CONFIG_UNIX_DIAG
opção no kernel do Linux, isso é útil?
fonte
-nolisten tcp
, não há soquete TCP. Se tudo falhar, provavelmente voltarei a usar o xscope ou seu truque puro strace + text2pcap. Eu ainda estaria interessado em uma captura genérica de soquete Unix (apenas dados, não dados de canal lateral).Respostas:
No kernel do Linux v4.2-rc5, não é possível capturar diretamente usando as interfaces que estão em uso pelo libpcap. A libpcap usa o domínio específico do Linux
AF_PACKET
(aliasPF_PACKET
), que apenas permite capturar dados de dados passando por um "dispositivo de rede " (como interfaces Ethernet).Não há interface do kernel para captura de
AF_UNIX
soquetes. As capturas Ethernet padrão têm um cabeçalho Ethernet com origem / destino, etc. Os soquetes Unix não possuem esse cabeçalho falso e o registro de tipos de cabeçalho da camada de link não lista nada relacionado a isso.Os pontos de entrada básicos para dados são
unix_stream_recvmsg
eunix_stream_sendmsg
paraSOCK_STREAM
(SOCK_DGRAM
eSOCK_SEQPACKET
possuem funções nomeadas de maneira semelhante). Os dados são colocados nask->sk_receive_queue
e naunix_stream_sendmsg
função , não existe um código que, finalmente, levam a chamar atpacket_rcv
função para captura de pacotes. Veja esta análise da osgx no SO para obter mais detalhes sobre os aspectos internos da captura de pacotes em geral.De volta à pergunta original sobre
AF_UNIX
monitoramento de soquete, se você estiver interessado principalmente nos dados do aplicativo, você tem algumas opções:strace
e capture em possíveis chamadas do sistema que executam E / S. Há muitos deles,read
,pread64
,readv
,preadv
,recvmsg
e muitos mais ... Ver @ Stéphane Chazelas exemplo paraxterm
. A desvantagem dessa abordagem é que você primeiro precisa encontrar o descritor de arquivo e ainda assim pode perder chamadas do sistema. Com o strace, você pode usar-e trace=file
a maioria deles (pread
é coberto apenas por-e trace=desc
, mas provavelmente não é usado para soquetes Unix pela maioria dos programas).unix_stream_recvmsg
,unix_stream_sendmsg
(ouunix_dgram_*
ouunix_seqpacket_*
) no núcleo e saída dos dados, em algum lugar. Você pode usar o SystemTap para definir esses pontos de rastreio. Aqui está um exemplo para monitorar mensagens de saída. Requer suporte ao kernel e disponibilidade de símbolos de depuração .Ativo (funciona apenas para novos processos):
Use um proxy que também grave arquivos. Você mesmo pode escrever um multiplexador rápido ou hackear algo assim que também gera um pcap (cuidado com as limitações, por exemplo,
AF_UNIX
pode passar descritores de arquivos,AF_INET
não pode):CONFIG_UNIX_DIAG
Infelizmente, a opção sugerida também não é útil aqui, só pode ser usada para coletar estatísticas, não para adquirir dados em tempo real conforme eles fluem (consulte linux / unix_diag.h ).Infelizmente, não há rastreadores perfeitos no momento para soquetes de domínio Unix que produzem pcaps (que eu saiba). Idealmente, haveria um formato libpcap que tenha um cabeçalho contendo o PID de origem / destino (quando disponível) seguido por dados adicionais opcionais (credenciais, descritores de arquivo) e, finalmente, os dados. Na falta disso, o melhor que pode ser feito é o rastreamento de syscall.
Informações adicionais (para o leitor interessado), aqui estão alguns backtraces (adquiridos com o GDB interrompendo
unix_stream_*
erbreak packet.c:.
, Linux no QEMU e socat no mainline Linux 4.2-rc5):fonte
Eu escrevi uma ferramenta para capturar e despejar o tráfego de soquete de domínio unix. Ele usa
bpf/kprobe
para analisar a função do kernelunix_stream_sendmsg
e despejar o tráfego no espaço do usuário.A ferramenta depende
bcc
, então você precisa instalarbcc
primeiro.Um exemplo de execução:
fonte