Introdução ao nc (netcat) - A Ferramenta Versátil para Teste de Portas e Depuração

Introdução ao nc (netcat) - A Ferramenta Versátil para Teste de Portas e Depuração

O Que Você Vai Aprender

  • Como verificar conectividade de porta com um único comando nc -zv
  • Como criar um listener temporário para teste de conexão
  • Padrões de transferência de arquivo, banner grabbing e modo UDP
  • A diferença entre nc.openbsd e ncat, e como corrigir suporte ausente ao -z

Resumo Rápido

  • Verificação de porta -> nc -zv host porta
  • Servidor simples -> nc -l 8080 (lado receptor)
  • Transferência de arquivo -> receptor: nc -l 9999 > out.txt, remetente: nc host 9999 < in.txt
  • Defina um timeout com -w <segundos> para evitar travamentos indefinidos

O Que É o nc (netcat)?

nc (netcat) é uma ferramenta de linha de comando de uso geral que lê e escreve diretamente em sockets TCP/UDP -- ganhando o apelido de "canivete suíço das redes." Diferente do curl (somente HTTP) ou ping (somente ICMP), o nc funciona com qualquer porta e qualquer protocolo. Como o nc pode atuar como cliente e servidor, você pode testar conectividade antes de um serviço estar rodando -- tornando-o invaluavel para verificações pré-deploy, validação de ambientes CI e depuração ao vivo.

Como Testar se uma Porta Está Aberta?

Use -z (modo zero-I/O -- conecta sem enviar dados) combinado com -v (saída detalhada).

$ nc -zv example.com 80
Connection to example.com 80 port [tcp/http] succeeded!

$ nc -zv example.com 22
Connection to example.com 22 port [tcp/ssh] succeeded!

Quando uma porta está fechada ou inacessível:

$ nc -zv example.com 25
nc: connectx to example.com port 25 (tcp) failed: Connection refused

Escanear um intervalo de portas de uma vez:

$ nc -zv example.com 20-25

Adicione -w <segundos> para definir um timeout de conexão e evitar travamento em hosts que não respondem.

$ nc -zv -w 3 192.168.1.10 443

Como Iniciar um Servidor Simples?

A flag -l coloca o nc em modo de escuta, aguardando na porta especificada. Quando uma conexão chega, o nc faz a ponte com stdin/stdout.

# Lado receptor (inicie primeiro)
$ nc -l 8080

# Lado remetente (em um terminal separado)
$ nc localhost 8080
Hello from client!

O texto digitado no remetente aparece no receptor em tempo real. A conexão é bidirecional, então ambos os lados podem digitar.

O nc transmite dados em texto plano sem autenticação ou criptografia. Ele não foi projetado como um servidor de produção persistente.

É Possível Transferir Arquivos com nc?

Sim -- use redirecionamento do shell. Isso é útil para passagem rápida de dados em ambientes onde scp/rsync não está disponível.

# Lado receptor (inicie primeiro)
$ nc -l 9999 > received.tar.gz

# Lado remetente
$ nc receiver-host 9999 < archive.tar.gz

O nc do remetente sai quando atinge o EOF. Se o receptor não sair automaticamente, pressione Ctrl+C.

No nc sabor OpenBSD, adicione -q 0 no lado receptor para sair automaticamente no EOF.

$ nc -l 9999 -q 0 > received.tar.gz

Conecte com nc e envie manualmente uma requisição no nível do protocolo para inspecionar a resposta do serviço.

Verificação de Cabeçalho HTTP

$ printf "HEAD / HTTP/1.0\r\n\r\n" | nc example.com 80
HTTP/1.1 200 OK
Server: nginx/1.24.0
...
$ nc mail.example.com 25
220 mail.example.com ESMTP Postfix (Ubuntu)

Informações de banner (nome do software, versão, dicas de SO) são úteis para verificação de deploy e avaliações de segurança.

Como Usar o Modo UDP?

Adicione a flag -u para mudar de TCP para UDP. Use para testar serviços UDP como DNS (53), NTP (123) e syslog (514).

# Verificacao de conectividade de porta UDP
$ nc -u -zv 8.8.8.8 53
Connection to 8.8.8.8 53 port [udp/domain] succeeded!

# Listener UDP simples
$ nc -u -l 5005

UDP é sem conexão, então verificações com -z podem ser enganosas: se o host remoto recebe o pacote mas não envia resposta, o nc ainda reporta falha. Para escaneamento preciso de portas UDP, considere nmap -sU.

Quais São as Diferentes Variantes do nc?

O Linux inclui múltiplas implementações do nc com diferentes conjuntos de opções.

Comando Pacote Notas
nc (OpenBSD) netcat-openbsd Padrão no Ubuntu/Debian. Suporta -z, -w, -q
nc (Traditional) netcat-traditional Versão mais antiga. Sem -z; suporta -e para exec
ncat ncat (incluído no nmap) Suporte SSL/TLS, modo broker

Verificar qual variante está instalada:

$ nc -h 2>&1 | head -1
OpenBSD netcat (Debian patchlevel 1.226-1)

Mudar para a versão OpenBSD no Ubuntu:

$ sudo apt install netcat-openbsd
$ sudo update-alternatives --config nc

Armadilhas Comuns

1. nc: invalid option -- 'z'

O pacote netcat-traditional está instalado. Instale netcat-openbsd e mude para ele (veja Variantes acima).

2. "Connection refused" Mesmo Quando a Porta Deveria Estar Aberta

A aplicação não está escutando, ou um firewall está bloqueando.

# Verificar estado LISTEN
$ ss -tlnp | grep ':8080'

# Verificar regras UFW
$ sudo ufw status

3. Transferência de Arquivo Trava e Nunca Completa

O nc do receptor está esperando mais dados. No remetente, confirme que o EOF é enviado quando o arquivo termina (é enviado, com redirecionamento). No receptor, use -q 0 (OpenBSD) ou pressione Ctrl+C.

4. "Address already in use" ao Reutilizar uma Porta

A porta está em estado TIME_WAIT. Verifique com:

$ ss -tlnp | grep ':8080'

Use uma porta diferente ou espere alguns segundos antes de tentar novamente.

Próximas Leituras