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

Se ti occupi di sistemi, reti o semplicemente stai cercando di capire perché quel maledetto server non risponde, probabilmente hai incrociato il comando nc. Netcat, spesso definito il "coltellino svizzero" del networking, è uno strumento potentissimo che permette di leggere e scrivere dati attraverso connessioni TCP e UDP.

Ma quando digiti nc -zv nel terminale, non stai trasferendo file o creando chat clandestine. Stai facendo qualcosa di molto più specifico: un port scanning rapido.

In parole povere? Stai chiedendo al computer: "Ehi, a questo indirizzo IP, la porta X è aperta e accetta connessioni?".

Semplice. Veloce. E incredibilmente efficace.

Scomponiamo il comando per capire come funziona

Per non usare i comandi a memoria come se fossero formule magiche, vale la pena capire cosa significano quelle due letterine che seguono nc.

La -z sta per "zero-I/O mode". Indica a Netcat di scansionare la porta senza inviare alcun dato. In pratica, il programma tenta di stabilire una connessione (il famoso three-way handshake di TCP) e, appena riceve conferma che la porta è aperta, chiude immediatamente la sessione. Non c'è scambio di informazioni, solo un controllo di disponibilità.

La -v, invece, significa "verbose". Senza questa opzione, Netcat starebbe zitto. Se la porta fosse aperta, non vedresti nulla; se fosse chiusa, riceveresti un errore generico dopo un po' di attesa. Con il modo verbose, il terminale ti dice esattamente cosa sta succedendo in tempo reale.

Un dettaglio non da poco: l'ordine delle flag non conta. Puoi scrivere nc -zv o nc -vz, il risultato sarà identico.

Come usare nc -zv nella pratica

Immaginiamo di voler testare se un server web remoto ha la porta 80 (HTTP) aperta. Il comando sarà:

nc -zv google.com 80

Se tutto va bene, vedrai un messaggio simile a 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 "connection refused".

E se volessi controllare un range di porte? Qui Netcat diventa davvero utile.

Supponiamo che tu debba verificare le porte dalla 20 alla 80 di un server locale (es. 192.168.1.10). Ti basterà scrivere:

nc -zv 192.168.1.10 20-80

Il terminale scorrerà velocemente l'elenco, mostrandoti solo quelle che rispondono. È un modo brutale ma efficace per mappare i servizi attivi su una macchina senza dover installare software pesanti come Nmap.

UDP vs TCP: il dilemma della flag -u

Di default, nc -zv lavora su protocollo TCP. Ma sappiamo bene che non tutto viaggia su TCP. Esistono i DNS, il DHCP e molti altri servizi che usano l'UDP.

Il problema? L'UDP è un protocollo "connectionless". Non c'è una conferma di ricezione come nel TCP.

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

nc -zuv 192.168.1.10 53

Attenzione però: i risultati con l'UDP sono spesso ambigui. Se una porta UDP è aperta, Netcat potrebbe non riceverne conferma e dirti che è chiusa, oppure darti un falso positivo perché il pacchetto non è stato esplicitamente rifiutato dal server.

Proprio così. Testare l'UDP è sempre un po' più complicato rispetto al TCP.

Perché usare Netcat invece di altri strumenti?

Potresti chiederti: "Ma perché non uso telnet o nmap?".

Telnet è ormai obsoleto e non gestisce i timeout in modo elegante. Nmap, d'altro canto, è un mostro di potenza, ma a volte è eccessivo. Se devi solo capire se un servizio è attivo su una singola porta mentre sei loggato via SSH su un server Linux, installare Nmap potrebbe essere un overkill (o addirittura vietato dalle policy aziendali).

Netcat è invece presente in quasi ogni distribuzione Unix-like. È leggero, non richiede configurazioni e fa esattamente ciò che gli chiedi.

Risoluzione dei problemi comuni

A volte nc -zv non restituisce ciò che ci aspettiamo. Ecco i casi più frequenti:

  • Connection Refused: Il server è raggiungibile, ma nessun servizio sta ascoltando su quella porta specifica. Oppure, il servizio è crashato.
  • Connection Timeout: Qui il problema è quasi certamente un firewall. Il pacchetto è partito, ma non è mai tornato indietro perché qualcosa (iptables, ufw, o un firewall hardware) ha scartato il traffico.
  • Command not found: Semplicemente Netcat non è installato. Su Ubuntu/Debian basta un sudo apt install netcat.

Un consiglio da professionista: se stai testando connessioni verso l'esterno e ricevi costantemente timeout, prova a controllare le regole di uscita del tuo server. Spesso i sistemisti bloccano tutto ciò che non è esplicitamente permesso.

Sicurezza e considerazioni etiche

Usare nc -zv per diagnosticare i propri server è una pratica standard. Usarlo per scansionare porte di server che non ti appartengono può essere interpretato come un tentativo di intrusione.

I sistemi di monitoraggio moderni (IDS/IPS) rilevano facilmente le scansioni di porte, specialmente se effettuate su range ampi. Non è un attacco sofisticato, ma lascia tracce evidenti nei log del server.

Usa questo strumento con responsabilità.

Ricapitolando i comandi rapidi

Per chi vuole solo copiare e incollare, ecco i cheat sheet essenziali:

Test singola porta TCP: nc -zv [IP/Host] [Porta]
Test range di porte TCP: nc -zv [IP/Host] [PortaInizio]-[PortaFine]
Test singola porta UDP: nc -zuv [IP/Host] [Porta]

Netcat rimane uno strumento fondamentale. Nonostante l'avvento di software di monitoraggio ultra-moderni, la semplicità di una riga di comando che ti dice "Sì, la porta è aperta" non ha prezzo.