Andiamo dritti al punto: cos'è nc -zv?

Se ti occupi di reti, sistemistica o semplicemente stai cercando di capire perché quel maledetto server non risponde, probabilmente hai incrociato il comando nc. Netcat, soprannominato spesso il "coltellino svizzero" del networking, è uno strumento potentissimo ma minimale.

La combinazione specifica nc -zv è quella che usiamo quando non vogliamo trasferire dati, ma vogliamo solo una risposta rapida: la porta è aperta o no?

Semplice. Veloce. E senza fronzoli.

Analizziamo i flag. La -z dice a Netcat di andare in modalità "zero-I/O". In pratica, gli diciamo: "Prova a connetterti, ma appena ricevi risposta chiudi tutto, non inviare nulla". La -v (verbose) serve invece a renderlo loquace. Senza la -v, Netcat starebbe zitto, lasciandoti a indovinare se l'operazione è andata a buon fine basandoti solo sul codice di uscita.

La sintassi pratica per non sbagliare

Per usare questo comando non serve un manuale di cento pagine. La struttura base è questa:

nc -zv [indirizzo_ip_o_hostname] [porta]

Facciamo un esempio reale. Immagina di voler controllare se il server web a cui stai lavorando accetta connessioni sulla porta 80.

nc -zv google.com 80

Se tutto va bene, vedrai qualcosa come Connection to google.com port 80 [tcp/http] succeeded!. Se invece la porta è chiusa o c'è un firewall che blocca il traffico, riceverai un timeout o un messaggio di rifiuto.

Un dettaglio non da poco: l'ordine dei flag può variare a seconda della versione di Netcat installata (OpenBSD vs GNU), ma -zv è lo standard più diffuso e compatibile.

Scansionare più porte in un colpo solo

Fare un test per ogni singola porta è noioso. E inefficiente.

Fortunatamente, Netcat permette di specificare un range di porte. Se vuoi controllare tutte le porte da 20 a 80, ti basta scrivere:

nc -zv 192.168.1.10 20-80

Il terminale inizierà a scorrere l'elenco, indicandoti quali sono aperte e quali no. È un modo rapido per fare un check preliminare della sicurezza di un host senza dover tirare fuori strumenti più pesanti come Nmap.

Perché usare nc -zv invece di un telnet?

Molti amministratori "vecchia scuola" usano ancora telnet per testare le porte. Funziona? Sì. È il metodo migliore? Assolutamente no.

Telnet è goffo. Se la connessione ha successo, ti lascia dentro una sessione interattiva che devi chiudere manualmente con combinazioni di tasti spesso confuse (come Ctrl+]). Netcat invece fa il suo lavoro e sparisce. È automatico.

Questo lo rende perfetto per essere inserito all'interno di script Bash.

Immagina uno script che controlla ogni 5 minuti se il database è raggiungibile. Usare nc -zv permette di catturare l'exit code del comando: 0 se la porta è aperta, 1 se è chiusa. Zero interazioni umane richieste.

Il ruolo dei Firewall e i "falsi negativi"

Qui le cose si fanno interessanti. Quando lanci un nc -zv e non ottieni risposta, non significa necessariamente che il servizio sia spento.

Potrebbe esserci un firewall di mezzo. Esistono due modi in cui un firewall può gestire una richiesta: REJECT o DROP.

  • Se ricevi un "Connection refused", probabilmente il pacchetto è arrivato al server, ma il servizio non è attivo su quella porta (o il firewall ha risposto esplicitamente di rifiutare).
  • Se il comando rimane appeso per secondi prima di dare timeout, significa che il pacchetto è stato droppato. Il firewall lo ha semplicemente ignorato, lasciandoti nel dubbio.

Saper distinguere queste due situazioni è ciò che separa un principiante da un esperto di rete.

UDP vs TCP: l'opzione -u

Di default, nc -zv lavora su TCP. Ma il mondo non è fatto solo di TCP.

Se devi testare un server DNS (porta 53) o un server DHCP, hai bisogno di UDP. In questo caso, entra in gioco il flag -u:

nc -zvu [ip] [porta]

Attenzione però: l'UDP è un protocollo "connectionless". Non c'è un handshake come nel TCP. Questo significa che i risultati di Netcat su UDP sono molto meno affidabili. Spesso il comando ti dirà che la porta è aperta anche quando non lo è, semplicemente perché non ha ricevuto un pacchetto ICMP di errore dal server.

Un consiglio: per l'UDP, non fidarti mai ciecamente del risultato di Netcat. Verifica sempre con un tool specifico per il protocollo che stai testando.

Trucchi avanzati e varianti

Se sei su un sistema Linux moderno, potresti trovare diverse versioni di Netcat. La versione OpenBSD è quella più comune su Ubuntu e Debian.

In alcuni contesti, potresti voler limitare il tempo di attesa per evitare che lo script rimanga bloccato troppo a lungo. Usa il flag -w (timeout):

nc -zv -w 2 192.168.1.50 443

In questo esempio, se Netcat non riceve risposta entro 2 secondi, considera la porta chiusa e passa oltre. Fondamentale quando si scansionano intere subnet.

Sicurezza e responsabilità

Usare nc -zv sulla propria infrastruttura è una pratica di manutenzione standard. Usarlo su server di terzi senza autorizzazione può essere interpretato come un tentativo di scansione ostile (port scanning).

I sistemi IDS/IPS moderni rilevano istantaneamente i pattern di Netcat. Non è lo strumento per fare penetration testing stealth, ma è imbattibile per il debugging veloce.

Proprio così. Semplice, efficace e diretto.

Sintesi rapida dei comandi

Per chi vuole solo copiare e incollare:

  • Test singola porta: nc -zv [ip] [porta]
  • Test range di porte: nc -zv [ip] [inizio-fine]
  • Test UDP: nc -zvu [ip] [porta]
  • Test con timeout: nc -zv -w [secondi] [ip] [porta]

Netcat non ha un'interfaccia grafica, non ha menu a tendina e non ti prende per mano. Ma una volta capito come funziona l'accoppiata -zv, non potrai più farne a meno ogni volta che devi diagnosticare un problema di connettività.