Como posso monitorar todas as solicitações / conexões de saída da minha máquina?

57

Minha máquina é um servidor, portanto, quero ignorar as conexões feitas em meu servidor (por exemplo, quando alguém acessa meu site). Eu quero ver apenas conexões / solicitações sendo feitas pelo meu servidor para outros lugares.

Como vejo somente essas conexões de saída?

EDIT: Eu sou novo nesse tipo de coisa. O que estou tentando fazer é ver se alguma coisa do meu servidor está sendo enviada além de dados para meus aplicativos da web. Por exemplo, se alguém visitar meus sites, obviamente meu servidor enviará dados para o navegador do cliente. Mas suponha que também haja código em algum lugar na estrutura do meu aplicativo da Web que envie dados estatísticos para algum outro lugar do qual não conheço. Gostaria de ver esses lugares para os quais o servidor está enviando dados, se houver. Provavelmente não é provável, mas suponha que você decida usar um framework php ou nodejs que você não tenha escrito: há uma pequena chance de enviar algum tipo de dado para algum lugar. Se sim, é isso que eu gostaria de ver.

    
por trusktr 23.11.2012 / 12:13

7 respostas

66

Use netstat . Por exemplo

$ netstat -nputw
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
[...]
tcp        0      0 192.168.25.222:22       192.168.0.134:42903     ESTABLISHED 32663/sshd: gert [p

lista todas as conexões de saída UDP ( u ), TCP ( t ) e RAW ( w ) (não usando l ou a ) em um formato numérico ( n , evita possíveis executando as consultas DNS) e inclui o programa ( p ) associado a isso.

Considere adicionar a opção c para que a saída seja atualizada continuamente.

    
por 23.11.2012 / 12:31
9

Se você quiser apenas registrar todas as tentativas de conexão, o mais fácil é provavelmente iptables LOG target no Linux (ou o recurso de log de firewall equivalente em seu sistema).

Se você precisar de mais informações, como a duração da conexão e a quantidade de dados trocados nas duas direções, então conntrackd (no Linux) é provavelmente a melhor opção.

Entretanto, note que os dois acima registram apenas o tráfego que passa pelo netfilter, que geralmente é todo o tráfego, mas não gera tráfego de conta gerado com pilhas de IP no espaço do usuário (como máquinas virtuais ou qualquer coisa usando soquetes brutos) .

Para soluções mais gerais, você pode ver coisas como argus , bro-ids , sancp ou ntop que registram todos os tipos de informações com base no tráfego que detectam em uma interface.

    
por 23.11.2012 / 13:03
6

O que eu acho que você quer fazer é obter uma lista de portas de escuta e, em seguida, removê-las de quaisquer outras conexões TCP e, em seguida, serão todas as conexões de saída. O comando ss (status do soquete) emite as colunas "Local Address: Port" e "Peer Address: Port", precisamos remover as portas de escuta da coluna "Local Address: Port" e não a coluna "Peer Address: Port", caso contrário, você poderá perder algumas conexões de saída. Então, para conseguir isso, estou usando \s{2}+ por trás da string ": $ port" no grep para corresponder nos espaços que existem atrás da coluna "Local Address: Port"; essa coluna tem dois ou mais espaços em branco atrás dela, onde o "Peer Address: Port" tem um espaço e, em seguida, uma nova linha (grrr ... deve ter apenas uma nova linha, IMO, então eu poderia ter usado \s+ em vez de \s{2}+ .) Normalmente eu poderia tentar usar a funcionalidade de filtragem de ss, como com ss -tn state established '(sport != :<port1> and sport !=:<port2>)' src <ip address> . Mas parece que há um limite de quanto tempo essa cadeia pode ser, ela foi bombardeada em um sistema em que eu tinha muitas portas de escuta. Então estou tentando fazer a mesma coisa com o grep. Eu acredito que o seguinte funcionará:

FILTER=$(ss -tn state listening | gawk 'NR > 1 {n=split($3,A,":"); B[NR-1]=A[n]} END {for (i=1; i<length(B); i++) printf ":%s\s{2}+|", B[i]; printf ":%s\s{2}+", B[i]}')

ss -tn state established dst :* | grep -P -v "$FILTER"

Observe que isso depende da versão do ss que você está usando, versões mais antigas (como: ss utilitário, iproute2-ss111117) tem um formato de saída diferente, então você pode ter que usar $ 3 em vez de $ 4 no awk. Observe também que ss -tln e ss -tn state listening fornecem uma saída diferente, o que é um pouco contra-intuitivo para mim. YMMV.

Eu encontrei uma solução um pouco mais elegante que não requer conhecer o IP do host, ss -tn state established dst :* funciona bem, eu modifiquei as linhas de comando acima.

    
por 20.03.2015 / 02:29
5

Eu tentei um monte de ferramentas, incluindo iftop , ntop , iptraf e, claro, o muito útil netstat -tupln (opções suportadas dependem do sistema operacional), mas o mais prático para o meu caso de uso acabou sendo nethogs - agrega conexões pelo aplicativo de origem e é o menos barulhento de todos.

Instalável via:

sudo apt-get install nethogs

Executar como root:

sudo nethogs

Se o seu objetivo é apenas ver todas as conexões TCP iniciadas por qualquer aplicativo, você pode usar:

sudo tcpdump -i lo -A | grep Host:
    
por 30.06.2016 / 08:47
3

tcpdump permite que você veja todo o tráfego IP fluindo para / de uma interface específica com a capacidade de filtrar com base em determinados critérios. tcpdump é normalmente instalado na maioria dos sistemas * nix por padrão, se não há geralmente uma porta em algum lugar para pegá-la para sua distro específica.

    
por 24.11.2012 / 22:09
2

netstat é uma boa opção. Use os parâmetros conforme necessário (consulte as man pages) Por exemplo

netstat -antup

Aqui, ele pode monitorar todos (a) o processo numérico de escuta (n) tcp (t) e udp (u) (p).

Você também pode tentar o comando ss . Para uso de referência:

Informações sobre redes e soquetes TCP / UDP do SS Linux

    
por 23.11.2012 / 12:57
1

Se você executar o Solaris ou um derivado, consulte conntrack

    
por 24.11.2012 / 12:25