Como posso capturar o tráfego de rede de um único processo?

75

Eu gostaria de examinar o tráfego de rede sendo tratado por um único processo, mas simples capturas de rede não funcionarão, já que estou lidando com um sistema tão ocupado (muitos outros tráfegos acontecendo ao mesmo tempo). Existe uma maneira de isolar uma captura tcpdump ou wireshark ao tráfego de rede de um único processo específico? (Usando netstat é insuficiente.)

    
por Kees Cook 06.11.2010 / 07:56

14 respostas

16

Na verdade, existe uma maneira de usar os filtros Wireshark . Mas você não pode filtrar diretamente pelo nome do processo ou PID (porque eles não são uma quantidade de rede).

Você deve primeiro descobrir os protocolos e as portas usadas pelo seu processo (o comando netstat no comentário anterior funciona bem).

Em seguida, use o Wireshark para filtrar a porta de entrada (ou de saída) com a que você acabou de recuperar. Isso deve isolar o tráfego de entrada e saída do seu processo.

    
por OpenNingia 06.11.2010 / 10:53
104

Para iniciar e monitorar um novo processo:

strace -f -e trace=network -s 10000 PROCESS ARGUMENTS

Para monitorar um processo existente com um PID conhecido:

strace -p $PID -f -e trace=network -s 10000
  • -f é para "seguir novos processos"
  • -e define um filtro
  • -s define o limite de cadeias para mais de 32
  • -p leva o ID do processo para anexar a
por Clausi 10.11.2010 / 12:04
45

Eu sei que esse tópico é um pouco antigo, mas acho que isso pode ajudar alguns de vocês:

Se o seu kernel permitir, capturar o tráfego de rede de um único processo é muito fácil, executando o dito processo em um namespace de rede isolado e usando wireshark (ou outras ferramentas de rede padrão) no mesmo namespace.

A configuração pode parecer um pouco complexa, mas assim que você entender e se familiarizar com ela, isso facilitará muito o seu trabalho.

Para fazer isso:

  • crie um namespace de rede de teste:

    ip netns add test
    
  • crie um par de interfaces de rede virtual (veth-a e veth-b):

    ip link add veth-a type veth peer name veth-b
    
  • altere o namespace ativo da interface veth-a:

    ip link set veth-a netns test
    
  • configure os endereços IP das interfaces virtuais:

    ip netns exec test ifconfig veth-a up 192.168.163.1 netmask 255.255.255.0
    ifconfig veth-b up 192.168.163.254 netmask 255.255.255.0
    
  • configure o roteamento no namespace de teste:

    ip netns exec test route add default gw 192.168.163.254 dev veth-a
    
  • ative o ip_forward e estabeleça uma regra NAT para encaminhar o tráfego vindo do namespace que você criou (você precisa ajustar a interface de rede e o endereço IP do SNAT):

    echo 1 > /proc/sys/net/ipv4/ip_forward
    iptables -t nat -A POSTROUTING -s 192.168.163.0/24 -o <your internet interface, e.g. eth0> -j SNAT --to-source <your ip address>
    

    (Você também pode usar a regra MASQUERADE, se preferir)

  • finalmente, você pode executar o processo que deseja analisar no novo namespace e wireshark também:

    ip netns exec test thebinarytotest
    ip netns exec test wireshark
    

    Você terá que monitorar a interface do veth-a.

por felahdab 19.07.2014 / 13:39
13
netstat -taucp | grep <pid or process name>

Isso mostrará as conexões que um aplicativo está fazendo, incluindo a porta que está sendo usada.

    
por Oli 06.11.2010 / 10:15
9

Apenas uma ideia: é possível vincular seu aplicativo a um endereço IP diferente? Se assim for, você pode usar os suspeitos usuais ( tcpdump , etc.)

Ferramentas para aplicativos que não são capazes de se vincular a outro endereço IP:

link

  

fixsrcip é uma ferramenta para ligar soquetes de cliente TCP e UDP de saída ( IPv4 ) a endereços IP de origem específicos em hosts multi-homed

link

  

force_bind permite forçar a ligação em um IP e / ou porta específica. Funciona com IPv4 e IPv6 .

    
por Clausi 10.11.2010 / 13:33
9

Cheguei a um problema semelhante e consegui resolvê-lo com base em esta resposta do ioerror , usando o NFLOG como descrito aqui :

# iptables -A OUTPUT -m owner --uid-owner 1000 -j CONNMARK --set-mark 1
# iptables -A INPUT -m connmark --mark 1 -j NFLOG --nflog-group 30 
# iptables -A OUTPUT -m connmark --mark 1 -j NFLOG --nflog-group 30 
# dumpcap -i nflog:30 -w uid-1000.pcap

Depois, você pode criar o processo em questão a partir de uma conta de usuário que não faz mais nada - e voila, você acabou de isolar e capturar o tráfego de um único processo.

Só queria postar de volta caso isso ajude alguém.

    
por szymon 06.04.2014 / 16:49
5

Este é um hack sujo, mas eu sugiro um desvio ou um alvo de log com iptables para um determinado UID. por exemplo:

iptables -t nat -A OUTPUT -p tcp -m owner --uid-owner $USER -m tcp -j LOG 
iptables -t nat -A OUTPUT -p udp -m owner --uid-owner $USER -m udp -j LOG 

Também pode valer a pena pesquisar algo como '--log-tcp-sequence', '--log-tcp-options', '--log-ip-options', '--log-uid' para esse alvo de log. Embora eu suspeite que isso só vai ajudar você a processar um pcap que inclua uma tonelada de outros dados.

O destino NFLOG pode ser útil se você quiser sinalizar pacotes e, em seguida, determinados pacotes marcados serão enviados por um soquete de link de rede para um processo de sua escolha. Gostaria de saber se isso seria útil para hackear algo com o wireshark e seu aplicativo específico sendo executado como um usuário específico?

    
por ioerror 12.12.2010 / 10:50
4

Você pode tentar o tracedump - link

Ele faz exatamente o que você quer, você pode dar uma ID do processo ou um programa para executar.

    
por pjf 01.04.2014 / 14:51
4

Tente executar o processo de seu interesse em strace :

strace ping www.askubuntu.com

Ele fornecerá informações muito detalhadas sobre o que seu processo está fazendo. Como um processo pode abrir qualquer porta que deseje em qualquer lugar, usando um filtro predefinido, você pode perder alguma coisa.

Outra abordagem seria usar uma máquina virtual simplificada ou uma máquina de teste em sua rede e colocar o processo nela isoladamente. Então você pode simplesmente usar o Wireshark para capturar tudo a partir dessa máquina. Você terá certeza de que o tráfego capturado será relevante.

    
por user5883 10.11.2010 / 10:54
3

Construindo em a resposta de ioerror Eu suspeito que você pode usar iptables --uid-owner para definir um marcador no tráfego, e então você pode pedir wireshark para capturar apenas o tráfego com esse marcador. Você pode usar um DSCP (marcador de serviços diferenciais), um ID de fluxo ou um marcador de qos.

Ou, na verdade, você poderia usar isso para enviar esses pacotes para uma interface diferente e, em seguida, capturar apenas nessa interface.

    
por poolie 12.12.2010 / 11:23
2

O wireshark bug # 1184 é esse recurso. Ainda não está implementado.
Copiado do usuário cmanynard em ask.wireshark.org

    
por JamesThomasMoon1979 15.01.2015 / 05:35
2

Eu escrevi um aplicativo C que faz o que é descrito na grande resposta acima por felahdab!

Veja aqui: nsntrace github repo

    
por Jonas Danielsson 15.07.2016 / 13:24
0

talvez iptables e ulog possam funcionar? Não que eu tenha uma receita exata, mas acho que o iptables pode combinar processos, uma vez que você pode usar o ulog.

    
por chesty 06.11.2010 / 09:30
-1

Acho que você pode criar um script de shell para executar a execução do netstat e registrá-lo em um arquivo de texto. Algo como (etapas muito difíceis):

echo "press q to quit"
while [ <q is not pressed>]
do
    'netstat -taucp | grep <pid or process name> 1>>logfile.txt'
done

Eu não sou programador, então não posso refinar isso. Mas alguém aqui pode começar de onde parei e criar um roteiro de trabalho para você.

    
por tinhed 10.11.2010 / 07:59