CLI AI

Verificar se uma porta está aberta em um servidor remoto

2026-06-10

O jeito rápido é nc -zv host porta: "succeeded" significa que a porta está aberta, "refused" significa que a máquina respondeu mas ninguém está escutando, e silêncio total quase sempre significa que um firewall está descartando o pacote. São três falhas diferentes com três soluções diferentes. Esta é a árvore de decisão para distingui-las, não mais uma lista de cinco ferramentas que fazem o mesmo handshake.

1. A porta está mesmo aberta?

clai
$ clai verifica se a porta 8099 está aberta em 127.0.0.1→ nc -zv 127.0.0.1 8099Connection to 127.0.0.1 8099 port [tcp/*] succeeded!

-z só testa a conexão sem enviar dados, -v imprime o resultado. É a resposta mais curta possível.

2. Porta fechada — e essa é uma resposta concreta

clai
$ clai verifica a porta 8098→ nc -zv 127.0.0.1 8098nc: connect to 127.0.0.1 port 8098 (tcp) failed: Connection refused

"Connection refused" significa que a máquina está acessível e rejeitou ativamente a conexão — ninguém está escutando nessa porta. É boa notícia: a rede está bem, o problema é o serviço.

3. Distinguir recusa de silêncio

clai
$ clai verifica as portas 8098 e 8099 e mostra o motivo→ nmap --reason -p 8099,8098 127.0.0.1PORT     STATE  SERVICE REASON8098/tcp closed unknown conn-refused8099/tcp open   unknown syn-ack

A coluna REASON é o diagnóstico de verdade. syn-ack é aberta. conn-refused é ninguém escutando. no-response significa que o pacote sumiu — quase sempre um firewall. É o único lugar onde as três causas aparecem separadas.

4. Olhar pelo outro lado: quem está escutando

clai
$ clai mostra qual processo está escutando na porta 8099→ ss -tlnp | grep 8099LISTEN 0      5            0.0.0.0:8099       0.0.0.0:*    users:(("python3",pid=2411411,fd=3))

0.0.0.0:8099 significa todas as interfaces. Se fosse 127.0.0.1:8099, o serviço só responderia localmente, e uma checagem remota falharia mesmo com o serviço perfeitamente saudável. Essa é a terceira causa, e só aparece aqui.

5. Sem nc, sem nmap instalado

clai
$ clai verifica a porta sem instalar ferramentas extras→ timeout 2 bash -c 'echo > /dev/tcp/127.0.0.1/8099' && echo "open" || echo "closed"open

O bash consegue abrir uma conexão TCP crua pelo pseudo-dispositivo /dev/tcp. Funciona num container nu, sem nc nem nmap. timeout é obrigatório — sem ele, uma porta filtrada te deixa esperando o timeout do próprio kernel.

6. Verificar várias portas de um host remoto de uma vez

clai
$ clai verifica as portas 22, 80 e 443 em example.com→ nmap -Pn -p 22,80,443 example.com

-Pn pula a checagem de ping. Muitos hosts não respondem a ICMP, e sem essa flag o nmap decide que o host está fora do ar e nem chega a escanear as portas.

Pegadinhas

  • "Connection refused" e "timeout" são diagnósticos diferentes. Refused significa que o pacote chegou na máquina. Silêncio significa firewall ou perda de pacote. Não trate um como o outro.
  • Escanear hosts que não são seus pode ser ilegal. Aponte o nmap para a sua própria infraestrutura, não para a dos outros.
  • UDP não dá pra checar assim. Não existe handshake para UDP, então nc -zu quase sempre diz "succeeded". Precisa de nmap -sU e paciência.

Perguntas relacionadas

A porta está aberta mas o app não responde. O processo errado está escutando, ou ele é lento demais para responder. Veja a saída de ss -tlnp e os logs do serviço.

Como verifico uma porta a partir do Windows? Test-NetConnection -Port 443 example.com no PowerShell.

Por que o telnet não é mais recomendado? Faz a mesma coisa, mas raramente vem instalado, enquanto nc e /dev/tcp estão disponíveis quase em todo lugar.

Veja também

Pare de decorar as flags do nc e do nmap — descreva o problema e o CliAI escreve o comando. Instale em uma linha.