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

21

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

Estou obtendo dados para ele, que não espero nem desejo obter, e estou tentando identificar a fonte desses dados. Então, como posso encontrar qual processo que envia dados para uma porta específica, em oposição a qual processo está escutando.

user50849
fonte

Respostas:

23

Para o TCP (embora a mesma abordagem funcione para o SCTP 1 ou qualquer protocolo de transporte orientado a conexão), o mesmo que para procurar os que estão escutando:

lsof -nPi tcp:the-port

Relatará os processos que têm um soquete TCP aberto nessa porta. Se você conhece a porta de origem (o aplicativo do servidor pode conhecê-la e registrá-la), use-a para identificar o cliente não autorizado.

Para soquetes UDP ou RAW, seria mais complicado, embora eu suponha que é onde algo como systemtap ou dtrace pode ser útil. Possivelmente auditado também.


1 Embora o suporte a SCTP (apenas no Linux) tenha sido incluído lsofna versão 4.86, você não pode usar -ipara solicitar soquetes SCTP explicitamente. Aqui, você pode usar lsof -nP | grep -w 'SCTP.*:the-port'como heurística.

Stéphane Chazelas
fonte
Isso não está funcionando para o SCTP para mim.
Sudo
1
@sudo, veja edit
Stéphane Chazelas 25/17/17
3

Tente o seguinte:

$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 conexões ESTABELECIDAS:

$sudo netstat -A inet -p | grep -v localhost | grep ESTABLISHED
Amol
fonte
2

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

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

  • Caso ele estabeleça e mantenha aberta uma conexão tcp / udp, você poderá usar netstatpara encontrar o IP remoto da conexão.

  • Liste os soquetes abertos de um processo, como na resposta fornecida por @StephaneChazelas.

gertvdijk
fonte
1

Você pode usar o sockstatcomando 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 soquetes TCP / UDP / UNIX.

Andrey Voitenkov
fonte
0

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

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

Gert van den Berg
fonte