Dica 14: Como saber qual processo está utilizando determinada porta

Dica 14 – Como saber qual processo está utilizando determinada porta

Pra que saber qual processo está utilizando determinada porta ?

Imagine a situação: seu servidor está se comportando de maneira estranha, muito tráfego na rede por exemplo, e você analisa a rede e descobre que seu servidor está com uma ou mais portas abertas e ouvindo conexões.

Primeiro, como saber quais são as portas que estão abertas no Linux ? Para isso, vamos utilizar o comando netstat. De acordo com a página man do netstat (que pode ser acessada digitando man netstat), o netstat mostra conexões de rede, tabelas de roteamento, estatísticas de interface e conexões, mascaradas.

Neste artigo, precisaremos saber quais portas estão listen ou ouvindo (ou seja, aguardando conexões) no protocolo tcp. Para isso, usaremos os parâmetros n e a do netstat para não resolver nomes (vai mostrar somente o IP, que deixa o comando mais rápido) e mostrar todas as conexões respectivamente. Sem usar o a, o netstat só irá mostrar as portas que está conectadas. Alé disso, vamos usar o grep para filtrar o que for somente tcp e o que estiver com status listen, assim:

netstat -na | grep tcp | grep -i listen

Para saber que processo está utilizando determinada porta, execute o fuser seguido da porta/protocolo. Por exemplo, para ver qual processo está utilizando a porta 22, usamos o fuser assim:

# fuser 22/tcp
22/tcp: 1683

O comando fuser informou que a porta 22/tcp está sendo usada pelo processo cujo PID é 1683. Então temos que somente usar o ps para descobrir quem é o processo 1683:

# ps aux | grep 1683
root 1683 0.0 0.2 4984 1080 ? Ss 08:46 0:00 /usr/sbin/sshd

Neste caso, descobrirmos que a porta 22/tcp estava sendo usada pelo sshd. Nada anormal neste servidor :)

Podemos usar este procedimento para verificar todas as portas que estão abertas.

Para melhorar a dica, pode-se elaborar um script para automatizar esta tarefa. Este script poderia comparar as portas que estão abertas no momento com uma lista predefinida e, caso não estivesse ok, o script poderia enviar um email informando isso.


Atualizado em 14 de julho de 2009:

Complementando, no caso de um Sun Solaris, pode-se usar uma combinação dos comandos lsof, grep e ps, assim (supondo que desejamos saber o que roda na porta 12345):

# lsof |grep 12345
java      11110    root   10u  IPv4 0x300099a61e0           0t0     TCP *:12345 (LISTEN)
Aqui temos um processo do java rodando na porta 12345 TCP cujo PID é 11110 (segunda coluna). Então, basta um ps -ef com grep nesta porta, assim:
 
# ps -ef|grep 11110
root 11110     1  0   jul 06 ?       11:15 /opt/java/bin/java
 
 
Com isso, sabemos que é um processo do java que roda na porta 12345 e que o mesmo está no diretório /opt/java/bin/java.
 

Atualizado em 15 de maio de 2020:

 
Quase 10 anos após a última atualização (!!!), incluindo o comando para o Mac (pelo menos para a versão 10.13, High Sierra, mas acredito que também sirva para outras versões) .
 
Supondo que deseja saber qual processo está rodando na porta 22 TCP, basta executar:
 
# lsof -i tcp:22
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
launchd 1 root 40u IPv6 0xd7b650b0ec48643b 0t0 TCP *:ssh (LISTEN)
Uma observação é que o Mac possui um sistema mais ou menos (pelo menos para esse tipo de exemplo) como o antigo inetd de outros Unix. É um daemon que aguarda conexões e somente então o processo correspondente irá atender as requisições. Não serve para qualquer tipo de serviço, mas deixei o exemplo já para o pior caso.
 
Quando já há alguma conexão em andamento, a saída seria semelhante a essa:
 
# lsof -i tcp:22
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
launchd 1 root 21u IPv4 0xd7b650b0f19880eb 0t0 TCP 10.0.1.9:ssh->10.0.1.4:rfio (ESTABLISHED)
launchd 1 root 40u IPv6 0xd7b650b0ec48643b 0t0 TCP *:ssh (LISTEN)

Caso queria visualizar todas portas abertas, basta executar lsof -i.

11 comentários em “Dica 14: Como saber qual processo está utilizando determinada porta”

  1. Muito loko esse comando fuser…

    Mas por exemplo e no caso de portas que não são padrão?
    Por exemplo como sei o que está rodando na porta 1025?

  2. Dae cara,

    Uma coisinha um pouco mais encardida, hehehe. Como descobrir o processo que está ABRINDO uma conexão (porta de origem, não de destino). Exemplo: vc acha que tem algum processo que está abrindo portas pra algum lugar e que não deveria (ex. algum tipo de malware, ou usuário fazendo o q não deve). To pesquisando isso, mas tá meio chato de achar, vc já viu isso?

    Valeus a força :)

  3. Há outros meios de se obter resultado semelhante ao fuser, normalmente com o netstat. Se o seu netstat aceitar o parâmetro “-p”, ele deverá resolver seu problema.

    Exemplo, se quiser saber qual processo está conectado num determinado host na porta 80. Então, usamos o parâmetro “-p” no netstat (não tenho certeza de que qualquer netstat aceite este parâmetro):

    $ netstat -nap |grep -w 80
    tcp 0 0 72.14.181.75:60892 200.221.2.45:80 ESTABLISHED 26294/telnet

    Neste exemplo, há um telnet, cujo PID é 26294, conectado na porta 80 do IP 200.221.2.45.

  4. Entendi, só que no meu caso está um pouco mais chato. É uma máquina que não fui eu quem fez e q tem está abrindo uma conexão em localhost 127.0.0.1. Dai ele somente mostra o processo da posta q está escutando, e não abrindo. Tentei com o fuser e ele me dah um resposta em banco.
    Alguma ideia?
    Valeus.

  5. MANO! Obrigado velho…

    Ajudou pra caralho..
    Pelo NMAP, detectei duas portas abertas: 9001 e 10001.
    Que susto velho..

    Pesquisei várias vezes, ai pelo seu Tuto eu vi que era o Aptana Studio. haha’

    Fique com Deus! Falow!

  6. Nossa, muito bom mesmo. E para saber qual porta sobe uma determinada aplicação, como seria? Muito obg

  7. Post de matar amigo ! Parabéns !
    Eu já tava cansado de toda hora de ter usar a porcaria do netstat demorado e confuso para achar os programas que acessam as portas.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *