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


71

Minha máquina é um servidor, por isso quero ignorar as conexões que estão sendo feitas com meu servidor (por exemplo, quando alguém visita meu site). Quero ver apenas conexões / solicitações sendo feitas pelo meu servidor para outros lugares.

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

Edição: Eu sou novo para este tipo de coisas. O que estou tentando fazer é apenas 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 exista código em algum lugar da estrutura do meu aplicativo Web que envie dados estatísticos para outro lugar que eu não conheço. Gostaria de ver os lugares para os quais meu servidor está enviando dados, se houver. Provavelmente não é provável, mas suponha que você decida usar uma estrutura php ou nodejs que não escreveu: há uma pequena chance de que ele possa enviar algum tipo de dados para algum lugar. Se assim for, é o que eu gostaria de ver.

Respostas:


77

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 lou a) de forma numérica ( nevita possíveis consultas DNS de longa execução) e inclui o programa ( p) associado a isso.

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


Obrigado. Essa é uma boa informação. Você pode dar uma olhada na minha pergunta atualizada?
trusktr

11
Seqüestro completamente inapropriado (exceto que esta resposta foi bem pesquisada no Google): Essa resposta também funciona com o Windows. Para usar netstatno "modo contínuo" lá, -cnão funciona. Você usa números, em vez disso, netstat -na 1 | find "[Scan_Host_IP_Addr]"para atualizar a cada 1segundo (neste exemplo). ( fonte ).
Ruffin

4
Isso faz uma pesquisa, portanto nem sempre ela captura todas as conexões.
reinierpost

Existe uma maneira de exibir informações mais amigáveis, como nomes de domínio, informações sobre o IP? Talvez usando um script personalizado?
AWM

@awm Bem, isso seria possível straceno processo, filtrando as pesquisas de servidores de nomes (sem detalhes, essa não é uma resposta completa). Como alternativa, você pode mostrar o DNS reverso dos IPs listados netstat, omitindo a nopção incluída na minha resposta.
gertvdijk

11

Se você deseja apenas registrar todas as tentativas de conexão, o mais fácil provavelmente será o iptables LOGdestino no Linux (ou o recurso de registro 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.

No entanto, observe que os dois acima registram apenas o tráfego que passa pelo netfilter, que geralmente é todo o tráfego, mas não contabiliza o tráfego gerado com pilhas IP no espaço do usuário (como máquinas virtuais ou qualquer coisa usando soquetes brutos) ou tráfego em ponte.

Para soluções mais gerais, você pode ter um olhar para coisas como argus, bro-ids, sancpou ntopque registrar todos os tipos de informações com base no tráfego que farejar em uma interface.


9

Eu tentei várias ferramentas, incluindo,, iftope ntop, é iptrafclaro, as ferramentas internas muito úteis netstat -tupln(as opções suportadas dependem do sistema operacional), mas a mais prática para o meu caso de uso acabou sendo nethogs: ela agrega conexões pela origem aplicativo e é o menos barulhento de todos.

Instalável via:

sudo apt-get install nethogs

Executar como root:

sudo nethogs

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

sudo tcpdump -i lo -A | grep Host:

6

O que eu acho que você deseja fazer é obter uma lista de portas de escuta e removê-las de outras conexões TCP, que serão todas as conexões de saída. O comando ss (status do soquete) gera 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}+atrás da string ": $ port" no grep para corresponder aos espaços existentes atrás da coluna "Local Address: Port"; essa coluna possui dois ou mais espaços em branco atrás dela, em que o "Endereço do par: porta" possui um espaço e, em seguida, uma nova linha (grrr ... deve ter apenas uma nova linha, IMO,\s+\s{2}+.) Normalmente, eu poderia tentar usar a funcionalidade de filtragem de ss, como em ss -tn state established '(sport != :<port1> and sport !=:<port2>)' src <ip address>. Mas parece que há um limite de quanto tempo essa string pode ser lançada em um sistema em que eu tinha muitas portas de escuta. Então, eu estou tentando fazer a mesma coisa com grep. Acredito que o seguinte funcione:

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: utilitário ss, iproute2-ss111117) têm um formato de saída diferente; portanto, você pode precisar usar $ 3 em vez de $ 4 no awk. Observe também ss -tlne ss -tn state listeningfornece uma saída diferente, o que é um pouco contra-intuitivo para mim. YMMV.

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


Você poderia adicionar alguma explicação de como isso funciona? ( Edite a resposta; não publique informações esclarecedoras como comentários.) Acho que entendi parcialmente. Parece que pode precisar de um pouco mais de trabalho. Corri ss -tn state listeningem um host que executa um servidor FTP e, naturalmente, o comando mostrou que a máquina estava escutando na porta 21. Isso não significa que o egrep -vfiltro filtrará quaisquer hosts remotos cujo endereço IP inclua "21" (incluindo "210" "," 211 "," 212 ", ...)? Além disso, é asortrealmente necessário, ou apenas vitrine?
G-Man

Eu tive que consertar praticamente tudo, o script corrigido está acima.
Dale

Por fim, seria muito melhor se ss ou netstat incluíssem essa funcionalidade nele. Faça a ss --outpara obter uma lista de conexões de saída.
Dale

Bom, eu gosto desta resposta. Vou testá-lo quando voltar a melhorar a segurança no meu servidor. : D
trusktr

Parece que isso também poderia ser usado para UDP, mas você só precisa usar diferentes sinalizadores e estados, é claro.
Dale

4

tcpdumppermite ver todo o tráfego IP fluindo de / para 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 houver, geralmente há uma porta em algum lugar para obtê-la para sua distribuição específica.


2

netstat é uma boa opção.Use os parâmetros conforme necessário. (consulte suas páginas de manual) Por exemplo

netstat -antup

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

Você também pode tentar o sscomando Para uso de referência:

Rede TCP / UDP SS Linux e informações de soquete


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.