Como Verificar Portas Abertas no Mac: lsof, netstat e nc
Verifica portas abertas no Mac usando lsof -i :3000, netstat e nc. Cobre a verificação de portas locais e o teste de servidores remotos, com exemplos reais de saída de comandos.
Executaste rails server e nada carregou. Ou estás a tentar ligar a um servidor remoto e não recebes nada. A primeira pergunta é sempre a mesma: a porta está realmente aberta?
Verificar o estado de uma porta no Mac requer apenas um comando. O truque é saber qual usar dependendo se estás a verificar o teu próprio Mac ou um servidor remoto.
Verificar as portas abertas do teu Mac
Este é o caso mais comum para programadores. O teu servidor de desenvolvimento devia estar a correr na porta 3000, mas o browser diz que não consegue ligar. A porta está sequer a escutar?
lsof -i :porta (a resposta rápida)
lsof -i :3000
Se algo estiver a escutar, verás um resultado semelhante a este:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
ruby 8421 aaron 13u IPv4 0x3f8a2b4c 0t0 TCP *:3000 (LISTEN)
Se o resultado estiver vazio, nada está vinculado a essa porta. O teu servidor Rails não está a correr, ou iniciou numa porta diferente.
Para a porta 8080:
lsof -i :8080
Para a porta 80 (requer sudo por ser uma porta privilegiada):
sudo lsof -i :80
lsof -i | grep LISTEN (ver tudo de uma vez)
Para ver todas as portas em que o teu Mac está atualmente a escutar:
lsof -i | grep LISTEN
O resultado mostra todos os processos com uma porta de escuta aberta:
ruby 8421 aaron 13u IPv4 TCP *:3000 (LISTEN)
node 9102 aaron 21u IPv6 TCP *:8080 (LISTEN)
postgres 1234 aaron 5u IPv4 TCP localhost:5432 (LISTEN)
Repara em localhost:5432 versus *:3000. O Postgres apenas aceita ligações da mesma máquina. O Rails aceita de qualquer lugar da rede. Esta distinção é importante quando estás a tentar ligar a partir de outro dispositivo.
Se quiseres portas numéricas sem pesquisas de nomes de host (mais rápido):
lsof -i -n -P | grep LISTEN
netstat -an | grep LISTEN
O netstat fornece uma vista semelhante num formato diferente:
netstat -an | grep LISTEN
O resultado tem este aspeto:
tcp4 0 0 *.3000 *.* LISTEN
tcp4 0 0 127.0.0.1.5432 *.* LISTEN
tcp6 0 0 *.8080 *.* LISTEN
O endereço antes da porta indica a interface. *.3000 significa todas as interfaces (acessível a partir da rede). 127.0.0.1.5432 significa apenas localhost.
O netstat é útil quando queres uma lista simples sem nomes de processos. O lsof é melhor quando precisas de saber qual aplicação possui qual porta.
O que significam os resultados
Algo na saída LISTEN: A porta está aberta e um processo é o seu proprietário. Se ainda não consegues ligar, o problema está noutro lugar (firewall, IP errado, autenticação).
Sem saída do lsof / nada no netstat: Nada está a escutar nessa porta. O serviço ou não está a correr ou iniciou numa porta diferente.
A saída mostra 127.0.0.1 ou localhost: O serviço apenas aceita ligações locais. Não conseguirás alcançá-lo a partir de outra máquina ou do teu telemóvel na mesma rede.
Verificar a porta de um servidor remoto
Quando precisas de testar se uma porta está aberta num servidor que não controlas, não podes usar lsof. Em vez disso, tentarás efetivamente a ligação e verás o que acontece.
nc -zv (a ferramenta certa)
nc -zv hostname 443
Se a porta estiver aberta:
Connection to hostname port 443 [https] succeeded!
Se estiver fechada (nada a escutar):
nc: connectx to hostname port 80 (tcp) failed: Connection refused
Se estiver filtrada (firewall a descartar pacotes):
nc: connectx to hostname port 25 (tcp) failed: Operation timed out
“Connection refused” significa que o servidor é acessível mas nada está nessa porta. “Timed out” significa que uma firewall provavelmente está a descartar os teus pacotes antes de chegarem.
Exemplos reais:
# O HTTPS está a funcionar no meu servidor?
nc -zv myserver.com 443
# O SSH está aberto nesta máquina?
nc -zv 192.168.1.100 22
# Consigo alcançar a porta da base de dados a partir desta máquina?
nc -zv db.internal 5432
Também podes verificar múltiplas portas de uma vez:
nc -zv hostname 80 443 8080
Interpretar os resultados
| Resultado | Significado |
|---|---|
| Connection succeeded | A porta está aberta, algo está a escutar |
| Connection refused | A porta está fechada, nada a escutar |
| Operation timed out | Uma firewall está a bloquear a ligação |
| Name or service not known | O nome do host não resolve (problema de DNS) |
Se uma porta tem sucesso mas o teu serviço ainda não funciona, o problema está na camada da aplicação: credenciais erradas, incompatibilidade de protocolo, a aplicação a rejeitar a ligação.
Portas comuns a verificar
Ao depurar, estas são as portas que surgem com mais frequência:
- 22 (SSH): Não consegues aceder por SSH? Verifica esta primeiro.
- 80 (HTTP) e 443 (HTTPS): Servidor web não está a responder.
- 3000, 3001, 8000, 8080: Portas comuns de servidores de desenvolvimento. O Rails usa 3000 por defeito, muitas aplicações Node usam 8080.
- 5432 (PostgreSQL), 3306 (MySQL), 27017 (MongoDB): Problemas de ligação à base de dados.
- 25 (SMTP): A aplicação não consegue enviar e-mail? Frequentemente bloqueado por FSIs e fornecedores de cloud.
Segurança: que portas está o teu Mac a expor?
Executar lsof -i | grep LISTEN vale a pena de vez em quando do ponto de vista da segurança. Cada porta em escuta é um ponto de entrada potencial. Num portátil, normalmente queres ver o menor número possível de portas abertas.
Culpados comuns por portas abertas inesperadas:
- Servidores de desenvolvimento deixados a correr (Rails, Node, Webpack)
- Docker a mapear portas para o host
- Remote Desktop ou Partilha de Ecrã ativada
- Recetor AirPlay
- Aplicações de terceiros a correr serviços em segundo plano
Se vires algo que não reconheces, obtém o PID a partir da saída do lsof e pesquisa-o:
ps aux | grep <PID>
Usar a firewall do macOS
A firewall do macOS controla o que pode ligar ao teu Mac a partir do exterior. Verifica-a em Definições do Sistema > Rede > Firewall (ou Definições do Sistema > Privacidade e Segurança > Firewall em algumas versões).
Quando a firewall está ativa, outras máquinas não conseguem alcançar os serviços em escuta no teu Mac, a menos que os tenhas permitido explicitamente. O teu Mac ainda pode fazer ligações de saída.
Se o teu servidor de desenvolvimento local carrega bem no teu browser mas não no teu telemóvel na mesma rede, a firewall é provavelmente a razão.
Opção gráfica: analisador de portas do NetUtil
Se preferires não escrever comandos, o NetUtil inclui um analisador de portas. Introduz um nome de host e um intervalo de portas, e mostra quais as portas abertas numa tabela. É o substituto direto do analisador de portas que costumava estar no Network Utility da Apple antes de ser removido no macOS Monterey.
Para depuração regular, os comandos do Terminal são mais rápidos assim que os conheces. lsof -i :3000 são quatro toques de tecla assim que o fizeste algumas vezes. Para verificações ocasionais ou quando queres analisar um intervalo de portas num servidor remoto, uma ferramenta gráfica poupa tempo.
Referência rápida
Verificar se o teu Mac está a escutar numa porta específica:
lsof -i :3000
Ver todas as portas em que o teu Mac está a escutar:
lsof -i | grep LISTEN
O mesmo com netstat:
netstat -an | grep LISTEN
Verificar se uma porta remota está aberta:
nc -zv hostname 443
O estado da porta no teu Mac indica se um serviço está a correr. O estado da porta num servidor remoto indica se esse serviço é acessível. Duas perguntas diferentes, duas ferramentas diferentes.