[indice generale] [precedente] [successivo] [indice analitico] [note introduttive]

166. Strumenti per il controllo e l'analisi del traffico IP

L'analisi del traffico della rete, sia per mezzo dell'intercettazione di tutti i pacchetti che attraversano una rete fisica, sia per mezzo del controllo di ciò che riguarda esclusivamente una singola interfaccia di rete del nodo locale, è molto importante per comprendere i problemi legati alla sicurezza e per scoprire inconvenienti di vario genere.

L'uso produttivo degli strumenti che vengono descritti in questo capitolo richiederebbe una preparazione adeguata sulla composizione dei pacchetti dei protocolli TCP/IP, diversamente si riesce solo a sfiorare la comprensione di quello che accade. Tuttavia, per quanto poco, un po' di pratica con questi può essere utile in ogni caso.

166.1 Netstat

Netstat è un programma specifico di GNU/Linux, in grado di mostrare in modo agevole alcune informazioni contenute nella directory /proc/net/. Le informazioni disponibili sono molte, anche troppe. In queste sezioni viene mostrato solo un uso limitato di netstat, riferito ai protocolli TCP/IP.

Le informazioni disponibili riguardano esclusivamente la sfera del nodo locale, comprese le connessioni che lo riguardano.

Netstat potrebbe essere utilizzato per fornire le stesse informazioni che si possono ottenere già da route, ifconfig e in parte da ipchains. In generale, comunque, questo non dovrebbe essere il suo uso normale, e qui non viene mostrato.

166.1.1 netstat

netstat [<opzioni>]

netstat emette attraverso lo standard output una serie di informazioni riferite a tutti i tipi di connessione disponibili, traendo le informazioni dai file virtuali della directory /proc/net/.

Se netstat viene usato senza opzioni, mostra la situazione di tutti i tipi di connessione, elencando i socket (le porte) aperti. Se tra le opzioni appare l'indicazione di uno o più protocolli, le informazioni che si ottengono si limitano a quanto richiesto espressamente.

Alcune opzioni

-t | --tcp

Richiede espressamente lo stato delle connessioni TCP.

-u | --udp

Richiede espressamente lo stato delle connessioni UDP.

--inet | --ip

Richiede espressamente le informazioni che riguardano le connessioni dei protocolli TCP/IP.

-e

Richiede di aggiungere l'indicazione dell'utente proprietario del processo relativo.

-o

Richiede di aggiungere l'indicazione dei timer di rete.

-a

Elenca tutte le porte, incluse quelle dei server in ascolto.

-n

Mostra le informazioni in forma numerica: indirizzi IP, numeri di porta, numeri UID.

Esempi

netstat --inet

Emette l'elenco delle connessioni TCP/IP.

netstat --inet -e

Emette l'elenco delle connessioni TCP/IP aggiungendo l'indicazione degli utenti proprietari dei processi che attuano le connessioni.

netstat --tcp -a

Mostra la situazione delle porte TCP, in particolare quelle dei servizi in ascolto.

166.1.2 Interpretazione del risultato

Gli elenchi restituiti da Netstat sono composti in forma tabellare. Di seguito appare la descrizione dei nomi delle colonne di queste.

Proto

Rappresenta il protocollo utilizzato in ogni porta attiva. Può trattarsi di tcp, udp e raw.

Recv-Q, Send-Q

Rappresenta la coda di byte che sono stati ricevuti ma non ancora prelevati dal programma che utilizza la connessione, o che sono stati trasmessi ma per i quali non è stata ricevuta conferma dal nodo remoto.

Local Address, Foreign Address

Rappresenta rispettivamente l'indirizzo locale e quello remoto, completo dell'indicazione della porta relativa.

State

Rappresenta lo stato della porta, indicato attraverso una parola chiave tra quelle elencate di seguito. Lo stato riguarda prevalentemente le connessioni TCP, negli altri casi è dovrebbe essere assente.

ESTABLISHED

La porta ha una connessione in corso.

SYN SENT

La porta sta tentando di instaurare una connessione.

SYN RECV

È in corso l'inizializzazione della connessione.

FIN WAIT1

La porta è chiusa e la connessione è in corso di conclusione.

FIN WAIT2

La connessione è chiusa e la porta è in attesa della conferma dall'altra parte.

TIME WAIT

La porta è in attesa della conferma della conclusione della connessione.

CLOSED

La porta non è in uso.

CLOSE WAIT

La porte remota conclude la connessione ed è in attesa di conferma dell'altra parte.

LAST ACK

La parte remota chiude la connessione e la porta è chiusa: si è in attesa della conferma finale.

LISTEN

La porta è in ascolto in attesa di connessioni in arrivo. Queste porte vengono indicate solo se si utilizza l'opzione -a.

CLOSING

Entrambe le porte stanno chiudendo la connessione, ma i dati non sono stati inviati completamente.

UNKNOWN

Lo stato della porta è sconosciuto.

User

Il nome o il numero UID dell'utente proprietario della porta. Si ottiene questa informazione con l'opzione -e.

A titolo di esempio viene mostrato come può apparire una connessione Telnet tra dinkel.brot.dg e roggen.brot.dg.

netstat --tcp[Invio]

Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0      0 roggen.brot.dg:1170     dinkel.brot.dg:telnet   ESTABLISHED
tcp        0      0 dinkel.brot.dg:telnet   roggen.brot.dg:1170     ESTABLISHED

166.2 Tcpdump

Tcpdump è lo strumento fondamentale per l'analisi del traffico che avviene nella rete fisica a cui si è collegati. Permette sia di ottenere una visione sintetica dei pacchetti, sia di visualizzarne il contenuto in esadecimale. Inoltre, è possibile definire un filtro ai pacchetti da prendere in considerazione. Purtroppo, il suo utilizzo efficace richiede un'ottima conoscenza dei protocolli TCP/IP.

I pacchetti vengono analizzati solo nella prima parte, normalmente di 68 byte, perdendo le informazioni successive. Eventualmente, questa dimensione può essere aumentata, anche se in generale ciò è sconsigliabile dal momento che richiederebbe un tempo di elaborazione maggiore, portando anche alla perdita di pacchetti.

166.2.1 # tcpdump

tcpdump [<opzioni>] [<espressione>]

tcpdump emette le informazioni tratte dalla parte iniziale dei pacchetti che possono essere intercettati attraverso un'interfaccia di rete, che corrispondono a una data espressione.

Alcune opzioni

-i <interfaccia>

Definisce l'interfaccia di rete attraverso cui tcpdump deve porsi in ascolto. Se non viene specificata, tcpdump sceglie la prima, e potrebbe trattarsi anche di lo (loopback).

-l

Filtra l'output attraverso una memoria buffer, in modo da gestire meglio le pipeline.

-n

Fa in modo di non convertire gli indirizzi numerici e i numeri di porta nei nomi corrispondenti.

-s <n-byte>

Permette di definire esplicitamente la quantità di byte da prendere in considerazione per ogni pacchetto. In modo predefinito vengono trattati solo i primi 68 byte. Quando la lunghezza è troppo breve per dare informazioni sufficienti, se viene identificato almeno il tipo di protocollo, quello che si ottiene è una stringa nella forma [|<protocollo>].

-w <file>

Memorizza i pacchetti grezzi all'interno di un file, invece di analizzarli ed emetterne il risultato. Il contenuto di questo file può essere elaborato successivamente con l'opzione -r.

-r <file>

Legge i pacchetti da quanto accumulato precedentemente in un file attraverso l'opzione -w. In pratica, permette di analizzare quanto raccolto in precedenza.

-x

Si limita a emettere i pacchetti in forma esadecimale. Per la precisione, viene emessa solo la parte dei pacchetti che rientra nel limite fissato con l'opzione -s, ovvero i primi 68 byte se questa non è stata indicata.

-F <file>

Permette di fornire l'espressione di filtro dei pacchetti attraverso un file indicato con questa opzione.

Esempi

tcpdump -i eth0

Emette attraverso lo standard output tutto il traffico che può essere intercettato per mezzo dell'interfaccia eth0.

tcpdump -n -i eth0

Come nell'esempio precedente, ma le informazioni sugli indirizzi e sui numeri di porta vengono indicati in forma numerica.

tcpdump -x -i eth0

Emette attraverso lo standard output il contenuto della prima parte dei pacchetti che possono essere intercettati per mezzo dell'interfaccia eth0. Questi dati vengono espressi in forma esadecimale.

166.2.2 Espressioni

L'utilizzo di Tcpdump non è molto utile se non viene definito un filtro a ciò che si vuole analizzare. Per questo motivo, dopo le opzioni normali della riga di comando può essere indicata un'espressione, più o meno articolata: solo i pacchetti che soddisfano la condizione espressa vengono presi in considerazione.

Questa espressione contiene spesso degli spazi: può essere fornita a Tcpdump in un unico argomento utilizzando dei delimitatori, oppure può essere composta da più argomenti in sequenza. Inoltre, attraverso l'opzione -F è possibile fornire l'espressione contenuta in un file; in tal caso, l'espressione può essere scritta su più righe, senza bisogno di simboli di continuazione.

Le espressioni di Tcpdump sono composte da primitive che possono essere raggruppate per mezzo delle parentesi tonde (in modo da evitare ambiguità nell'ordine di risoluzione) e connesse attraverso operatori booleani:

!, not

un punto esclamativo o la parola chiave not rappresenta la negazione logica;

&&, and

una doppia e-commerciale (&&) o la parola chiave and rappresenta il concatenamento, ovvero un AND logico;

||, or

una doppia barra verticale (||), o la parola chiave or rappresenta l'alternanza, ovvero un OR logico.

All'interno delle primitive possono apparire riferimenti a diversi tipi di entità, che vengono descritte brevemente.

Gli indirizzi di origine o di destinazione, riferiti al protocollo TCP/IP, possono essere indicati attraverso nomi di dominio o numeri IP. In particolare, è possibile fare riferimento a una sottorete indicando il numero IP parziale.

Le porte possono essere identificate per numero o per nome.

Per identificare i protocolli si possono usare delle parole chiave precise; in particolare: ether, fddi, ip, arp, rarp, decnet, tcp, udp.

Il protocollo identificato dalle parole chiave elencate dovrebbe essere intuitivo, almeno per i casi più comuni (IP, ARP, RARP, TCP e UDP). Le prime due parole chiave sono equivalenti: ether e fddi rappresentano semplicemente il secondo livello, collegamento dati, del modello ISO/OSI.

Alcune primitive

dst host <host>

src host <host>

host <host>

Se viene usata la parola chiave dst, si avvera se il campo della destinazione IP corrisponde al nodo indicato; se viene usata la parola chiave src, si avvera se il campo dell'origine IP corrisponde al nodo indicato; altrimenti, in mancanza di tali parole chiave, si avvera se il nodo corrisponde indifferentemente all'origine o alla destinazione.

ether dst <host-ethernet>

ether src <host-ethernet>

ether host <host-ethernet>

Definisce un indirizzo Ethernet numerico o derivato dal contenuto del file /etc/ethers. Come si può intuire, nel primo caso si fa riferimento a una destinazione, nel secondo a un'origine, nel terzo non si fa differenza.

gateway <host>

Si avvera nel caso i pacchetti utilizzino il nodo indicato come gateway, ovvero, quando l'indirizzo Ethernet dell'origine o della destinazione non appartiene né all'indirizzo IP dell'origine, né a quello della destinazione.

dst net <rete>

src net <rete>

net <rete>

Se viene usata la parola chiave dst, si avvera se il campo della destinazione IP appartiene alla rete indicata; se viene usata la parola chiave src, si avvera se il campo dell'origine IP appartiene alla rete indicata; altrimenti, in mancanza di tali parole chiave, si avvera se la rete corrisponde indifferentemente all'origine o alla destinazione.

La rete può essere indicata con un numero IP incompleto, oppure attraverso l'aggiunta di una maschera di rete. Per cui, la sintassi potrebbe essere estesa nel modo seguente:

dst net {<rete> | <indirizzo-ip> mask <maschera-ip> | <indirizzo-ip>/<lunghezza-maschera>}

src net {<rete> | <indirizzo-ip> mask <maschera-ip> | <indirizzo-ip>/<lunghezza-maschera>}

net {<rete> | <indirizzo-ip> mask <maschera-ip> | <indirizzo-ip>/<lunghezza-maschera>}

In tal caso, la maschera di rete può essere indicata attraverso un numero IP corrispondente, oppure attraverso la quantità di bit a uno nella parte iniziale di tale maschera.

dst port <porta>

src port <porta>

port <porta>

Definisce una porta IP/TCP o IP/UDP, e può trattarsi rispettivamente di un'origine, di una destinazione, o può essere l'una o l'altra indifferentemente.

less <lunghezza> | len <= <lunghezza>

greather <lunghezza> | len >= <lunghezza>

Si avvera se la dimensione del pacchetto è inferiore o uguale, oppure maggiore o uguale alla quantità di byte indicata.

ether proto <protocollo>

Definisce la selezione di un protocollo Ethernet attraverso un numero oppure un nome: ip, arp, rarp. Dal momento che questi nomi sono anche parole chiave per tcpdump, vanno indicati facendoli precedere da una barra obliqua inversa (\) per evitare che vengano interpretati in modo speciale da tcpdump (ciò tenendo conto anche del tipo di shell utilizzato; nel caso della shell Bash e di altre, occorre raddoppiare la barra obliqua inversa).

ip proto <protocollo>

Definisce la selezione di un protocollo IP attraverso un numero, oppure un nome: icmp, igrp, udp, nd, tcp. Tuttavia, i nomi icmp, tcp e udp vanno preceduti da una barra obliqua inversa (\) per evitare che vengano interpretati in modo speciale da tcpdump.

[ether] broadcast

Si avvera se il pacchetto è di tipo Ethernet broadcast.

ip broadcast

Si avvera per un pacchetto IP broadcast.

[ether] multicast

Si avvera se il pacchetto è di tipo Ethernet multicast.

ip multicast

Si avvera per un pacchetto IP multicast.

Esempi

tcpdump host dinkel.brot.dg

Individua ed emette tutto il traffico riferito a dinkel.brot.dg.

tcpdump host dinkel.brot.dg and host roggen.brot.dg

Individua ed emette tutto il traffico riferito simultaneamente a dinkel.brot.dg e a roggen.brot.dg. In pratica si limita a estrarre il traffico tra questi due nodi.

tcpdump host dinkel.brot.dg and \(host roggen.brot.dg or host weizen.brot.dg\)

Individua esclusivamente il traffico intrattenuto tra dinkel.brot.dg e roggen.brot.dg, oppure tra dinkel.brot.dg e weizen.brot.dg. Le parentesi tonde sono state protette attraverso la barra obliqua inversa per evitare una diversa interpretazione da parte della shell.

tcpdump host dinkel.brot.dg and not host roggen.brot.dg

Analizza tutto il traffico intrattenuto da dinkel.brot.dg e tutti gli altri nodi, a esclusione di roggen.brot.dg.

tcpdump gateway router.brot.dg

Analizza tutto il traffico che attraversa il nodo router.brot.dg senza essere diretto, o provenire da quello.

166.3 IPTraf

IPTraf è un programma di utilità per l'analisi del traffico IP, e parte di quello non IP, che transita attraverso la rete fisica a cui ci si trova connessi. IPTraf è specializzato nel tracciamento delle connessioni e nella produzione di statistiche, senza addentrarsi nella lettura del contenuto dei pacchetti.

IPTraf è fondamentalmente un programma interattivo, che utilizza una console o un terminale a caratteri, organizzato attraverso dei menu. La figura 166.1 mostra il menu generale di IPTraf.

+---------------------------------------+
| IP traffic monitor                    |
| General interface statistics          |
| Detailed interface statistics         |
| TCP/UDP service monitor               |
| Ethernet station monitor              |
| TCP display filters                   |
| Other protocol filters                |
| Options                               |
| Exit                                  |
+---------------------------------------+

Figura 166.1: Menu generale di IPTraf.

IPTraf può essere configurato attraverso la funzione Options che appare nel menu generale. Inoltre, può annotare le informazioni sul traffico all'interno di un registro. Il file di configurazione e quello delle registrazioni vengono creati all'interno della directory /var/lib/iptraf/, che deve essere presente.

Perché possa essere analizzato tutto il traffico della propria rete fisica, è necessario che sia abilitata la modalità promiscua, come descritto nella sezione dedicata alla configurazione di IPTraf.

In queste sezioni vengono descritti solo alcuni aspetti di IPTraf. Per il resto si può consultare la documentazione che accompagna questo programma.

166.3.1 Avvio di IPTraf

Come accennato, IPTraf funziona fondamentalmente in modo interattivo, tuttavia può essere avviato con delle opzioni in modo da raggiungere immediatamente la funzione desiderata.

iptraf

Avviando iptraf senza opzioni si ottiene il menu dal quale scegliere il tipo di funzione desiderata.

iptraf -i

Con l'opzione -i si ottiene immediatamente la selezione della funzione IP traffic monitor, ovvero il monitor del traffico IP in tempo reale.

iptraf -g

Con l'opzione -g si ottiene immediatamente la selezione della funzione General interface statistics, ovvero le statistiche generali delle interfacce presenti.

iptraf -d <interfaccia>

Con l'opzione -d, e l'aggiunta dell'indicazione di un'interfaccia di rete, si ottiene immediatamente la selezione della funzione Detailed interface statistics, ovvero le statistiche dettagliate di quell'interfaccia.

iptraf -s <interfaccia>

Con l'opzione -s, e l'aggiunta dell'indicazione di un'interfaccia di rete, si ottiene immediatamente la selezione della funzione TCP/UDP service monitor, ovvero il monitor dei servizi TCP e UDP di quell'interfaccia.

iptraf -e

Con l'opzione -e si ottiene immediatamente la selezione della funzione Ethernet station monitor, ovvero il monitor delle stazioni Ethernet (riguarda solo le interfacce Ethernet).

166.3.2 Configurazione

La configurazione di IPTraf può essere definita a livelli differenti: la configurazione generale e quella che riguarda i filtri di selezione dei pacchetti da elaborare. La configurazione generale è definibile attraverso la funzione Options del menu generale, da cui si accede a quanto si vede nella figura 166.2, che rappresenta anche l'impostazione predefinita.

+-----------------------++ Enabled Options -----------+
| Reverse DNS lookups   ||                            |
| Promiscuous operation ||                            |
| Color                 || Color                      |
| Logging               ||                            |
| TCP timeout...        ||                            |
| Logging interval...   || TCP timeout:       15 mins |
| Additional port...    || Log interval:      60 mins |
| Delete port...        |+----------------------------+
| Exit menu             |
+-----------------------+

Figura 166.2: Definizione delle opzioni generali di IPTraf.

Le opzioni si attivano e si disattivano premendo il tasto [Invio]; quando una voce è terminata da tre punti di sospensione (...), selezionandola si ottiene una finestra a scomparsa attraverso la quale fornire altre indicazioni. Lo stato delle opzioni è indicato dalla finestra destra: Enabled Options.

Alcune opzioni di configurazione

Reverse DNS lookups

Se attivata, fa in modo di risolvere gli indirizzi IP in nomi di dominio corrispondenti. L'attivazione di questa modalità può provocare dei ritardi nel funzionamento di IPTraf, per cui è consigliabile limitarne l'uso. Questa opzione è disattivata in modo predefinito.

Promiscuous operation

La modalità promiscua consente a IPTraf si analizzare tutto il traffico della rete fisica, non solo quello che interferisce con il nodo in cui si utilizza. Questa opzione è disattivata in modo predefinito.

Color

IPTraf è in grado di determinare automaticamente se il tipo di terminale utilizzato consente la visualizzazione dei colori o meno. Tuttavia, è possibile disabilitare la visualizzazione dei colori attraverso questa opzione.

Logging

IPTraf può annotare le informazioni sul traffico all'interno di un file di registrazioni, precisamente /var/lib/iptraf/iptraf.log. Questa opzione è disabilitata in modo predefinito dal momento che il registro può diventare rapidamente molto grande.

166.3.3 Monitor del traffico IP

La funzionalità di controllo del traffico IP rappresenta l'utilizzo più comune di IPTraf. Selezionando la voce corrispondente dal menu generale, oppure avviando iptraf con l'opzione -i, si ottiene qualcosa di simile a quanto mostrato nella figura 166.3, dove in particolare, appare anche lo stato di una connessione Telnet tra 192.168.1.1 e 192.168.1.2.

+ Source -------------- Destination ----------- Packets --- Bytes Flags  Iface +
|/192.168.1.2:1050      192.168.1.1:23               40      1701 --A-   eth0  |
|\192.168.1.1:23        192.168.1.2:1050             31      1435 -PA-   eth0  |
|                                                                              |
|                                                                              |
|                                                                              |
|                                                                              |
|                                                                              |
|                                                                              |
|                                                                              |
|                                                                              |
|                                                                              |
|                                                                              |
|                                                                              |
+ TCP: 1 entries --------------------------------------------------- Active ---+
+------------------------------------------------------------------------------+
| ARP from 0000b46507cb to ffffffffffff on eth0                                |
| ARP from 0080adc8a981 to 0000b46507cb on eth0                                |
|                                                                              |
|                                                                              |
|                                                                              |
+ Top --------- Elapsed time:   0:01 ------------------------------------------+
 IP:       6150 TCP:      3136 UDP:      3014 ICMP:         0 Non-IP:        2
 Up/Dn/PgUp/PgDn-scrl actv win  W-chg actv win  M-more TCP info  X/Ctrl+X-Exit

Figura 166.3: Monitor di traffico IP con una connessione Telnet attiva.

Il monitor di traffico IP si compone di due finestre: una superiore per le connessioni TCP e una inferiore per gli altri tipi. Una delle due finestre è quella attiva, e si distingue perché appare la parla Active sul bordo nella parte bassa, al lato destro. All'interno della finestra attiva è possibile fare scorrere le informazioni con i tasti [freccia su] e [freccia giù]; per cambiare la finestra attiva basta utilizzare il tasto [w], come suggerisce il promemoria che appare nell'ultima riga dello schermo. Per uscire da questa funzionalità basta il tasto [x], oppure la combinazione [Ctrl+x].

Non è possibile conoscere quale sia la parte che ha originato la connessione TCP; nella finestra relativa, le connessioni TCP vengono sempre mostrate con una coppia di voci: una per ogni direzione della connessione TCP.

Il significato delle varie colonne di informazione che appaiono nella finestra delle connessioni TCP dovrebbe essere abbastanza intuitivo, a parte la colonna Flags, all'interno della quale possono essere annotate lettere e parole chiave differenti. Il significato di queste viene descritto di seguito.

S

L'ultimo pacchetto individuato è stato di tipo SYN, sincronizzazione, che si usa in preparazione di una connessione.

A

L'ultimo pacchetto individuato è stato di tipo ACK, che si usa per confermare la ricezione precedente di un pacchetto.

P

L'ultimo pacchetto individuato è stato di tipo PSH, push, che si usa per richiedere lo spostamento dei dati all'inizio della coda di ricezione.

U

L'ultimo pacchetto individuato è stato di tipo URG, che si usa per rappresentare dati urgenti.

RESET

La connessione è stata azzerata dal nodo di origine della direzione a cui si riferisce.

DONE

La connessione ha terminato l'invio di dati nella direzione a cui si riferisce, e ha inviato il pacchetto FIN, ma non è ancora stata confermata la conclusione dall'altro nodo.

CLOSED

L'invio precedente del pacchetto FIN è stato confermato dall'altra parte.

Se si verifica una presenza inusuale di pacchetti SYN, può trattarsi di un tentativo di attacco, definito SYN flood.

166.4 IPlogger

IPlogger è un pacchetto di programmi contenente alcuni demoni che si occupano di annotare le connessioni all'interno del registro del sistema. Allo stato attuale si tratta solo di tcplog e di icmplog, in grado rispettivamente di annotare le connessioni TCP e ICMP (ping). Non è niente di eccezionale, ma qualcosa di utile nel caso non si abbiano strumenti migliori.

Non c'è molto da aggiungere sull'utilizzo di questi due demoni: basta fare in modo che la procedura di inizializzazione del sistema provveda ad avviarli, e loro si arrangiano. Non occorre alcuna configurazione.

È probabile che questo pacchetto abbia uno sviluppo futuro, aggiungendo varie forme di identificazione di attacchi noti.

166.5 Netcat

Netcat è un programma creato allo scopo di leggere e scrivere dati attraverso delle connessioni di rete TCP o UDP. Si tratta di uno strumento generico, vagamente simile a Telnet, con la differenza che può funzionare anche con il protocollo UDP. Le potenzialità di questo programma sono notevoli, ma in queste sezioni verranno mostrate solo alcune delle sue caratteristiche; per il resto si può leggere la sua documentazione, che per essere compresa richiede comunque un po' di esperienza nella gestione delle reti TCP/IP.

Netcat può funzionare, quasi indifferentemente, come client o server di una connessione; per questo è uno strumento ottimale per la verifica del funzionamento delle connessioni di rete, e non solo. In un certo senso, il binario nc, ovvero ciò che costituisce Netcat, è paragonabile idealmente al programma dd, con la differenza che invece di fare riferimento a dei dispositivi, si lavora con la rete a livello di trasporto TCP e UDP: il quarto nel modello OSI/ISO.

166.5.1 $ nc

nc [<opzioni>] <host> {<porta>|<porta-iniziale>-<porta-finale>}...

nc -l -p <porta> [<host> [<porta>]]

nc instaura una connessione, in qualità di client o di server, utilizzando il protocollo TCP oppure UDP, trasmettendo ciò che riceve dallo standard input e restituendo attraverso lo standard output ciò che riceve dall'altro capo.

L'uso di nc differisce fondamentalmente a seconda del fatto che si voglia raggiungere un servizio in ascolto presso un nodo a una porta determinata, oppure che si intenda avviarlo per restare in ascolto in attesa di una richiesta di connessione. Nel secondo caso si usa l'opzione -l (Listen).

Il funzionamento di questo programma si comprende meglio attraverso degli esempi, e qui ci si limita a mostrare il significato delle opzioni.

Alcune opzioni

-l

Fa in modo che nc venga avviato per restare in ascolto di una certa porta (specificata attraverso l'opzione -p).

-p <porta>

Permette di specificare la porta a cui nc deve prestare ascolto. Si usa assieme all'opzione -l.

-n

Fa in modo che si eviti di tentare di risolvere gli indirizzi IP in nomi di dominio.

-r

Cerca di definire in modo casuale il numero di porta locale o remota, a seconda del contesto.

-s <indirizzo-IP-locale>

Definisce esplicitamente l'indirizzo IP locale. Perché ciò possa essere fatto, occorre che questo indirizzo sia abbinato effettivamente a un'interfaccia di rete, eventualmente anche solo come alias.

-u

Utilizza il protocollo UDP. Senza questa opzione, viene usato il protocollo TCP in modo predefinito.

-v

Genera dei messaggi diagnostici emessi attraverso lo standard error. Può essere usato due volte per aumentare il livello di dettaglio di tali messaggi.

-w <n-secondi>

Permette di specificare un tempo di scadenza (timeout) per le connessioni che non ricevono risposta.

-z

Questa opzione sta a rappresentare la modalità di funzionamento definita zero-I/O. Si usa in pratica per la scansione delle porte.

Esempi

nc dinkel.brot.dg smtp

Instaura una connessione TCP con il server SMTP dinkel.brot.dg.

nc -v -w 2 -z dinkel.brot.dg 1-1024

Scandisce le porte da 1 a 1024 di dinkel.brot.dg in modo da rivelare i servizi TCP in ascolto presso quel nodo. L'opzione -v serve a ottenere qualche informazione e w serve a concludere il tentativo di connessione dopo due secondi.

166.5.2 Esempi più articolati

Come anticipato, le possibilità di Netcat non si possono comprendere senza degli esempi. Quelli già mostrati in occasione della presentazione della sintassi di nc rappresentano solo un aspetto minimo di queste.

166.5.2.1 Scansione delle porte

È già stato mostrato un esempio semplificato di scansione delle porte con cui si vuole scoprire se determinati servizi sono attivi o meno nel nodo di destinazione. Per questo scopo si possono utilizzare delle varianti interessanti.

nc -v -w 5 -z dinkel.brot.dg 1-1024 5999-6100

In questo caso, vengono scandite le porte da 1 a 1024 e da 5999 a 6100 del nodo dinkel.brot.dg, per rivelare quali di queste sembrano fornire un servizio TCP.

echo QUIT | nc -v -w 5 dinkel.brot.dg 1-1023

Questa variante, a parte il fatto di limitare l'intervallo di porte da scandire, toglie l'opzione -z e invia la stringa QUIT a ogni porta che risponde. In tal modo si vuole osservare se si riesce a ottenere un qualche tipo di risposta dal servizio, in modo da confermarne la presenza, e non solo il fatto che ci sia qualcosa in ascolto.

Eventualmente, si può rendere casuale la sequenza utilizzata per scandire le porte attraverso l'opzione -r.

166.5.2.2 Trasferimento dati

Un uso interessante di Netcat è quello con il quale si ottiene un trasferimento dati senza bisogno di una shell remota (rsh per esempio). Per questo, da una parte occorre avviare nc in ascolto di una certa porta TCP, e dall'altra si utilizza nc in modo che cerchi di contattare quella porta di quel nodo. Il canale che si crea può essere sfruttato per questo scopo.

nc -l -p 1234 | tar xzpvf -

In questo modo, nc viene avviato in ascolto della porta 1234, che si presume sia libera. Il suo standard output viene passato a tar che deve occuparsi di estrarne il contenuto nella directory corrente. In pratica, si presume che nc debba ricevere dalla porta 1234 un file corrispondente a un archivio tar+gz, e che questo debba essere riprodotto localmente.

tar czf - /home/tizio | nc -w 5 dinkel.brot.dg 1234

Questo comando è la controparte dell'esempio mostrato prima: viene archiviata la directory /home/tizio/ e passata a nc attraverso una pipeline. In particolare, in caso di insuccesso, nc interrompe il tentativo di trasmissione dopo 3 secondi. Evidentemente, dinkel.brot.dg è il nodo all'interno del quale deve essere riprodotta tale directory.

166.5.2.3 Ridirezione TCP

Netcat può essere usato per ridirigere una connessione TCP, per esempio attraverso un firewall. Gli esempi seguenti si riferiscono a direttive del file /etc/inetd.conf.

www stream tcp nowait nobody /usr/sbin/tcpd /usr/bin/nc -w 3 roggen.brot.dg 80

In questo caso, le richieste TCP per la porta www (ovvero 80), sono ridirette attraverso nc verso il nodo roggen.brot.dg alla stessa porta.

www stream tcp nowait nobody /usr/sbin/tcpd /usr/bin/nc w 3 roggen.brot.dg 1234

Questa è solo una piccola variante dell'esempio precedente, in cui si presume che il vero server HTTP si trovi sempre nel nodo roggen.brot.dg, ma sia in ascolto della porta 1234.

Si noti l'utilizzo dell'opzione -w in modo da evitare di bloccare nc nel caso roggen.brot.dg non possa rispondere, oppure che il nodo chiamante interrompa la connessione.

---------------------------

Appunti Linux 1999.07.12 --- Copyright © 1997-1999 Daniele Giacomini --  daniele @ evo.it

[indice generale] [precedente] [successivo] [indice analitico] [note introduttive]