Como Verificar Portas Abertas no Mac: lsof, netstat e nc
Verifique portas abertas no Mac usando lsof -i :3000, netstat e nc. Abrange verificação de portas locais e teste em hosts remotos, com exemplos reais de saída de comandos.
Você executou o rails server e nada carregou. Ou está tentando se conectar a um servidor remoto e não recebe nenhuma resposta. A primeira pergunta é sempre a mesma: a porta está realmente aberta?
Verificar o status de uma porta no Mac leva um comando. O truque é saber qual comando usar dependendo se você está verificando seu próprio Mac ou um host remoto.
Verificando as portas abertas do seu Mac
Este é o caso mais comum para desenvolvedores. Seu servidor de desenvolvimento deveria estar rodando na porta 3000, mas o navegador diz que não consegue se conectar. A porta está ouvindo?
lsof -i :porta (a resposta rápida)
lsof -i :3000
Se algo estiver ouvindo, você verá uma saída como esta:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
ruby 8421 aaron 13u IPv4 0x3f8a2b4c 0t0 TCP *:3000 (LISTEN)
Se a saída estiver vazia, nada está vinculado a essa porta. Seu servidor Rails não está rodando ou foi iniciado em uma porta diferente.
Para a porta 8080:
lsof -i :8080
Para a porta 80 (requer sudo, pois é uma porta privilegiada):
sudo lsof -i :80
lsof -i | grep LISTEN (ver tudo de uma vez)
Para ver todas as portas que seu Mac está ouvindo:
lsof -i | grep LISTEN
A saída 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)
Observe localhost:5432 versus *:3000. O Postgres só aceita conexões da mesma máquina. O Rails aceita de qualquer lugar na rede. Essa distinção importa quando você está tentando se conectar de outro dispositivo.
Se quiser portas numéricas sem buscas de hostname (mais rápido):
lsof -i -n -P | grep LISTEN
netstat -an | grep LISTEN
O netstat oferece uma visão semelhante em formato diferente:
netstat -an | grep LISTEN
A saída fica assim:
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 pela rede). 127.0.0.1.5432 significa apenas localhost.
O netstat é útil quando você quer uma lista simples sem nomes de processos. O lsof é melhor quando você precisa saber qual aplicativo controla qual porta.
O que os resultados significam
Algo na saída LISTEN: a porta está aberta e um processo a controla. Se você ainda não consegue se conectar, o problema está em outro lugar (firewall, IP errado, autenticação).
Sem saída do lsof / nada no netstat: nada está ouvindo nessa porta. O serviço não está rodando ou foi iniciado em uma porta diferente.
A saída mostra 127.0.0.1 ou localhost: o serviço só aceita conexões locais. Você não conseguirá acessá-lo de outra máquina ou do seu celular na mesma rede.
Verificando a porta de um host remoto
Quando você precisa testar se uma porta está aberta em um servidor que não controla, não pode usar o lsof. Em vez disso, você tenta se conectar e vê 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 ouvindo):
nc: connectx to hostname port 80 (tcp) failed: Connection refused
Se estiver filtrada (firewall descartando pacotes):
nc: connectx to hostname port 25 (tcp) failed: Operation timed out
“Connection refused” significa que o servidor está acessível, mas nada está nessa porta. “Timed out” significa que um firewall provavelmente está descartando seus pacotes antes que eles cheguem.
Exemplos reais:
# O HTTPS está funcionando no meu servidor?
nc -zv myserver.com 443
# O SSH está aberto nessa máquina?
nc -zv 192.168.1.100 22
# Consigo acessar a porta do banco de dados desta máquina?
nc -zv db.internal 5432
Você também pode verificar várias portas de uma vez:
nc -zv hostname 80 443 8080
Interpretando os resultados
| Resultado | Significado |
|---|---|
| Connection succeeded | Porta aberta, algo está ouvindo |
| Connection refused | Porta fechada, nada ouvindo |
| Operation timed out | Firewall está bloqueando a conexão |
| Name or service not known | O hostname não resolve (problema de DNS) |
Se uma porta é bem-sucedida mas seu serviço ainda não funciona, o problema está na camada de aplicativo: credenciais erradas, incompatibilidade de protocolo, o aplicativo rejeitando a conexão.
Portas comuns para verificar
Ao depurar, essas são as portas que aparecem com mais frequência:
- 22 (SSH): não consegue acessar via SSH? Verifique esta primeiro.
- 80 (HTTP) e 443 (HTTPS): servidor web não responde.
- 3000, 3001, 8000, 8080: portas comuns de servidor de desenvolvimento. Rails usa 3000 por padrão, muitos aplicativos Node usam 8080.
- 5432 (PostgreSQL), 3306 (MySQL), 27017 (MongoDB): problemas de conexão com banco de dados.
- 25 (SMTP): aplicativo não consegue enviar e-mail? Frequentemente bloqueado por provedores de internet e provedores de nuvem.
Segurança: quais portas seu Mac está expondo?
Executar lsof -i | grep LISTEN vale a pena ocasionalmente do ponto de vista da segurança. Cada porta ouvindo é um ponto de entrada em potencial. Em um laptop, você geralmente quer ver o menor número possível de portas abertas.
Culpados comuns por portas abertas inesperadas:
- Servidores de desenvolvimento deixados rodando (Rails, Node, Webpack)
- Docker mapeando portas para o host
- Remote Desktop ou Compartilhamento de Tela habilitados
- Receptor AirPlay
- Aplicativos de terceiros executando serviços em segundo plano
Se você ver algo que não reconhece, pegue o PID da saída do lsof e pesquise:
ps aux | grep <PID>
Usando o firewall do macOS
O firewall do macOS controla o que pode se conectar ao seu Mac de fora. Verifique-o em Ajustes do Sistema > Rede > Firewall (ou Ajustes do Sistema > Privacidade e Segurança > Firewall em algumas versões).
Quando o firewall está ativado, outras máquinas não conseguem acessar serviços ouvindo no seu Mac, a menos que você os tenha explicitamente permitido. Seu Mac ainda consegue fazer conexões de saída.
Se seu servidor de desenvolvimento local carrega bem no seu navegador mas não no seu celular na mesma rede, o firewall é provavelmente o motivo.
Opção com interface gráfica: scanner de portas do NetUtil
Se preferir não digitar comandos, o NetUtil inclui um scanner de portas. Digite um hostname e intervalo de portas, e ele mostra quais portas estão abertas em uma tabela. É o substituto direto para o scanner 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 depois que você os aprende. lsof -i :3000 são quatro toques de tecla para digitar após ter feito isso algumas vezes. Para verificações ocasionais ou quando quiser varrer um intervalo de portas em um servidor remoto, uma ferramenta com interface gráfica economiza tempo.
Referência rápida
Verificar se seu Mac está ouvindo em uma porta específica:
lsof -i :3000
Ver todas as portas que seu Mac está ouvindo:
lsof -i | grep LISTEN
O mesmo com netstat:
netstat -an | grep LISTEN
Verificar se uma porta remota está aberta:
nc -zv hostname 443
O status da porta no seu Mac indica se um serviço está rodando. O status da porta em um host remoto indica se esse serviço está acessível. São duas perguntas diferentes, com duas ferramentas diferentes.