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 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 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 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 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 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 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 -zuquase sempre diz "succeeded". Precisa denmap -sUe 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
- Matar o processo que está usando a porta 8080
- Triagem de rede em linguagem simples: conexões, portas, DNS
- O processo que não quer morrer
Pare de decorar as flags do nc e do nmap — descreva o problema e o CliAI escreve o comando. Instale em uma linha.