Que programa enviou qual pacote para a rede [duplicado]

4

Eu gostaria de ter um programa como o tcpdump que mostra qual programa enviou um pacote específico, em vez de apenas obter o número da porta. Este é um problema genérico que eu tive ligado e desligado algumas vezes quando você tem um arquivo tcpdump antigo e não tem como descobrir qual programa estava enviando os dados ..

A solução em como eu pode identificar qual processo está fazendo tráfego UDP no linux? é uma indicação de que posso resolver isso com o auditd, dTrace, OProfile ou SystemTap, mas não mostra como fazer isso. Ou seja ele não mostra a porta de origem do programa chamando bind () ..

O problema que tive foram pacotes UDP estranhos, e como essas portas são tão curtas, demorei um pouco para resolver esse problema. Eu resolvi isso executando um hack feio semelhante a:

while true; date +%s.%N;netstat -panut;done

Então, um método melhor que esse hack, um substituto para o tcpdump, ou alguma maneira de obter essa informação do kernel para que eu possa corrigir o tcpdump.

Resolvendo isso com o auditd

sudo auditctl -a exit,always -F arch=b64  -S bind -k BIND

Isso preenche /var/log/audit/audit.log com linhas como:

type=SYSCALL msg=audit(1292929028.845:3377): arch=c000003e syscall=49 success=yes exit=0 a0=3 a1=808710 a2=10 a3=7fffab28ea10 items=0 ppid=1564 pid=24442 auid=4294967295 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts1 ses=4294967295 comm="nc" exe="/bin/nc.openbsd" key="BIND"
type=SOCKADDR msg=audit(1292929028.845:3377): saddr=0200FFFF000000000000000000000000

Em seguida, analise o saddr = 0200xxxx00 onde xxxx é o número da porta, 0001 é o menor e FFFF é o mais alto.

EDIT: Isso foi perguntado no superusuário "rastreamento de programas envia para net ", não é uma boa solução.

    
por Erik Johansson 16.12.2010 / 13:23

2 respostas

3

informações sobre o processo de envio de um pacote (mesmo quando ele é originado da máquina local) não está disponível para o tcpdump porque ele não é fornecido pela interface de captura de pacotes do kernel ... pesquisar por "DLT_LINUX_SLL" no link

mudar isso é certamente uma tarefa bastante complexa de hacking de kernel ...

o mais próximo de uma solução parece ser o módulo de correspondência "owner" do iptable, que suporta pacotes correspondentes pelo user-id (também process-id em algumas versões linux, iirc que o recurso foi removido posteriormente) e a opção --log-uid (infelizmente não -log-pid) do alvo LOG.

então, quando você adiciona uma regra do iptables como: iptables -I OUTPUT -p tcp --syn -j LOG - log-prefix "nova conexão tcp:" --log-uid

você obtém um log (em seu log do kernel, também conhecido como dmesg ) de todas as conexões recém-estabelecidas com sua porta de origem e id de usuário, para que você possa obter um mapa de conexões com usuários sem ter que pesquisar netstat ...

    
por 16.12.2010 / 14:19
1

Veja esta resposta para uma questão idêntica. Ele sugere o uso da estrutura auditd .

    
por 16.12.2010 / 14:09