segunda-feira, 26 de setembro de 2011

Verificar em qual porta um processo está executando

Em um determinado momento, você está no seu servidor Linux ou Windows, ou até mesmo em uma estação e roda o comando nmap para saber quais portas estão abertas. Eis que o nmap lista uma porta que você não reconhece a princípio qual processo está escutando nela. Como saber qual programa está usando essa porta?

Se a sua máquina for Linux, execute nela o comando fuser da seguinte forma:

fuser -vu porta/protocolo

Onde porta é qualquer porta que você queira saber e protocolo são os famosos tcp e udp. Segue um exemplo:

[root@cpd2 ~]# fuser -vu 30033/tcp
                           USER        PID     ACCESS     COMMAND
30033/tcp:           rodrigo    6820      F....             (rodrigo)ts3server_linux

No exemplo acima pedi que ele listasse os processos que estão sendo executados na porta 30033 usando protocolo TCP. A opção -v é de verbose, que faz com que ele mostre o nome do processo e a -u é de user, que mostra qual usuário iniciou o mesmo.
Ele mostra que o processo é o ts3server_linux que tem o PID (process ID) 6820 e roda através do usuário rodrigo.

Se a máquina for Windows, usaremos o conhecido netstat:

netstat parâmetros 

No Windows não achei uma forma nativa de especificar a porta e nem como filtrar a saída deixando somente a porta desejada. No caso acima ele listará todas as portas abertas (inclusive se você estiver com o navegador aberto, ele listará também as conexões) e mostrará quais programas estão utilizando-as. Normalmente a lista é muito grande, principalmente se você tiver muitas páginas abertas no momento ou fazendo download via torrent. No exemplo abaixo colocarei apenas o início do resultado do comando:

C:\Windows\system32>netstat -bn
Active Connections

Proto  Local Address          Foreign Address        State
TCP    127.0.0.1:1031         127.0.0.1:1032         ESTABLISHED
[TeamViewer_Service.exe]
TCP    127.0.0.1:1032         127.0.0.1:1031         ESTABLISHED
[TeamViewer_Service.exe]
TCP    127.0.0.1:1041         127.0.0.1:1042         ESTABLISHED
[TeamViewer.exe]
TCP    127.0.0.1:1042         127.0.0.1:1041         ESTABLISHED
[TeamViewer.exe]
TCP    192.168.0.104:2869     192.168.0.1:2066       CLOSE_WAIT
Can not obtain ownership information

A opção -b mostra o nome do processo e a opção -n mostra o IP e a porta ao invés de tentar usar DNS para resolver os endereços (o que demoraria mais para gerar o resultado).

Prestando um pouco mais de atenção no resultado, na última linha do exemplo ele diz que não conseguiu obter informação do processo que está sendo executado. Isso acontece quando geralmente não se tem permissão suficiente ou então a conexão já está sendo encerrada.

As ferramentas acima são bem úteis tanto para verificar possíveis portas abertas (analisando a necessidade de deixá-las abertas ou fechá-las) quanto para ver se o processo está sendo executado na porta correta. Existem outros parâmetros que podem ser utilizados, sugiro que deem uma verificada no help de cada um deles pois pode ser que tenha alguma opção que sirva mais para determinados casos.

[root@cpd2 ~]# fuser --help

C:\Windows\system32>netstat /?