¿Cómo puedo encontrar qué proceso envía datos a un puerto específico?

21

Tengo un servicio, manteniendo un cierto puerto abierto.

Estoy obteniendo datos que no espero ni quiero obtener, y estoy tratando de señalar la fuente de estos datos. Entonces, ¿cómo puedo encontrar qué proceso que envía datos a un puerto específico, en lugar de qué proceso está escuchando?

usuario50849
fuente

Respuestas:

23

Para TCP (aunque el mismo enfoque funcionaría para SCTP 1 o cualquier protocolo de transporte orientado a la conexión), igual que para buscar los que escuchan:

lsof -nPi tcp:the-port

Informará los procesos que tienen un socket TCP abierto en ese puerto. Si conoce el puerto de origen (la aplicación del servidor puede conocerlo y registrarlo), puede utilizarlo para identificar al cliente no autorizado.

Para los sockets UDP o RAW, sería más complicado, aunque supongo que es donde algo como systemtap o dtrace puede ser útil. Posiblemente auditado también.


1 Aunque se agregó soporte SCTP (solo en Linux) lsofen la versión 4.86, no puede usar -ipara solicitar explícitamente los conectores SCTP. Aquí puede usarlo lsof -nP | grep -w 'SCTP.*:the-port'como heurístico en su lugar.

Stéphane Chazelas
fuente
Esto no funciona para SCTP para mí.
sudo
1
@sudo, ver edición
Stéphane Chazelas
3

Intenta lo siguiente:

$sudo ss -tp

O:

$sudo netstat -A inet -p

Para evitar el resultado localhost:

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

Para enumerar solo las conexiones ESTABLECIDAS:

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

Dependiendo del tipo de conexión que establezca para enviar datos, uno de estos enfoques lo llevará a alguna parte.

  • Use tcpdump port 1234para adquirir los datos que se envían a este puerto. Puede usar un programa como Wireshark para analizarlo en otra máquina (capturado en un archivo usando la -wopción). Alternativamente, use Wireshark directamente.

  • En caso de que establezca y mantenga abierta una conexión tcp / udp que podría usar netstatpara encontrar la IP remota de la conexión.

  • Enumere los sockets abiertos de un proceso como en la respuesta proporcionada por @StephaneChazelas.

gertvdijk
fuente
1

Puede usar el sockstatcomando para encontrar el proceso que ha iniciado la conexión a su servicio en el host local.

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

Simplemente combine todas las conexiones de origen con su destino. Esto funciona bien para TCP / UDP / UNIXsockets.

Andrey Voitenkov
fuente
0

En Solaris, la ejecución de archivos en todos los procesos debería mostrar qué procesos tienen qué conexiones abiertas. Se requerirá un archivo cuidadoso, probablemente utilizando las opciones -A, -B de ggrep ...

En Linux, netstat -anp --inetfuncionará, incluso sin lsof instalado. (suelte también --inetpara obtener los sockets de dominio Unix)

Gert van den Berg
fuente