Encuentre procesos locales que inicien conexiones TCP

Encuentre procesos locales que inicien conexiones TCP

Con tcpdump veo muchos paquetes SYN... y la IP de origen es Localhost.

Deseo saber qué procesos están intentando conectarse.

Tenga en cuenta que las conexiones no alcanzan el estado ESTABLECIDO, parecen ser escaneos de puertos aleatorios.

Respuesta1

He estado en la misma situación recientemente en Linux (el culpable fue adb). Mi enfoque fue utilizar el sistema de auditoría para registrar las connect()llamadas al sistema.

sudo auditctl -a exit,always  -F arch=b64  -S connect -k who-connects

Para indicarle al sistema de auditoría que registre todas connect()las llamadas al sistema (aquí, la variante de 64 bits, puede agregar otra para las variantes de 32 bits si está en un sistema de múltiples arcos con aplicaciones de 32 y 64 bits)

Ejecución posterior:

sudo ausearch -i -k who-connects

Para ver qué hizo las conexiones.

Aún sería posible realizar conexiones TCP sin utilizar la API de socket. Por ejemplo, implementando una pila TCP en el espacio del usuario y usando API de nivel inferior para enviar paquetes, pero eso no sería común (especialmente en la interfaz loopback).

Respuesta2

Suponiendo que tienes SystemTap instalado

probe begin {
    printf("ok\n");
}
probe syscall.connect {
    # connect however may fail or flail around in a EINPROGRESS state;
    # this log only indicates that a connect was attempted
    if (uaddr_af == "AF_INET" || uaddr_af == "AF_INET6")
        printf("%s[%d]: %s\n", execname(), pid(), argstr);
}
probe syscall.connect.return {
    printf(" -> %s[%d]: %s\n", execname(), pid(), retstr);
}

guardado como whomakeconnect.stpmostrará connectlas llamadas cuando se ejecute con stapcomoroot

# stap-prep
... fix anything reported, it requires debug kernels ...
# stap whomakeconnect.stp

Respuesta3

Puede utilizar el comando netstat. Muestra el estado del paquete. Pero tienes que captar el resultado, porque solo aparece en el momento del envío. No es como un socket de escucha tcp. Es por eso que puedes intentar capturarlo usando el comando watch. Supongo que la conexión es a través de ipv4.

watch -n 0.1 'netstat -4pn | grep -F "SYN_SENT"'

banderas nestat

bandera p: ID/nombre del proceso

n flag: salida numérica (sin resolución dns)

4 bandera: mostrar sockets ipv4

El comando watch hace que el comando netstat se ejecute de forma repetitiva con un período de 0,1 segundos.

información relacionada