Posso encontrar a lista de portas que estão sendo ouvidas por um processo ordenado pelo momento da abertura?

1

Eu sei que posso ver a lista de portas abertas usando o comando lsof .

Estou tentando visualizar os resultados solicitados pelo registro de data e hora de escuta.

O processo abre várias portas (~ 6) e suspeito que a ordem de inicialização / ligação nessa porta seja a causa de um bug. Tecnicamente, deve ser possível encontrar o timestamp relativo da ligação, observando o timestamp de criação do arquivo fd criado nos sistemas linux.

Minha consulta é: existe um comando (netstat ou lsof) que já faz isso?

P.S: Eu não quero percorrer a rota de examinar os logs porque algumas dessas portas são abertas por jars externos, cujo init está além do nosso controle.

    
por rajeshnair 19.05.2014 / 12:40

2 respostas

2

Esta informação não é (normalmente) registrada. Não há nenhum tempo de criação "disponível" para um arquivo , ctime é para o tempo de alteração do arquivo inode / metadados. Assim, após o fato, geralmente você não pode determinar com segurança os tempos relativos ou absolutos.

Em qualquer sistema Linux (2.6.xe 3.x) que testei, as entradas /proc relevantes não são instanciadas até que você as examine, todos os registros de data e hora são definidos para a hora em que o diretório é consultado pela primeira vez ( isto é, estes são criados sob demanda para mostrar o estado atual, o kernel não precisa de atualizações desnecessárias toda vez que qualquer manipulação de arquivo for alterada). Não esqueça que estes são todos symlinks , com timestamps independentes do alvo, e estes soquetes não "vivem" no sistema de arquivos.

$ strace -tt -f -e trace=bind,listen /usr/bin/nc -l -p 8080
13:23:23.693432 bind(3, {sa_family=AF_INET, sin_port=htons(8080), sin_addr=inet_addr(
                "0.0.0.0")},16) = 0
13:23:23.693542 listen(3, 1)            = 0

e em um terminal diferente, alguns segundos depois:

$ date;  ls -cl --full-time /proc/$(pgrep -f "^/usr/bin/nc -l -p 8080")/fd
Mon May 19 13:23:31 IST 2014
total 0
lrwx------ 1 mr users 64 2014-05-19 13:23:31.344141947 +0100 0 -> /dev/pts/206
lrwx------ 1 mr users 64 2014-05-19 13:23:31.344141947 +0100 1 -> /dev/pts/206
lrwx------ 1 mr users 64 2014-05-19 13:23:31.344141947 +0100 2 -> /dev/pts/206
lrwx------ 1 mr users 64 2014-05-19 13:23:31.344141947 +0100 3 -> socket:[206347913]

Todos os tempos de ligação simbólica são definidos 8 segundos depois, quando ls foi executado.

Observe o uso de strace , esta é possivelmente a maneira mais simples (embora com uma pequena sobrecarga de desempenho) para observar a ordem das operações de rede relevantes. Você pode não precisar ou querer usar -f , ele segue todos os processos (filhos) gerados, pode confundir a saída (cada linha de saída é prefixada com seu PID se for o caso).

O próximo método mais simples provavelmente usará auditd / auditctl com regras (e filtragem cuidadosa!) para registrar as operações, mas isso também tem implicações de desempenho (em todo o sistema, se você ainda não estiver executando auditd strace afetará somente os processos monitorados).

Quando você tiver pares se conectando, você pode usar netstat para ver os detalhes da conexão (a opção -p pode ser útil, pois mostrará o processo) ou usar lsof - embora nenhum deles mostre os registros de data e hora da conexão. Para gravar essas conexões usando strace , adicione accept à lista de syscalls na opção trace= e adicione uma opção -T para cronometrar cada syscall: accept() (geralmente) bloqueará, mostrando apenas o timestamp foi invocado em vez de quando foi concluído. -T isso permitirá que você calcule o tempo de conclusão.

A saída extra para accept() se parece com:

13:25:46.022244 accept(3, {sa_family=AF_INET, sin_port=htons(57534), sin_addr=inet_addr(
                "127.0.0.1")}, [16]) = 4 <3.167477>

mostrando que o soquete estava pronto para aceitar conexões às 13:25:46 e obteve sua primeira conexão 3.167 segundos depois.

    
por 19.05.2014 / 15:11
1

Isso parece fazer a maior parte do truque: ls --full-time /proc/$PID/fd

Você precisa combinar essa saída com a saída de lsof para saber qual número de porta corresponde a qual descritor de arquivo.

Atualização: Acontece que a data e hora retornada não é a hora exata da criação do descritor de arquivo, mas sim a hora do primeiro ls do diretório depois que o descritor de arquivo foi criado. Portanto, para obter tempos corretos com o método acima, você precisará executar o comando ls com frequência enquanto os soquetes estiverem sendo abertos.

    
por 19.05.2014 / 13:18