desarrollo-web-br-bd.com

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

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.

22
user50849

Para TCP (aunque el mismo enfoque funcionaría para SCTP1 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 (su aplicación de servidor puede conocerlo y registrarlo), puede usarlo para identificar el cliente deshonesto.

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 el soporte SCTP (solo en Linux) se agregó a lsof en la versión 4.86, no puede usar -i para solicitar explícitamente los conectores SCTP. Aquí puede usar lsof -nP | grep -w 'SCTP.*:the-port' como heurístico en su lugar.

25
Stéphane Chazelas

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
3
Amol

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

  • Utilizar tcpdump port 1234 para 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 -w opción). Alternativamente, use Wireshark directamente.

  • En caso de que establezca y mantenga abierta una conexión tcp/udp, puede usar netstat para encontrar la IP remota de la conexión.

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

2
gertvdijk

Puede usar el comando sockstat 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.

1
Andrey Voitenkov

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 usando las opciones -A, -B de ggrep ...

En Linux, netstat -anp --inet funcionará, incluso sin lsof instalado. (suelta el --inet para obtener sockets de dominio Unix también)

0
Gert van den Berg