Comando nc in Linux: verificare porte TCP e interpretare i risultati UDP

nc (Netcat) apre connessioni TCP (Transmission Control Protocol) o usa datagrammi UDP (User Datagram Protocol) per inviare e ricevere dati. Puoi usarlo per verificare rapidamente se una porta TCP di un sistema che amministri accetta connessioni; questo controllo non prova da solo che l'applicazione funzioni correttamente.

Su Linux il nome nc può indicare implementazioni diverse, fra cui varianti derivate da OpenBSD netcat e Nmap Ncat. -z serve per un controllo senza scambio ordinario di dati applicativi, mentre -v aggiunge diagnostica. Sintassi, messaggi e timeout dipendono dall'implementazione installata.

Sintassi e implementazione installata

nc [options] host port

Questa riga descrive la sintassi: sostituisci host e port con la destinazione e la porta da controllare, senza copiare le parentesi quadre. Il protocollo predefinito degli esempi è TCP. Un nome di host può richiedere una risoluzione DNS, mentre un indirizzo numerico evita quella ricerca diretta.

Prima di usare le opzioni controlla il pacchetto installato, nc -h e man nc. Se stai usando Ncat, consulta anche ncat --help e il suo manuale. Non trasferire automaticamente opzioni da una variante all'altra: persino una stessa lettera può avere significati differenti.

Controllare porte del proprio computer

Porta SSH locale. Per provare una connessione TCP alla porta 22:

nc -vz 127.0.0.1 22

127.0.0.1 è l'indirizzo di loopback IPv4 del contesto di rete in cui esegui il comando. La porta 22 è comunemente usata da SSH (Secure Shell), ma non è garantito che sul tuo computer ci sia un servizio in ascolto. Il controllo apre una connessione TCP senza inviare una richiesta applicativa: genera comunque pacchetti di rete e può comparire nei log.

Una riuscita sul loopback non dimostra che la stessa porta sia raggiungibile da altre macchine. Il servizio potrebbe essere associato soltanto a un indirizzo locale; inoltre firewall e percorsi esterni possono differire. In contenitori o spazi dei nomi di rete, il loopback riguarda quel contesto, non automaticamente l'host fisico.

Attesa della connessione. Per evitare un'attesa indefinita su una porta locale:

nc -w 3 -vz 127.0.0.1 80

Non aspettarti che la durata totale sia sempre esattamente tre secondi. Nel manuale OpenBSD, -w riguarda connessioni non stabilite e inattività; in Ncat è un timeout di connessione, mentre l'inattività usa un'opzione separata. Con più indirizzi o operazioni il tempo osservato può differire. La porta 80 qui è soltanto un esempio: non presuppone un server web locale.

Connessione diretta. Senza -z puoi osservare il saluto eventualmente inviato dal servizio:

nc -v 127.0.0.1 22

Un server SSH può inviare una riga di identificazione; un altro servizio può attendere prima dei dati dal client e non stampare nulla. L'assenza di testo non prova che la connessione sia fallita. Il testo digitato può essere inviato al servizio: per questa osservazione evita di inserire comandi o credenziali e termina con Ctrl+C. Questa connessione non esegue un accesso SSH completo.

Interpretare una connessione riuscita, rifiutata o scaduta

La stessa forma può essere usata su un host esterno soltanto nell'ambito autorizzato:

nc -vz example.com 443

example.com illustra la sintassi: usa una destinazione per la quale hai il permesso di effettuare la verifica. Non è necessario eseguire la richiesta pubblica per comprendere l'esempio. Una possibile riga di successo, non il risultato attuale garantito, è:

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

La riga segnala che la connessione TCP è riuscita. La dicitura https associata alla porta non dimostra che sia stata negoziata una sessione TLS (Transport Layer Security), verificato un certificato o ricevuta una risposta HTTP corretta. Per verificare questi livelli usa un client appropriato, per esempio curl per controllare una risposta HTTPS.

  • Connessione rifiutata: la richiesta ha ricevuto un rifiuto. Può mancare un processo in ascolto oppure una regola di rete può respingere attivamente il collegamento; il messaggio da solo non identifica la causa.
  • Timeout: il tentativo non si è concluso nel limite applicabile. Filtri che scartano pacchetti, percorso e stato del server sono ipotesi da verificare, non conclusioni già dimostrate.
  • Errore di risoluzione: se hai usato un nome, verifica prima che sia stato risolto. Non interpretare una ricerca DNS fallita come prova che la porta TCP sia chiusa.

Confronta sempre indirizzo, famiglia IP, protocollo e punto da cui esegui la prova. Sul sistema locale puoi controllare anche i socket in ascolto con ss; non modificare firewall o servizi soltanto per far scomparire un messaggio prima di aver individuato la causa.

Opzioni principali e differenze dei timeout

Opzione Uso
-z Controlla la connessione senza uno scambio ordinario di dati applicativi.
-v Mostra messaggi diagnostici più dettagliati.
-w secondi Imposta un timeout il cui significato dipende dall'implementazione.
-u Usa UDP al posto di TCP.
-l Attende connessioni in modalità di ascolto, con sintassi specifica della variante.

secondi è un segnaposto. Nel nc documentato da OpenBSD, -w viene ignorato con -l: non usarlo come garanzia che un processo in ascolto si chiuderà entro quel tempo. In Ncat, -w limita il tentativo di connessione e -i o --idle-timeout gestisce l'inattività. Verifica il manuale locale prima di preparare uno script.

La modalità di ascolto crea un endpoint locale e può esporlo ad altre macchine, secondo indirizzo di bind e regole di rete. Gli esempi di questa guida usano la modalità client; per un listener scegli consapevolmente indirizzo e porta e interrompilo quando hai finito.

Perché un risultato UDP richiede più cautela

UDP non esegue l'handshake di TCP. L'assenza di una risposta può dipendere dal servizio, da filtri o dalla perdita di pacchetti e non basta a distinguere una porta aperta da una chiusa. Anche una richiesta senza dati applicativi significativi può produrre traffico.

Il manuale OpenBSD avverte esplicitamente che la combinazione -uz riferisce successo indipendentemente dallo stato della macchina di destinazione. Quel messaggio non è quindi una prova di raggiungibilità del servizio UDP. Usa una richiesta valida per il protocollo del servizio e, nel contesto autorizzato, confronta eventuali risposte e osservazioni dal lato server; non generalizzare automaticamente il comportamento di una variante a tutte le altre.

Domande frequenti

nc e ncat sono lo stesso programma?

Sono strumenti della famiglia Netcat, ma possono essere implementazioni diverse. Controlla il pacchetto e l'aiuto del programma effettivamente eseguito. Un comando trovato per OpenBSD netcat non è automaticamente compatibile con Nmap Ncat o con altre varianti.

Documentazione di riferimento

Il manuale ufficiale di nc di OpenBSD descrive opzioni e limiti della propria implementazione, compreso il caso UDP. La guida ufficiale di riferimento di Nmap Ncat permette di confrontare timeout e modalità operative; la documentazione locale resta il riferimento per il pacchetto installato sulla tua distribuzione.