Como rastrear a atividade de rede de um comando?

13

Quero rastrear a atividade de rede de um comando, tentei tcpdump e strace sem sucesso.

Por exemplo, se estou instalando um pacote ou usando qualquer comando que tente acessar algum site, desejo exibir essa atividade de rede (o site que ele tenta acessar).

Acho que podemos fazer isso usando o tcpdump. Eu tentei, mas ele está rastreando toda a atividade de rede do meu sistema. Digamos que, se eu executar vários comandos relacionados à rede e desejar rastrear apenas uma atividade específica da rede de comandos, seja difícil encontrar a solução exata.

Existe uma maneira de fazer isso?

ATUALIZAR:

Não quero rastrear tudo o que acontece na minha interface de rede. Eu só quero acompanhar a atividade de rede do comando (por exemplo, #yum install -y vim). Como o site que ele tenta acessar.

Buvanesh Kumar
fonte
1
Coloque o aplicativo em um espaço para nome de rede e use tcpdump / wireshark. Veja, por exemplo, aqui .
dirkt

Respostas:

17

netstat para simplificar

Usando netstate grepping no PID ou no nome do processo:

# netstat -np --inet | grep "thunderbird"
tcp        0      0 192.168.134.142:45348   192.168.138.30:143      ESTABLISHED 16875/thunderbird
tcp        0      0 192.168.134.142:58470   192.168.138.30:443      ESTABLISHED 16875/thunderbird

E você pode usar watchpara atualizações dinâmicas:

watch 'netstat -np --inet | grep "thunderbird"'

Com:

  • -n: Mostra endereços numéricos em vez de tentar determinar nomes simbólicos de host, porta ou usuário
  • -p: Mostra o PID e o nome do programa ao qual cada soquete pertence.
  • --inet: Mostre apenas soquetes de protocolo raw, udp e tcp.

rastreamento para verbosidade

Você disse que tentou a straceferramenta, mas tentou a opção trace=network? Observe que a saída pode ser bastante detalhada, portanto, você pode precisar de alguns grepping. Você pode começar grepping em "sin_addr".

 strace -f -e trace=network <your command> 2>&1 | grep sin_addr

Ou, para um processo já em execução, use o PID:

 strace -f -e trace=network -p <PID> 2>&1 | grep sin_addr
Gohu
fonte
+1 para o netstatqual IMHO é a solução mais simples e mais limpa.
dr01
@ Gohu eu fiz o mesmo para dnf. mas sem sorte. Eu tentei instalar alguns pacotes usando o dnf, então vejo que o processo dnf está em execução (nome do processo: dnf de acordo com o comando top e ps aux). Infelizmente, não obtive nenhuma saída do netstat -np --inet | grep "dnf".
Buvanesh Kumar
+1 para rastreio. Foi resolvido o meu problema. Consigo obter os endereços IP. Muito obrigado pela sua resposta :) @Gohu. Eu acho que está dando todos os endereços IP que alcança através da rede (por exemplo, IP do roteador e outros IPs). Se você souber, é possível rastrear apenas o IP de destino?
Buvanesh Kumar
Você pode tentar filtrar a stracesaída um pouco mais, mantendo apenas os connectsyscalls e removendo as dnssolicitações (porta 53) com:| grep connect | grep -v 'sin_port=htons(53)'
Gohu
+1 para a opção trace-rede no strace
phreed
5

Eu criaria um novo namespace de rede , faria a ponte com a rede real e depois monitoraria a ponte tcpdump.

Simon Richter
fonte
1
obrigado pela resposta. Seria ótimo se você me dissesse como :).
Buvanesh Kumar
5

sysdig permite monitorar toda a atividade do kernel ou vários comandos em execução no seu sistema, incluindo e não restrito à atividade de rede.

Como a saída pode ser grande, é necessário criar filtros, a página padrão para os filtros mais básicos é bastante compreensível.

Ele também tem a vantagem de não ser usado como um invólucro de aplicativo stracee pode ser bastante poderoso.

From Sysdig Examples

Trabalho em rede

Veja os principais processos em termos de uso da largura de banda da rede

sysdig -c topprocs_net 

Mostrar os dados de rede trocados com o host 192.168.0.1

Como binário:

sysdig -s2000 -X -c echo_fds fd.cip=192.168.0.1   

Como ASCII:

sysdig -s2000 -A -c echo_fds fd.cip=192.168.0.1 

Veja as principais portas do servidor local:

Em termos de conexões estabelecidas:

sysdig -c fdcount_by fd.sport "evt.type=accept"   

Em termos de bytes totais:

sysdig -c fdbytes_by fd.sport 

Veja os principais IPs do cliente

Em termos de conexões estabelecidas

sysdig -c fdcount_by fd.cip "evt.type=accept"   

Em termos de bytes totais

sysdig -c fdbytes_by fd.cip 

Liste todas as conexões de entrada que não são atendidas pelo apache.

sysdig -p"%proc.name %fd.name" "evt.type=accept and proc.name!=httpd"
Rui F Ribeiro
fonte
1

Você pode usar o wireshark para detectar todo o tráfego de entrada e saída de uma interface de rede. Caso você precise de uma opção sem interface gráfica, você pode usar o tshark.

Com as duas opções, você pode ver todo o tráfego da rede e salvá-lo para analisar posteriormente todas as conexões estabelecidas.

Ricard Molins
fonte
1
Como eu disse anteriormente, se eu executar vários comandos relacionados à rede, como posso saber qual comando está obtendo qual site?
Buvanesh Kumar
Esta é uma resposta mais genérica. Que eu já sei que podemos rastrear as atividades de rede de uma interface de rede :). Estou procurando acompanhar uma estatística de rede de comando específica.
Buvanesh Kumar
Se você souber quais portas o comando usa, poderá filtrar o sniff para limitá-lo ao comando desejado. No entanto, isso pode não ser possível em sua situação.
Ricard Molins