Como posso encontrar qual processo envia dados para uma porta específica?

20

Eu tenho um serviço, mantendo uma certa porta aberta.

Estou recebendo dados para isso, que não espero nem quero receber, e estou tentando identificar a origem desses dados. Então, como posso encontrar o processo que envia dados para uma porta específica, ao contrário do processo que está escutando.

    
por user50849 28.11.2012 / 14:12

5 respostas

22

Para TCP (embora a mesma abordagem funcione para o SCTP 1 ou qualquer protocolo de transporte orientado a conexão), da mesma forma que para procurar por aqueles de escuta:

lsof -nPi tcp:the-port

Irá relatar os processos que possuem um soquete TCP aberto nessa porta. Se você conhece a porta de origem (seu aplicativo de servidor pode conhecê-la e registrá-la), você pode usá-la para identificar o cliente invasor.

Para soquetes UDP ou RAW, seria mais complicado, embora eu suponha que seja algo em que algo como systemtap ou dtrace possa ser útil. Possivelmente auditados também.

1 Embora o suporte ao SCTP (somente no Linux) tenha sido adicionado ao lsof na versão 4.86, você não pode usar -i para solicitar explicitamente os sockets do SCTP. Aqui pode usar lsof -nP | grep -w 'SCTP.*:the-port' como heurística.

    
por 28.11.2012 / 14:34
2

Dependendo do tipo de conexão que estabelece para enviar dados, uma dessas abordagens o levará a algum lugar.

  • Use tcpdump port 1234 para adquirir os dados que estão sendo enviados para essa porta. Você pode usar um programa como o Wireshark para analisá-lo em outra máquina (capturado em um arquivo usando a opção -w ). Como alternativa, use o Wireshark diretamente.

  • Caso estabeleça e mantenha aberta uma conexão tcp / udp, você pode usar netstat para encontrar o IP remoto da conexão.

  • Relacione os sockets abertos de um processo como na resposta fornecida por @StephaneChazelas.

por 28.11.2012 / 14:33
1

Você pode usar o comando sockstat para encontrar o processo que iniciou a conexão com seu serviço no host local.

DESCRIPTION
     The sockstat command lists open Internet or UNIX domain sockets.

Basta combinar todas as conexões de origem com o seu destino. Isso funciona bem para TCP / UDP / UNIXsockets.

    
por 28.11.2012 / 14:35
1

Tente seguir:

$sudo ss -tp

Ou:

$sudo netstat -A inet -p

Para evitar o resultado do host local:

$sudo netstat -A inet -p | grep -v localhost

Para listar apenas as conexões ESTABLISHED:

$sudo netstat -A inet -p | grep -v localhost | grep ESTABLISHED
    
por 03.01.2018 / 10:14
0

No Solaris, a execução de pfiles em todos os processos deve mostrar quais processos têm quais conexões são abertas. Isso exigirá uma filtragem cuidadosa, provavelmente usando as opções -A, -B do ggrep ...

No Linux, netstat -anp --inet funcionará, mesmo sem o lsof instalado. (solte o --inet para obter soquetes de domínio Unix também)

    
por 29.11.2012 / 09:40