Linux / Comando nc: verificar portas TCP e entender testes UDP

O comando nc (Netcat) abre conexões TCP ou envia datagramas UDP e também pode aguardar comunicações para transmitir dados. Para uma checagem rápida de uma porta TCP autorizada, -vz combina o teste sem dados de aplicação com mensagens de diagnóstico; uma conexão aceita não comprova que a aplicação esteja funcionando corretamente.

TCP, o Protocolo de Controle de Transmissão, estabelece uma conexão; UDP, o Protocolo de Datagramas do Usuário, não oferece o mesmo estabelecimento de conexão. Essa diferença é essencial para interpretar os resultados. As distribuições Linux podem fornecer OpenBSD netcat, Nmap Ncat ou outra implementação sob o nome nc, com opções que não são completamente intercambiáveis.

Sintaxe básica e implementação instalada

nc [opções] host porta

Substitua host pelo endereço IP ou nome da máquina autorizada e porta pelo número a verificar. Os colchetes descrevem opções e não devem ser digitados. Consulte nc -h, man nc e o pacote instalado antes de copiar opções de outra variante. Se o programa não estiver disponível, identifique o pacote da sua distribuição; não suponha que um programa de nome parecido tenha os mesmos argumentos.

O modo -z evita enviar dados de aplicação no teste TCP, mas ainda há tráfego para tentar estabelecer a conexão. Ele não significa “nenhum pacote enviado” nem é uma forma de testar TLS ou HTTP. As mensagens de diagnóstico podem ir para a saída de erro padrão, e a redação varia com a implementação.

Exemplos com portas locais

Verificar a porta normalmente usada por SSH

nc -vz 127.0.0.1 22

O endereço 127.0.0.1 é o loopback IPv4 da máquina em que o comando roda. A porta 22 é convencionalmente usada pelo Secure Shell (SSH), mas pode estar sem serviço ou ter outra configuração. O comando testa se essa porta TCP aceita uma conexão naquele endereço; não instala nem inicia um servidor SSH.

Se a conexão for aceita, espere uma mensagem de sucesso compatível com a variante instalada. Se houver recusa, confirme se o serviço está em execução e escutando exatamente no endereço e na porta testados. Um teste de loopback não demonstra que outro computador consiga acessar o serviço pela rede; uma execução dentro de um contêiner também tem seu próprio contexto de rede.

Limitar a espera de conexão

nc -w 3 -vz 127.0.0.1 80

A opção -w 3 pede um limite de três segundos conforme a implementação. No OpenBSD nc, ela cobre tentativas que não se completam e conexões ociosas; no Ncat, -w controla a tentativa de conexão, enquanto -i é o limite de ociosidade. Não trate essa opção como uma garantia universal de três segundos para qualquer modo de execução.

Em particular, o OpenBSD nc ignora -w em modo de escuta com -l. Um processo que aguarda uma conexão pode continuar aberto. A porta 80 do exemplo pode recusar imediatamente se não houver serviço; isso não é uma demonstração de que o timeout de três segundos foi atingido.

Abrir uma conexão para observar dados do serviço

nc -v 127.0.0.1 22

Sem -z, o programa permite ler e escrever dados na conexão. Um servidor SSH pode enviar uma linha inicial de identificação, mas outros serviços esperam que o cliente fale primeiro e não mostram nada de imediato. Ausência de texto não basta para concluir que a porta está fechada.

Use Ctrl+C para encerrar a sessão no terminal. Ler uma identificação SSH por essa conexão não realiza o protocolo de autenticação do SSH nem cria uma sessão SSH segura. Não digite senhas ou tokens para “experimentar”: estes exemplos não acrescentam criptografia ou validação de identidade ao fluxo TCP.

Interpretar o resultado de uma conexão

O exemplo seguinte mostra a forma de uma checagem TCP de uma única porta:

nc -vz example.com 443

example.com é um domínio reservado para documentação, não uma autorização para executar testes contra qualquer servidor público. Antes de testar uma máquina externa, substitua o destino pelo endereço que você tem permissão para verificar e mantenha a porta dentro do escopo autorizado.

Uma saída possível em uma implementação compatível é:

Connection to example.com 443 port [tcp/https] succeeded!

Essa linha é ilustrativa e indica que a tentativa de conexão TCP foi aceita. O rótulo https associado à porta 443 não é uma detecção ou validação do serviço: o teste não fez a negociação de Transport Layer Security (TLS, segurança da camada de transporte), não validou um certificado e não analisou uma resposta do Protocolo de Transferência de Hipertexto (HTTP).

Uma recusa imediata pode indicar ausência de um serviço naquela porta ou rejeição ativa por uma política de rede. Um timeout pode decorrer de filtragem, rota, destino indisponível ou outras condições. O nc sozinho não identifica qual delas é a causa. Compare a mensagem completa, o endereço realmente usado e a configuração do serviço antes de alterar qualquer regra.

Quando um nome é usado, a resolução pode escolher um endereço IPv4 ou IPv6. Não compare resultados de famílias ou máquinas diferentes como se fossem o mesmo teste. Os exemplos locais usam explicitamente IPv4; opções de seleção de família também devem ser confirmadas no manual instalado.

Opções principais e limites

Opção Efeito e limite
-z Testa a porta sem trocar dados de aplicação no caso TCP. Ainda tenta a conexão e não valida o protocolo do serviço.
-v Exibe mensagens de diagnóstico mais detalhadas. Não ativa criptografia.
-w segundos Define esperas conforme a implementação. OpenBSD nc ignora a opção com -l; Ncat separa espera de conexão e ociosidade.
-u Seleciona UDP. O resultado não tem o mesmo significado de um estabelecimento de conexão TCP.
-l Abre o modo de escuta para receber comunicações. Confira sintaxe, endereço de escuta e forma de encerramento da variante.

Ao usar escuta, confirme explicitamente a interface de rede: uma configuração pode aceitar tráfego além do loopback. Não crie um processo de escuta apenas para verificar um serviço já existente e não combine opções de variantes diferentes sem conferir o manual.

Por que UDP exige outra interpretação

UDP não realiza o estabelecimento de conexão do TCP. Enviar um datagrama sem receber resposta pode significar uma aplicação que não responde àquele conteúdo, filtragem, perda ou porta indisponível; o silêncio não confirma que a porta esteja aberta.

O manual do OpenBSD nc adverte que a combinação -uz pode relatar sucesso independentemente do estado do destino. Portanto, não use essa indicação como prova de disponibilidade UDP. Quando for necessário verificar um serviço UDP autorizado, use uma consulta apropriada ao protocolo e analise sua resposta; não aplique automaticamente o critério de sucesso TCP.

Uma sequência para diagnosticar com cuidado

  1. Identifique o pacote e as opções de nc. Anote o destino, a porta, a família de endereços e de onde o teste será feito.
  2. Confira se o serviço esperado está escutando no endereço e na porta corretos. Uma configuração limitada a loopback não implica acesso externo; um teste fora do contêiner pode alcançar outro contexto.
  3. Faça uma checagem da porta autorizada e compare sucesso, recusa ou timeout com a mensagem completa. Confira o código de saída imediatamente após o comando, antes que outro comando o substitua; a interpretação dos códigos depende da implementação.
  4. Verifique a aplicação com seu cliente apropriado. Para SSH, use o cliente SSH e sua validação de identidade; para HTTP/HTTPS, uma requisição com curl ajuda a examinar a resposta e os erros. A aceitação TCP é apenas uma etapa desse diagnóstico.

Na verificação deste artigo, nem nc nem ncat estavam disponíveis no Git Bash do Windows 11. Os quatro comandos passaram pela análise de sintaxe do Bash, mas não foram realizados testes de porta, conexão interativa ou escuta com essas ferramentas. A saída de sucesso mostrada é um exemplo de formato, não uma captura de execução no Linux.

Pergunta frequente

nc e ncat são o mesmo programa?

Não necessariamente. Ncat é uma implementação da família Netcat mantida pelo projeto Nmap; o nome nc no sistema pode apontar para ela ou para outra variante. Confira o pacote e a ajuda local, especialmente para timeout, escuta e recursos TLS; não copie opções entre implementações apenas por terem nomes parecidos.

Documentação oficial

Consulte o manual do nc no OpenBSD para a referência dessa implementação e o guia oficial do Ncat para suas diferenças. Em uma distribuição Linux, confirme também o manual do pacote efetivamente instalado.