Andiamo dritti al punto: a cosa serve nc -zv?

Se ti occupi di sistemi, reti o semplicemente stai cercando di capire perché il tuo server non risponde su una specifica porta, probabilmente hai già sentito parlare di Netcat. Spesso definito il 'coltellino svizzero' del networking, Netcat permette di leggere e scrivere dati attraverso connessioni TCP e UDP.

Ma quando digitiamo nc -zv nel terminale, non stiamo cercando di trasferire file o creare una shell remota. Stiamo facendo qualcosa di molto più semplice, ma fondamentale: un port scanning rapido.

In pratica, stiamo chiedendo al sistema: "Ehi, l'indirizzo X è raggiungibile sulla porta Y?".

È uno strumento essenziale per il troubleshooting. Molto più veloce di un telnet e decisamente meno pesante di una scansione completa con Nmap quando devi solo verificare un singolo servizio.

Scomponiamo il comando: cosa significano queste opzioni?

Per capire davvero come funziona, dobbiamo guardare i singoli flag. Non è magia, è sintassi.

Il primo è -z. Questo parametro dice a Netcat di andare in modalità zero-I/O. In parole povere: "non inviare alcun dato dopo che la connessione è stata stabilita". Netcat prova ad aprire la connessione e, non appena riceve conferma (o un rifiuto), chiude tutto immediatamente.

Senza -z, il comando rimarrebbe in attesa di input dall'utente, rendendo impossibile automatizzare i test o scansionare più porte velocemente.

Poi c'è -v. Sta per verbose. Senza questo flag, Netcat è estremamente silenzioso. Se la porta è aperta, non ti dice nulla; se è chiusa, spesso non ricevi feedback immediato. Aggiungendo -v, il programma diventa loquace e ti informa esattamente cosa sta succedendo: se la connessione è riuscita o se c'è stato un timeout.

Un dettaglio non da poco: a seconda della versione di Netcat installata (BSD vs GNU), potresti aver bisogno di aggiungere -n per evitare che il sistema provi a risolvere i nomi DNS, velocizzando ulteriormente l'operazione.

Esempi pratici: come usarlo davvero

Immaginiamo di voler testare se un server web è raggiungibile sulla porta standard 80. Il comando sarà:

nc -zv 192.168.1.10 80

Se tutto va bene, vedrai un messaggio simile a Connection to 192.168.1.10 80 port [tcp/http] succeeded!. Se invece ricevi un errore di "Connection refused" o il comando sembra "congelarsi", hai la risposta: qualcosa sta bloccando il traffico.

Ma cosa succede se devi controllare un intero intervallo di porte? Qui è dove Netcat mostra i muscoli.

Puoi specificare un range in questo modo:

nc -zv 192.168.1.10 20-80

Netcat proverà a connettersi a ogni singola porta tra la 20 e la 80. Utile? Sì. Efficiente per migliaia di porte? No, per quello serve Nmap. Ma per un check rapido su un range ristretto è imbattibile.

Perché nc -zv fallisce? I tre colpevoli classici

Non sempre un "failed" significa che il servizio è spento. Spesso il problema sta altrove.

Il Firewall. È il sospettato numero uno. Se un firewall (iptables, ufw o un hardware esterno) è configurato per droppare i pacchetti invece di rifiutarli, Netcat rimarrà in attesa fino al timeout. Vedrai che il comando ci mette diversi secondi prima di darti errore.

Il servizio non è in ascolto. Se il server è raggiungibile ma l'applicazione (ad esempio un database MySQL sulla 3306) non è avviata, riceverai un "Connection refused" quasi istantaneo. Il sistema operativo risponde: "Sì, ci sono, ma qui non c'è nessuno che ascolta".

L'interfaccia di ascolto sbagliata. Questo è l'errore più comune per chi configura server. Molti servizi di default ascoltano solo su localhost (127.0.0.1). Se provi a fare un nc -zv dall'esterno verso l'IP pubblico, fallirà miseramente, anche se il servizio è attivo e funzionante localmente.

UDP vs TCP: una distinzione fondamentale

Di default, Netcat lavora su TCP. Ma molti servizi (come DNS o DHCP) usano UDP. Se provi a testare una porta UDP con il comando standard, potresti ricevere un falso positivo o non capire perché non ricevi risposta.

Per testare le porte UDP devi aggiungere il flag -u:

nc -zuv 192.168.1.10 53

Attenzione però: l'UDP è un protocollo connectionless. A differenza del TCP, non c'è un "handshake" (la classica stretta di mano tra client e server). Questo rende i test UDP molto meno affidabili. Spesso Netcat ti dirà che la porta è aperta anche quando non lo è, semplicemente perché il server non ha inviato un pacchetto ICMP di errore.

Confronto rapido: Netcat vs Telnet vs Nmap

Molti si chiedono ancora se usare telnet. La risposta breve è: no.

Telnet è stato lo standard per anni, ma non ha l'opzione -z. Se usi telnet e la porta è aperta, rimani connesso e devi chiudere manualmente la sessione con una sequenza di tasti complicata. Netcat invece entra, controlla e esce.

E Nmap? Nmap è un mostro di potenza. Può fare fingerprinting del sistema operativo, rilevare le versioni dei software e scansionare intere subnet in pochi secondi. Però, se sei su una macchina remota dove non puoi installare nuovi pacchetti ma hai Netcat preinstallato (cosa frequentissima nelle distro Linux), nc -zv è la tua unica via di salvezza.

Consigli per l'automazione

Se devi monitorare costantemente se un servizio è attivo, puoi inserire il comando in uno script Bash. Basta filtrare l'output con grep.

Un esempio semplicissimo: nc -zv 1.1.1.1 53 2>&1 | grep succeeded

Perché 2>&1? Perché Netcat invia i messaggi di verbose all'errore standard (stderr) e non allo standard output (stdout). Senza questo reindirizzamento, grep non vedrebbe nulla e lo script fallirebbe sempre.

Un altro trucco per chi ha fretta è ridurre il timeout. Se non vuoi aspettare 30 secondi per ogni porta chiusa, usa l'opzione -w seguita dal numero di secondi:

nc -zvw 2 192.168.1.10 80

In questo caso, se non riceve risposta entro 2 secondi, passa oltre. Velocità pura.

Sicurezza e responsabilità

Una riflessione finale necessaria. Usare nc -zv sulla propria infrastruttura è manutenzione. Usarlo su server di terzi senza autorizzazione può essere interpretato come un tentativo di ricognizione per un attacco informatico.

I sistemi di Intrusion Detection (IDS) moderni rilevano i port scan quasi istantaneamente. Anche se Netcat è discreto, una scansione di range troppo aggressiva farà scattare l'allarme e il tuo IP finirà in blacklist in un batterito di ciglia.

Usatelo con testa.