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.