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.

trusktr
fonte

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.

gertvdijk
fonte
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.

Stéphane Chazelas
fonte
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:
ccpizza
fonte
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.

Dale
fonte
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.

txtechhelp
fonte
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

Kratos
fonte
1

Se você executa o Solaris ou um derivado, dê uma olhada no conntrack

jlliagre
fonte
Bom, isso também está disponível no Arch Linux: archlinux.org/packages/community/i686/conntrack-tools - Você poderia fornecer um exemplo de como usaria o conntrack para ver apenas as conexões iniciadas a partir do local, mas não as conexões iniciadas em outro lugar?
trusktr