Encontre processos locais iniciando conexões TCP

Encontre processos locais iniciando conexões TCP

Com o tcpdump vejo muitos pacotes SYN ... e o IP de origem é Localhost.

Desejo descobrir quais processos estão tentando se conectar.

Observe que as conexões não atingem o estado ESTABLISHED, elas parecem ser varreduras de portas aleatórias.

Responder1

Estive na mesma situação recentemente no Linux (o culpado foi adb). Minha abordagem foi usar o sistema de auditoria para registrar as connect()chamadas do sistema.

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

Para informar ao sistema de auditoria para registrar todas connect()as chamadas do sistema (aqui a variante de 64 bits, você pode adicionar outra para as variantes de 32 bits se estiver em um sistema multi-arch com aplicativos de 32 e 64 bits)

Execução posterior:

sudo ausearch -i -k who-connects

Para ver o que fez conexões.

Ainda seria possível fazer conexões TCP sem usar a API do soquete. Por exemplo, implementando uma pilha TCP no espaço do usuário e usando APIs de nível inferior para enviar pacotes, mas isso não seria comum (especialmente na interface de loopback).

Responder2

Supondo que você tenha o 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);
}

salvo como whomakeconnect.stpmostrará connectas chamadas quando executado com stapcomoroot

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

Responder3

Você pode usar o comando netstat. Mostra o estado do pacote. Mas tem que pegar a saída, pois ela só aparece na hora do envio. Não é como um soquete de escuta TCP. É por isso que você pode tentar capturá-lo usando o comando watch. Suponho que a conexão seja via ipv4.

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

bandeiras nestat

sinalizador p: id/nome do processo

n sinalizador: saída numérica (sem resolução de DNS)

4 sinalizador: mostrar soquetes ipv4

O comando watch faz com que o comando netstat seja executado repetitivamente com um período de 0,1 segundo.

informação relacionada