Chiunque sia abituato a lavorare sotto Unix, generalmente ha una visione a basso livello delle operazioni da compiere, in questo articolo introdurremo uno strumento per testare la rete, nato nel lontano 1996 e che ancora oggi fa parte delle maggiori distribuzioni Linux, il suo nome è netcat, il cat per la rete.
Per capire come è nato netcat, occorre fare un passo indietro. Nelle connessioni di rete, utilizzando IP, non basta creare un semplice modello di file come nel resto di Unix. Abbiamo una macchina che inizia una connessione ( client ) ed una che resta in attesa ( server ). La connessione può essere di due tipi, TCP e quindi attraverso un canale virtuale, oppure con datagrammi UDP per evitare il costo di creare un canale, anche se rischiando di perdere dei dati. Netcat può fare sia da server che da client e può creare connessioni sia TCP che UDP, il tutto in un programma snello di appena 20 Kb e che soprattutto evita di modificare i dati in transito.
Il nome dell’eseguibile è nc, corto e significativo come nella più sana tradizione Unix e può essere lanciato in due modalità, come client e come server. Nel primo caso la sintassi del comando è:
nc [-options] hostname port[s] [ports]…
mentre nel secondo formato è:
nc -l -p port [-options] [hostname] [port]
Il comando può anche essere lanciato senza opzioni, ma in questo caso la prima riga di input dovrà contenere tutte le opzioni, che vediamo di descrivere in questa lista:
- -4 : dice a netcat di utilizzate IPV4
- -6 : dice a netcat di utilizzare IPV6
- -D : abilita il debug sul socket
- -d : non legge da stdin
- -h : stampa le opzioni e la sintassi
- -i sec : intervallo in secondi per l’invio di una nuova riga o lo scan di un’altra porta
- -k : forza netcat ad ascoltare per un’altra connessione dopo che la connessione corrente è stabilita, se non si utilizza con -l verrà restituito un errore
- -l : modo listen, per le connessioni in arrivo in modalità server
- -n : non utilizzare il DNS, ma solo gli indirizzi IP per gli host
- -P : specifica il nome utente per un server proxy che richiede l’autenticazione
- -p porta : numero della porta locale, utile nel caso di modalità server, ma anche accettata in modalità client
- -q sec : aspetta per un determinato numero di secondi e poi esce, se i secondi sono negativi attende per sempre
- -r : specifica che le porte sorgenti e di destinazione saranno prese in maniera random e non sequenzialmente
- -S : attiva la signature RFC 2385 TCP MD5
- -s : indirizzo IP locale, se si hanno più interfacce di rete
- -T : specifica il ToS ( IP Type of Service ) per la connessione, per i valori possibili vi rimando alla documentazione ufficiale
- -C : manda CRLF come fine linea
- -t : rispondi sempre di no alla negoziazione telnet
- -U : specifica l’utilizzo dello Unix Domain Sockets
- -u : modalità UDP invece che TCP di default
- -v : modalità in cui viene generato l’output di cosa sta succedendo
- -w sec : timeout per instaurare e chiudere una connessione in rete
- -z : modo I/O zero, cioè che non verranno inviati dati ai demoni che stiamo ascoltando, viene provocato un errore se utilizzato insieme ad -l
Se ad esempio volessimo sapere i servizi che stanno girando sul proprio server locale, basta inserire questo comando:
echo QUIT | nc -v -w 5 -n 127.0.0.1 20-1023
Due copie di netcat configurate una come server e l’altra come client, possono inoltre servire ad evitare una rsh funzionante. La versatilità di netcat lo rende uno strumento che non può mancare nel proprio sistema, anche solo per imparare tutte le caratteristiche delle comunicazioni in rete.