La connessione in una rete basata su IP necessita inizialmente dell'assegnazione di indirizzi IP e quindi di un instradamento per determinare quale strada, o itinerario, devono prendere i pacchetti per raggiungere la destinazione.
Nome | Descrizione |
ifconfig | Configurazione delle interfacce di rete. |
route | Definizione degli instradamenti. |
ping | Richiesta di echo da un nodo. |
traceroute | Tracciamento del percorso verso una destinazione. |
ipchains | Amministrazione delle funzionalità di filtro di pacchetto del kernel. |
Generalmente, ma non necessariamente, valgono queste regole:
ogni interfaccia di rete ha un proprio indirizzo IP;
un'interfaccia di rete di un elaboratore può comunicare con un'interfaccia di un altro elaboratore solo se queste sono fisicamente connesse alla stessa rete;
un'interfaccia di rete di un elaboratore può comunicare con un'interfaccia di un altro elaboratore solo se gli indirizzi di queste interfacce appartengono alla stessa rete.
Per poter gestire una connessione in rete di qualunque tipo, occorre un kernel predisposto in modo da attivarne la gestione.
È necessario anche provvedere alla gestione delle particolari interfacce di rete utilizzate. Ciò può essere fatto sia attraverso la realizzazione di un kernel monolitico, che modulare, e in questo caso si punta preferibilmente all'utilizzo di moduli.
La configurazione di un'interfaccia implica essenzialmente l'attribuzione di un indirizzo IP. Normalmente, molte altre caratteristiche vengono ignorate perché i valori predefiniti sono solitamente sufficienti a ottenere un funzionamento corretto.
Di norma, la configurazione di un'interfaccia di rete avviene attraverso il programma ifconfig
(InterFace CONFIGuration).
ifconfig [<interfaccia>] |
ifconfig [<interfaccia>... [<famiglia-indirizzamento>] [<indirizzo>] <opzioni>] |
ifconfig
viene utilizzato per attivare e mantenere il sistema delle interfacce di rete residente nel kernel. Viene utilizzato al momento dell'avvio per configurare la maggior parte di questo sistema in modo da portarlo a un livello di funzionamento. Dopo, viene utilizzato di solito solo a scopo diagnostico o quando sono necessarie delle regolazioni. Se non vengono forniti argomenti, oppure se vengono indicate solo delle interfacce, ifconfig
visualizza semplicemente lo stato delle interfacce specificate, oppure di tutte se non sono state indicate.
L'interfaccia da configurare viene identificata attraverso il suo nome. Contrariamente a quanto si fa di solito nei sistemi Unix, non si utilizza un file di dispositivo contenuto nella directory /dev/
. Alcuni nomi di interfaccia di rete sono elencati nella tabella
76.1.
Il primo argomento successivo al nome di interfaccia può essere la sigla identificativa di una famiglia di indirizzamento, ovvero di un particolare sistema di protocolli di comunicazione. A seconda del tipo di questo, cambia il modo di definire gli indirizzi che si attribuiscono alle interfacce. Se questo non viene specificato, come si fa di solito, si intende fare riferimento al sistema di protocolli che si basano su IPv4.
Le sigle utilizzabili sono quelle seguenti.
inet
-- IPv4 (predefinito);
inet6
-- IPv6;
ax25
-- AMPR Packet Radio;
ddp
-- AppleTalk Phase 2;
ipx
-- Novell IPX;
netrom
-- AMPR Packet Radio.
L'indirizzo è il modo con cui l'interfaccia viene riconosciuta all'interno del particolare tipo di protocollo che si utilizza. Nel caso di IP, può essere indicato l'indirizzo IP numerico o il nome di dominio, che in questo caso sarà convertito automaticamente (sempre che ciò sia possibile) nell'indirizzo numerico corretto.
up | down |
L'opzione up
attiva l'interfaccia. Quando all'interfaccia viene attribuito un nuovo indirizzo, questa viene attivata implicitamente. L'opzione down
disattiva l'interfaccia.
arp |
|
Abilita o disabilita l'uso del protocollo ARP per questa interfaccia.
trailers |
|
Abilita o disabilita l'uso di trailer sui frame Ethernet. Questa funzionalità non è usata all'interno dell'attuale sistema di gestione della rete.
allmulti |
|
Abilita o disabilita la modalità promiscua dell'interfaccia. Ciò permette di fare un monitoraggio della rete attraverso applicazioni specifiche che così possono analizzare ogni pacchetto che vi transita, anche se non è diretto a quella interfaccia.
metric n |
Permette di specificare la metrica dell'interfaccia. Al momento non viene utilizzata questa informazione.
mtu n |
Permette di specificare l'unità massima di trasferimento (MTU o Max Transfer Unit) dell'interfaccia. Per le schede Ethernet, questo valore può variare in un intervallo di 1000-2000 (il valore predefinito è 1500). Per il protocollo SLIP si possono utilizzare valori compresi tra 200 e 4096. È da notare però che attualmente non è possibile gestire la frammentazione IP, di conseguenza, è meglio utilizzare un MTU sufficientemente grande.
pointopoint [<indirizzo-di-destinazione>] |
|
Abilita o disabilita la modalità punto-punto per questa interfaccia. La connessione punto-punto è quella che avviene tra due elaboratori soltanto. Se viene indicato l'indirizzo, si tratta di quello dell'altro nodo.
netmask <indirizzo-di-netmask> |
Stabilsce l'indirizzo IP della maschera di rete per questa interfaccia. L'indicazione della maschera di rete può essere omessa, in tal caso, viene utilizzato il valore predefinito che è determinato in base alla classe a cui appartiene l'indirizzo (A, B o C). Naturalmente, se si usa una sottorete, il valore della maschera di rete non può coincidere con quello predefinito.
irq <numero-di-irq> |
Alcune interfacce permettono di definire il numero di IRQ in questo modo. Nella maggior parte dei casi, ciò non è possibile.
broadcast [<indirizzo>] |
|
Abilita o disabilita la modalità broadcast per questa interfaccia. Se abilitandola, viene indicato l'indirizzo, si specifica l'indirizzo broadcast di questa interfaccia.
hw <classe-hardware> <indirizzo-hardware> |
Solitamente, il nome di interfaccia utilizzato determina anche il tipo di hardware a cui appartiene l'interfaccia fisica. Se il driver di interfaccia (cioè il nome usato per identificarla) è predisposto per diversi tipi di hardware, attraverso questa opzione è possibile specificare per quale tipo deve operare. I nomi delle classi hardware possono essere quelli indicati di seguito.
ether
Ethernet;
ax25
AMPR AX.25;
ARCnet
AMPR Net;
netrom
AMPR Rom.
L'indirizzo hardware deve essere indicato secondo il suo equivalente ASCII che è poi la forma usata comunemente in tutte le documentazioni.
multicast |
Questa opzione permette di attivare esplicitamente la modalità multicast, anche se normalmente ciò viene determinato automaticamente in base al tipo di interfaccia utilizzato.
#
ifconfig lo 127.0.0.1
Attiva l'interfaccia lo
corrispondente al loopback con il noto indirizzo IP 127.0.0.1.
#
ifconfig eth0 192.168.1.1 netmask 255.255.255.0
Attiva l'interfaccia eth0
corrispondente alla prima scheda Ethernet, con l'indirizzo IP 192.168.1.1 e la maschera di rete 255.255.255.0.
$
ifconfig eth0
Emette la situazione dell'interfaccia eth0
corrispondente alla prima scheda Ethernet.
$
ifconfig
Emette la situazione di tutte le interfacce di rete attivate.
Un indirizzo IP di un'interfaccia vale in quanto inserito in una rete logica, identificata da un proprio indirizzo IP. Per questo motivo, quando si assegna un indirizzo a un'interfaccia, occorre anche stabilire la rete a cui questo appartiene. Per questo si utilizza la maschera di rete, e il risultato di <indirizzo-di-interfaccia> AND <maschera-di-rete> genera l'indirizzo della rete.
Quando si vuole utilizzare ifconfig
per definire questi indirizzi, si può usare la sintassi semplificata seguente:
ifconfig <interfaccia> <indirizzo-di-interfaccia> [netmask <maschera-di-rete>] |
Come si vede, l'indicazione della maschera di rete è facoltativa. Dal momento che gli indirizzi IP sono stati classificati, e per ogni classe è definita una maschera di rete, se questa indicazione manca, si fa riferimento ai valori predefiniti in base alla classe di appartenenza dell'indirizzo utilizzato.
L'attribuzione di un indirizzo definisce il recapito di quell'interfaccia, cioè si intende stabilire per quale indirizzo IP quella interfaccia debba rispondere. Il fatto di avere stabilito l'indirizzo, non determina automaticamente il modo con cui quella particolare interfaccia possa essere raggiunta.
ifconfig
consente anche di controllare la configurazione delle interfacce di rete. Per questo si utilizza la sintassi seguente:
ifconfig [<interfaccia>] |
Se non viene specificato il nome di un'interfaccia, si ottiene la situazione di tutte quelle presenti e attive.
Un elaboratore connesso o meno a una rete fisica vera e propria, deve avere una connessione virtuale a una rete immaginaria interna allo stesso elaboratore. A questa rete virtuale inesistente si accede per mezzo di un'interfaccia immaginaria, denominata lo
, e l'indirizzo utilizzato è sempre lo stesso, 127.0.0.1, ma ugualmente deve essere indicato esplicitamente.
#
ifconfig lo 127.0.0.1
La maschera di rete può essere tranquillamente omessa, in ogni caso è 255.0.0.0. Il risultato dell'esempio appena visto dovrebbe generare la configurazione seguente:
$
ifconfig lo
[Invio]
lo Link encap:Local Loopback inet addr:127.0.0.1 Bcast:127.255.255.255 Mask:255.0.0.0 UP BROADCAST LOOPBACK RUNNING MTU:3584 Metric:1 ... |
È indispensabile che sia presente l'interfaccia |
La configurazione degli indirizzi di una scheda di rete Ethernet è la cosa più comune: si tratta semplicemente di abbinare all'interfaccia il suo indirizzo stabilendo il proprio ambito di competenza, attraverso la maschera di rete.
Per esempio,
#
ifconfig eth0 192.168.1.1 netmask 255.255.255.0
assegna l'indirizzo 192.168.1.1 all'interfaccia eth0
, cioè la prima scheda Ethernet, che appartiene alla rete 192.168.1.0. Infatti, 192.168.1.1 AND 255.255.255.0 = 192.168.1.0.
In questo caso, dal momento che l'indirizzo 192.168.1.1 appartiene alla classe C, la maschera di rete predefinita sarebbe stata la stessa di quella che è stata indicata esplicitamente.
Il risultato dell'esempio appena visto dovrebbe generare la configurazione seguente:
$
ifconfig eth0
[Invio]
eth0 Link encap:10Mbps Ethernet HWaddr 00:4F:56:00:11:87 inet addr:192.168.1.1 Bcast:192.168.1.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 ... |
La connessione PLIP, che si ottiene collegando due elaboratori con un apposito cavo attraverso le porte parallele, è di tipo punto-punto, cioè si possono collegare solo due punti alla volta. In linea di massima si può dire che questo tipo di connessione implichi la specificazione di entrambi gli indirizzi dei due punti collegati, cioè delle rispettive interfacce. Tuttavia, la configurazione effettiva dipende anche dalle strategie che si vogliono adottare. Qui si propongono alcune alternative.
Il modo intuitivamente più semplice di configurare una connessione PLIP è quello di trattarla come se fosse una normale sottorete. L'esempio seguente mostra questa possibilità, dichiarando una maschera di rete che impegna un ottetto completo per connettere i due nodi.
#
ifconfig plip1 192.168.7.1 pointopoint 192.168.7.2 netmask 255.255.255.0
Nell'esempio, si assegna l'indirizzo 192.168.7.1 all'interfaccia parallela plip1
locale e si stabilisce l'indirizzo 192.168.7.2 per l'altro capo della comunicazione. Il risultato è che si dovrebbe generare la configurazione seguente:
*1*
$
ifconfig plip1
[Invio]
plip1 Link encap:Ethernet HWaddr FC:FC:C0:A8:64:84 inet addr:192.168.7.1 P-t-P:192.168.7.2 Mask:255.255.255.0 UP POINTOPOINT RUNNING NOARP MTU:1500 Metric:1 ... |
Dall'altro capo della connessione si deve eseguire la configurazione opposta. Per seguire l'esempio mostrato, si deve usare il comando seguente:
#
ifconfig plip1 192.168.7.2 pointopoint 192.168.7.1 netmask 255.255.255.0
In alternativa, dal momento che si tratta di una connessione di due soli punti, non è indispensabile indicare precisamente l'indirizzo all'altro capo: si può fare in modo che venga accettato qualunque indirizzo, facilitando la configurazione.
#
ifconfig plip1 192.168.7.1 pointopoint 0.0.0.0 netmask 255.255.255.0
L'esempio che si vede sopra è lo stesso già proposto con la variante dell'indicazione dell'indirizzo all'altro capo. In questo caso, 0.0.0.0 fa in modo che venga accettata la connessione con qualunque indirizzo.
$
ifconfig plip1
[Invio]
plip1 Link encap:Ethernet HWaddr FC:FC:C0:A8:64:84 inet addr:192.168.7.1 P-t-P:0.0.0.0 Mask:255.255.255.0 UP POINTOPOINT RUNNING NOARP MTU:1500 Metric:1 ... |
Dall'altro capo della connessione ci si comporta in modo analogo, come nell'esempio seguente:
#
ifconfig plip1 192.168.7.2 pointopoint 0.0.0.0 netmask 255.255.255.0
Il modo formalmente più corretto di configurare una connessione PLIP è quello di specificare una maschera di rete che non impegni altri indirizzi se non quelli indicati. In pratica, si tratta si usare la maschera 255.255.255.255, che tra l'altro è quella predefinita in questo tipo di connessione.
#
ifconfig plip1 192.168.7.1 pointopoint 192.168.7.2 netmask 255.255.255.255
L'esempio mostra una configurazione in cui si specificano gli indirizzi IP di entrambi i punti. In alternativa, anche in questo caso, si può fare a meno di indicare espressamente l'indirizzo dell'altro capo, come nell'esempio seguente:
#
ifconfig plip1 192.168.7.1 pointopoint 0.0.0.0 netmask 255.255.255.255
Il vantaggio di usare questo tipo di configurazione sta nel risparmio di indirizzi; lo svantaggio sta nella necessità di stabilire instradamenti specifici per ognuno dei due punti (questo particolare verrà chiarito in seguito).
In una rete elementare, in cui ogni elaboratore ha una sola scheda di rete e tutte le schede sono connesse con lo stesso cavo, potrebbe sembrare strana la necessità di dover stabilire un percorso per l'instradamento dei dati sulla rete.
In una rete IP non è così: per qualunque connessione possibile è necessario stabilire il percorso, anche quando si tratta di connettersi con l'interfaccia immaginaria loopback.
Ogni elaboratore che utilizza la rete ha una sola necessità: quella di sapere quali percorsi di partenza siano possibili, in funzione degli indirizzi utilizzati. Gli eventuali percorsi successivi, vengono definiti da altri elaboratori nella rete. Si tratta di costruire la cosiddetta tabella di instradamento, attraverso la quale, ogni elaboratore sa quale strada deve prendere un pacchetto a partire da quella posizione.
Gli instradamenti, cioè la compilazione di questa tabella di instradamento, vengono stabiliti attraverso il programma route
.
route [<opzioni>] |
route
permette di gestire la tabella di instradamento del kernel. In particolare, permette di definire gli instradamenti statici a nodi specifici, o a reti, attraverso un'interfaccia (attivata precedentemente con ifconfig
).
La sintassi di route
può articolarsi in diversi modi a seconda del tipo di azione da compiere.
route [ |
Con questa sintassi è possibile visualizzare (attraverso lo standard output) la tabella di instradamento. Generalmente, per questo scopo, l'uso normale è proprio quello di route
senza argomenti.
route [ |
L'inserimento di una nuova voce nella tabella di instradamento avviene per mezzo dell'opzione add
e dell'indicazione della destinazione da raggiungere. L'indicazione dell'interfaccia è facoltativa.
route [ |
L'eliminazione di una voce della tabella di instradamento avviene per mezzo dell'opzione del
e dell'indicazione della destinazione che prima veniva raggiunta. L'indicazione dell'interfaccia è facoltativa.
|
Dettagliato.
|
Mostra solo indirizzi numerici invece di tentare di determinare i nomi simbolici dei nodi e delle reti. Questo tipo di approccio potrebbe essere utile specialmente quando si hanno difficoltà ad accedere a un servizio di risoluzione dei nomi, o comunque quando si vuole avere la situazione completamente sotto controllo.
|
Utilizza netstat
per visualizzare la tabella di instradamento.
|
Funziona come l'opzione
, ma il risultato è più dettagliato e si distribuisce in un numero di colonne maggiore.
-
e
|
L'indirizzo indicato nella destinazione fa riferimento a una rete. L'indirizzo può essere indicato in forma numerica o attraverso un nome di dominio, e in quest'ultimo caso, la traduzione avviene in base al contenuto del file /etc/networks
.
|
L'indirizzo indicato nella destinazione fa riferimento a un nodo. L'indirizzo può essere indicato in forma numerica o attraverso un nome di dominio.
netmask <maschera-di-rete> |
Permette di specificare la maschera di rete quando si sta facendo riferimento a un indirizzo di rete. Quando si inserisce una voce riferita a un singolo nodo, questa indicazione non ha senso. Quando la maschera di rete è un dato richiesto, se non viene inserito si assume il valore predefinito che dipende dalla classe a cui appartiene l'indirizzo indicato.
gw <router> |
Fa in modo che i pacchetti destinati alla rete o al nodo per il quale si sta indicando l'instradamento, passino per il router specificato. Per questo, occorre che l'instradamento verso l'elaboratore che funge da router sia già stato definito precedentemente e in modo statico.
Normalmente, l'indirizzo utilizzato come router riguarda un'interfaccia collocata in un altro nodo. Eventualmente, per mantenere la compatibilità con Unix BSD, è possibile specificare un'interfaccia locale, intendendo così che il traffico per l'indirizzo di destinazione deve avvenire utilizzando quella interfaccia.
metric <valore-metrico> |
Permette di definire il valore metrico dell'instradamento e viene utilizzato dai demoni che si occupano dell'instradamento dinamico per determinare il costo di una strada, o meglio per poter decidere il percorso migliore.
mss <dimensione> |
Maximum Segment Size. Permette di definire la dimensione massima, in byte, di un segmento per una connessione TCP attraverso quell'instradamento. Viene usato solo per una regolazione fine della configurazione dell'instradamento. Il valore predefinito è 536.
window <dimensione> |
Permette di definire la dimensione della finestra per le connessioni TCP attraverso l'instradamento specificato. Viene usato quasi esclusivamente nelle reti AX.25.
irtt <durata> |
Initial Round Trip Time. Permette di definire la durata del round trip iniziale per le connessioni TCP sull'instradamento specificato. Questa informazione viene utilizzata solitamente solo nelle reti AX.25. Il valore viene espresso in millisecondi con un intervallo possibile di 1-12000. Se viene omesso, il valore predefinito è di 300 ms.
reject |
Permette di impedire l'utilizzo di un instradamento.
mod |
dyn |
reinstate |
Queste opzioni permettono di installare un instradamento dinamico o modificato. In pratica, vengono utilizzati solo da un demone per l'instradamento. Lo scopo di queste opzioni è esclusivamente diagnostico.
[dev] <interfaccia> |
Permette di definire esplicitamente l'interfaccia da utilizzare per un certo instradamento. Solitamente, questa informazione non è necessaria perché il kernel riesce a determinare l'interfaccia in base alla configurazione delle stesse.
È importante che questa indicazione appaia alla fine della riga di comando, in questo modo, il parametro dev
, che precede il nome dell'interfaccia, è solo facoltativo.
La tabella di instradamento che si ottiene è strutturata in diverse colonne il cui significato viene descritto nella tabella 78.2.
Nome | Descrizione |
Destination | La rete o il nodo di destinazione. |
Gateway | Il router. |
Genmask | In linea di massima corrisponde alla maschera di rete. |
Flags | Indica diversi tipi di informazioni utilizzando lettere o simboli. |
Metric | La distanza o il costo della strada. |
Ref | Il numero di riferimenti all'instradamento. |
Use | Conteggio del numero di volte in cui la voce è stata visionata. |
Iface | Il nome dell'interfaccia da cui partono i pacchetti IP. |
MSS | Maximum Segment Size per le connessioni TCP. |
Window | Dimensione della finestra per le connessioni TCP. |
irtt | Initial Round Trip Time. |
In particolare, meritano attenzione le colonne seguenti:
Gateway
se appare un asterisco (*
) significa che non si tratta di un instradamento attraverso un router;
Genmask
in generale è la maschera di rete, in particolare, se è un instradamento verso un nodo appare 255.255.255.255, se invece è l'instradamento predefinito appare 0.0.0.0 (default
);
Metric
rappresenta la distanza (espressa solitamente in hop o salti) per raggiungere la destinazione;
Ref
non viene utilizzata questa informazione dal kernel Linux e di conseguenza, l'informazione appare sempre azzerata.
I tipi di informazioni che possono essere rappresentati nella colonna Flags
sono elencati nella tabella
78.3.
Simbolo | Descrizione |
U | L'instradamento è attivo. |
H | L'indirizzo indicato fa riferimento a un nodo. |
G | Viene utilizzato un router. |
R | Instradamento reintegrato (instradamento dinamico). |
D | Instradamento installato dinamicamente da un demone o attraverso ridirezione. |
M | Instradamento modificato da un demone o attraverso ridirezione. |
! | Instradamento impedito (opzione reject ). |
Flags
della tabella di instradamento.
#
route add
-
host 127.0.0.1
Attiva l'instradamento verso l'interfaccia di loopback.
#
route add
-
net 192.168.1.0 netmask 255.255.255.0
Attiva l'instradamento della rete 192.168.1.0 che utilizza la maschera di rete 255.255.255.0.
#
route add
-
net 192.168.1.0 netmask 255.255.255.0 dev eth0
Esattamente come nell'esempio precedente, ma in più, viene indicato esplicitamente il nome dell'interfaccia.
#
route add
-
net 192.168.2.0 netmask 255.255.255.0 gw 192.168.1.254
Attiva l'instradamento della rete 192.168.2.0 che utilizza la maschera di rete 255.255.255.0, attraverso il router 192.168.1.254 per il quale era già stato definito un instradamento precedentemente.
#
route add default gw 192.168.1.254
Attiva l'instradamento predefinito (nel caso che non siano disponibili altre possibilità) attraverso il router 192.168.1.254. La parola default
fa automaticamente riferimento all'indirizzo IP 0.0.0.0.
#
route add 10.0.0.0 netmask 255.0.0.0 reject
Definisce un instradamento il cui accesso deve essere impedito.
$
route
Mostra la tabella di instradamento attuale.
La definizione degli instradamenti, serve per stabilire un collegamento con le interfacce di altri elaboratori. Quando anche le tabelle di instradamento degli altri elaboratori sono corrette, si può verificare che le comunicazioni siano possibili attraverso il programma ping
.
ping
permette di inviare una richiesta di eco a un determinato indirizzo, ovvero, a una determinata interfaccia. Si riesce a ottenere l'eco solo se l'instradamento verso quell'indirizzo è funzionante e, nello stesso modo, se è attivo quello di ritorno gestito a partire dall'indirizzo di destinazione.
ping
permette l'utilizzo di molte opzioni, anche se di solito si indica semplicemente l'indirizzo di destinazione.
Normalmente si procede controllando prima l'indirizzo della propria interfaccia locale, quindi, via via si tenta di raggiungere indirizzi più lontani.
ping [<opzioni>] <indirizzo> |
ping
permette di inviare una richiesta di eco a un indirizzo, utilizzando il protocollo ICMP, verificando di ricevere tale eco in modo corretto. ping
viene usato quasi sempre senza opzioni, in modo da ottenere una richiesta di eco continuo, a intervalli di un secondo, che può essere interrotta attraverso la tastiera con la combinazione [Ctrl+c]. Tuttavia, dal momento che ping
serve a scoprire dei problemi negli instradamenti e nel sistema di trasporto generale, può essere conveniente intervenire sulla dimensione dei pacchetti trasmessi e sul loro contenuto.
|
Conclude i funzionamento di ping
dopo aver ricevuto il numero indicato di risposte.
|
Invia la maggior quantità possibile di pacchetti di richiesta, limitandosi a segnalare graficamente la quantità di quelli che risultano persi, cioè per i quali non si ottiene l'eco di risposta. Serve per analizzare pesantemente un tratto di rete, e questa possibilità va usata con prudenza.
Proprio a causa della pericolosità di tale opzione, questa può essere richiesta solo dall'utente root
.
|
Permette di stabilire una pausa, espressa in secondi, tra l'invio di una richiesta di eco e la successiva. Se non viene utilizzata l'opzione
, il valore predefinito di questa è di un secondo.
-
f
|
Permette di aggiungere un massimo di 16 byte ai pacchetti utilizzati da ping
, specificandone il contenuto in esadecimale. Ciò può essere utile per verificare il passaggio di pacchetti che hanno contenuti particolari, e che per qualche ragione possono avere delle difficoltà.
|
Permette di definire la dimensione dei pacchetti utilizzati, a cui si aggiunge l'intestazione ICMP. Il valore predefinito è di 56 byte a cui si aggiungono 8 byte di intestazione (64 in tutto).
$
ping 192.168.1.1
Invia una richiesta di eco all'indirizzo 192.168.1.1, a intervalli regolari di un secondo, fino a che riceve un segnale di interruzione.
$
ping
-
c 1 192.168.1.1
Invia una richiesta di eco all'indirizzo 192.168.1.1, e termina di funzionare quando riceve la prima risposta di eco.
$
ping
-
p ffffffff 192.168.1.1
Invia una richiesta di eco all'indirizzo 192.168.1.1, utilizzando pacchetti contenenti una serie di 32 bit a uno (0xffffffff).
$
ping
-
s 30000 192.168.1.1
Invia una richiesta di eco all'indirizzo 192.168.1.1, utilizzando pacchetti lunghi 30000 byte, oltre all'intestazione ICMP.
Quando si configura un'interfaccia di rete e gli si attribuisce l'indirizzo IP, dal momento che esiste una maschera di rete indicata espressamente o predefinita, sembrerebbe implicito che tutte le comunicazioni dirette a quella rete debbano passare automaticamente per quell'interfaccia. In effetti, le cose sono, o dovrebbero essere così. Ma il percorso deve essere indicato ugualmente in modo esplicito.
In realtà, quando si utilizza route
, non è necessario fare riferimento direttamente a delle interfacce, bastano gli indirizzi e successivamente vale il ragionamento precedente: il kernel, in base agli indirizzi utilizzati, determina l'interfaccia in grado di comunicare con questi. Naturalmente, questo ragionamento non funziona sempre, e quando ci si accorge che le cose non vanno come si vuole, basta aggiungere il nome dell'interfaccia.
La definizione dell'instradamento per gli indirizzi di loopback è obbligatoria. Si utilizza semplicemente il comando seguente:
#
route add
-
net 127.0.0.0
La tabella di instradamento che si ottiene viene descritta di seguito.
$
route
[Invio]-
n
Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 127.0.0.0 * 255.0.0.0 U 0 0 2 lo |
Dal momento che in precedenza era stato assegnato all'interfaccia lo
(loopback) l'indirizzo 127.0.0.1 e la maschera di rete era 255.0.0.0 (nell'esempio visto in precedenza, la maschera di rete veniva attribuita in modo predefinito), route
determina da solo che tutto il traffico per la rete 127.0.0.0 deve passare per questa interfaccia, e di conseguenza aggiorna la tabella di instradamento.
Di solito la rete 127.0.0.0 serve a raggiungere solo l'indirizzo 127.0.0.1, quindi, spesso si preferisce inserire solo quest'ultimo nella tabella di instradamento. In pratica si utilizza il comando |
La verifica dell'instradamento è semplice, basta provare a richiedere un eco all'interfaccia lo
.
$
ping 127.0.0.1
[Invio]
PING 127.0.0.1 (127.0.0.1): 56 data bytes 64 bytes from 127.0.0.1: icmp_seq=0 ttl=64 time=0.4 ms 64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.3 ms 64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.3 ms 64 bytes from 127.0.0.1: icmp_seq=3 ttl=64 time=0.3 ms |
[Ctrl+c]
--- 127.0.0.1 ping statistics --- 4 packets transmitted, 4 packets received, 0% packet loss round-trip min/avg/max = 0.3/0.3/0.4 ms |
Le schede di rete Ethernet sono usate per la connessione a una rete locale e per questo sono potenzialmente in grado di offrire un collegamento con tutti gli indirizzi che ricadono all'interno della rete logica di cui fanno parte. *2*
Quando si stabilisce un instradamento che utilizza questo tipo di interfaccia, è preferibile l'indicazione dell'intera rete logica a cui appartiene. *3*
Seguendo l'esempio visto in precedenza nella sezione che riguardava la configurazione di una scheda Ethernet, dal momento che questa si trovava a operare nella rete 192.168.1.0, l'instradamento corretto si ottiene con il comando seguente:
#
route add
-
net 192.168.1.0
La tabella di instradamento che ne deriva viene descritta di seguito.
$
route
[Invio]-
n
Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 192.168.1.0 * 255.255.255.0 U 0 0 1 eth0 |
Vale lo stesso discorso fatto nel caso dell'interfaccia di loopback: in base alla maschera di rete attribuita (esplicitamente o in modo predefinito) all'interfaccia eth0
, route
determina da solo che tutto il traffico per la rete 192.168.1.0 deve passare per questa interfaccia, e di conseguenza aggiorna la tabella di instradamento.
Volendo è possibile indicare un instradamento specifico per ogni possibile destinazione. Nell'esempio seguente si aggiunge l'instradamento per alcuni elaboratori: si deve utilizzare route
più volte.
#
route add
-
host 192.168.1.1
#
route add
-
host 192.168.1.2
#
route add
-
host 192.168.1.3
#
route add
-
host 192.168.1.4
Si ottiene una tabella di instradamento simile a quella seguente:
Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 192.168.1.1 * 255.255.255.255 UH 0 0 0 eth0 192.168.1.2 * 255.255.255.255 UH 0 0 0 eth0 192.168.1.3 * 255.255.255.255 UH 0 0 0 eth0 192.168.1.4 * 255.255.255.255 UH 0 0 0 eth0 |
Anche l'indirizzo dell'interfaccia locale, quella del proprio elaboratore, è raggiungibile solo se è stato specificato un instradamento. Quando si indicava un instradamento della rete, questa veniva automaticamente inclusa nel gruppo; nel caso si voglia indicare dettagliatamente ogni indirizzo da raggiungere, se si vuole accedere anche alla propria interfaccia, occorre inserirla nella tabella di instradamento. Nell'esempio visto sopra, viene aggiunto anche l'indirizzo 192.168.1.1 per questo scopo. |
La verifica dell'instradamento deve essere fatta inizialmente controllando l'interfaccia locale, e quindi tentando di raggiungere l'indirizzo di un altro elaboratore sulla rete. Naturalmente, occorre che quell'elaboratore abbia una tabella di instradamento corretta.
$
ping 192.168.1.1
[Invio]
PING 192.168.1.1 (192.168.1.1): 56 data bytes 64 bytes from 192.168.1.1: icmp_seq=0 ttl=64 time=0.5 ms 64 bytes from 192.168.1.1: icmp_seq=1 ttl=64 time=0.4 ms 64 bytes from 192.168.1.1: icmp_seq=2 ttl=64 time=0.4 ms 64 bytes from 192.168.1.1: icmp_seq=3 ttl=64 time=0.4 ms |
[Ctrl+c]
--- 192.168.1.1 ping statistics --- 4 packets transmitted, 4 packets received, 0% packet loss round-trip min/avg/max = 0.4/0.4/0.5 ms |
$
ping 192.168.1.2
[Invio]
PING 192.168.1.2 (192.168.1.2): 56 data bytes 64 bytes from 192.168.1.2: icmp_seq=0 ttl=64 time=1.1 ms 64 bytes from 192.168.1.2: icmp_seq=1 ttl=64 time=1.1 ms 64 bytes from 192.168.1.2: icmp_seq=2 ttl=64 time=1.1 ms 64 bytes from 192.168.1.2: icmp_seq=3 ttl=64 time=1.1 ms |
[Ctrl+c]
--- 192.168.1.2 ping statistics --- 4 packets transmitted, 4 packets received, 0% packet loss round-trip min/avg/max = 1.1/1.1/1.1 ms |
La connessione PLIP, essendo di tipo punto-punto, ammette la presenza di due soli elaboratori. In questo senso, l'indicazione di un instradamento verso una rete non è sensato, anche se possibile. È necessario aggiungere semplicemente un instradamento verso l'indirizzo all'altro capo, e comunque è utile aggiungere l'instradamento anche all'indirizzo locale.
È importante però fare una considerazione. Se con la configurazione dell'interfaccia è stata specificata una maschera di rete 255.255.255.255, route
richiederà l'indicazione dell'interfaccia attraverso cui inserire l'instradamento.
Seguendo l'esempio già visto, in cui l'indirizzo dell'interfaccia PLIP locale, plip1
, era 192.168.1.1 e quello dell'altro capo era 192.168.1.2, si può utilizzare il comando seguente:
#
route add
-
host 192.168.1.2 plip1
La tabella di instradamento che si ottiene viene descritta di seguito.
$
route
[Invio]-
n
Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 192.168.1.2 * 255.255.255.255 UH 0 0 1 plip1 |
Come accennato, è opportuno aggiungere anche l'instradamento per l'indirizzo locale.
#
route add
-
host 192.168.1.1 plip1
Per verificare gli instradamenti, si può provare come al solito con ping
.
$
ping 192.168.1.2
Nelle sezioni precedenti sono state viste solo situazioni normali, in cui non esiste la necessità di indicare espressamente l'interfaccia attraverso la quale deve passare il traffico per un certo indirizzo.
Potrebbe però capitare che due o più interfacce si trovino a essere collegate a reti fisiche differenti, ma aventi lo stesso indirizzo, o per le quali si possa fare confusione. Si può analizzare il caso seguente:
Un elaboratore viene utilizzato per una connessione in una rete locale Ethernet il cui indirizzo sia 192.168.1.0 e contemporaneamente per una connessione PLIP con un portatile. Per l'interfaccia Ethernet si vuole utilizzare l'indirizzo 192.168.1.1. Per la connessione PLIP si vogliono usare indirizzi appartenenti alla stessa rete appena vista, e precisamente 192.168.1.2 per l'interfaccia locale e 192.168.1.3 per quella dell'elaboratore portatile all'altro capo.
Le interfacce vengono configurate nel modo seguente:
#
ifconfig eth0 192.168.1.1 netmask 255.255.255.0
#
ifconfig plip1 192.168.1.2 pointopoint 192.168.1.3
Nel momento in cui si vogliono definire gli instradamenti, conviene fare esplicitamente riferimento alle interfacce.
#
route add
-
net 192.168.1.0 dev eth0
#
route add
-
host 192.168.1.3 dev plip1
il risultato che si ottiene è il seguente:
#
route
-
n
Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 192.168.1.3 * 255.255.255.255 UH 0 0 0 plip1 192.168.1.0 * 255.255.255.0 U 0 0 0 eth0 |
Si osservi il fatto che l'instradamento verso l'indirizzo 192.168.1.3 appare per primo nella tabella degli instradamenti. È per questo che i pacchetti diretti a quell'indirizzo prendono la strada giusta attraverso l'interfaccia |
Nel capitolo introduttivo alle reti TCP/IP, si è accennato al protocollo ARP, con il quale si ottengono le corrispondenze tra indirizzi di livello 2 (collegamento dati) e indirizzi di livello 3 (rete), ovvero IP nel nostro caso. In particolare si è parlato di una tabella ARP che viene mantenuta automaticamente da ogni nodo durante il suo funzionamento.
Potrebbe essere interessante ispezionare, ed eventualmente modificare, il contenuto di questa tabella ARP. Questo si fa con il programma arp
.
Ci sono situazioni in cui il protocollo ARP non può funzionare, e in quelle situazioni è possibile predisporre una tabella ARP preconfezionata attraverso la configurazione di un file: /etc/ethers
.
arp <opzioni> |
arp
permette di ispezionare e di modificare la tabella ARP del sistema.
|
Mostra solo indirizzi numerici invece di tentare di determinare i nomi simbolici dei nodi.
|
Mostra le voci corrispondenti a un nodo particolare, oppure tutti gli abbinamenti conosciuti.
|
Elimina le voci riferite al nodo indicato.
|
Crea una voce nella tabella ARP, abbinando l'indirizzo di un nodo a un indirizzo fisico (generalmente si tratta di un indirizzo Ethernet).
|
Indica un file da utilizzare per caricare delle voci nella tabella ARP. Generalmente, quando le interfacce sono di tipo Ethernet, questo file è rappresentato da /etc/ethers
.
#
arp
-
a
Elenca tutte le voci accumulate nella tabella ARP.
#
arp
-
a 192.168.1.2
Mostra le voci riferite esclusivamente al nodo 192.168.1.2.
#
arp
-
n -
a 192.168.1.2
Come nell'esempio precedente, mostrando solo indirizzi numerici.
#
arp
-
d 192.168.1.2
Cancella le voci riferite al nodo 192.168.1.2 contenute nella tabella ARP.
#
arp
-
s 192.168.1.2 00:01:02:03:04:05
Assegna permanentemente (per la durata del funzionamento del sistema) l'indirizzo Ethernet 00:01:02:03:04:05 all'indirizzo IP 192.168.1.2.
#
arp
-
f /etc/ethers
Legge il file /etc/ethers
e utilizza il contenuto per definire delle voci permanenti nella tabella ARP.
Il file /etc/ethers
può essere usato per configurare a priori l'abbinamento tra indirizzi Ethernet (livello 2 del modello ISO/OSI) e indirizzi IP. Questo file può contenere esclusivamente delle righe composte da due elementi: l'indirizzo IP (o il nome) corrispondente a un'interfaccia, e a fianco l'indirizzo Ethernet corrispondente. Si osservi l'esempio seguente:
192.168.1.2 00:01:02:03:04:05 192.168.1.3 00:14:02:23:07:1c 192.168.1.4 00:00:03:2d:00:0b |
Quando si ha la necessità di raggiungere una destinazione che non si trova a essere connessa con la rete fisica a cui si accede, c'è bisogno di un intermediario, ovvero un elaboratore connesso alla stessa rete fisica a cui accede l'elaboratore locale, che sia in grado di inoltrare i pacchetti alle destinazioni richieste. Questo elaboratore è il router, anche se nel linguaggio corrente si usa prevalentemente il termine gateway che però non è esatto.
Figura 78.1:
Il router consente di raggiungere destinazioni al di fuori della rete fisica a cui si è connessi.
Per poter definire un instradamento attraverso un router bisogna che prima, l'elaboratore che svolge questa funzione, sia raggiungibile attraverso una rete locale, e per mezzo di instradamenti già definiti.
La verifica di un instradamento che fa uso di un router è più delicata: si comincia con un ping verso la propria interfaccia locale, quindi verso il router, e quindi si tenta di raggiungere qualcosa che si trova oltre il router.
Una rete locale potrebbe essere articolata in sottoreti in modo da evitare di sovraffollare di traffico un'unica rete. Per fare in modo che le sottoreti possano comunicare tra loro in caso di necessità, si devono utilizzare i router che funzionano come ponti tra una sottorete e un'altra.
In questo modo, quando si indica un instradamento che fa riferimento a un router, lo si definisce per una particolare rete logica, quella a cui il router è in grado di accedere.
Nell'esempio seguente, il router 192.168.1.254 viene utilizzato per accedere alla rete 192.168.7.0. *4*
#
route add
-
net 192.168.7.0 gw 192.168.1.254
L'instradamento verso la rete locale 192.168.1.0 era già stato definito, e ciò in modo da poter raggiungere il router stesso.
$
route
[Invio]-
n
Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 192.168.1.0 * 255.255.255.0 U 0 0 1 eth0 192.168.7.0 192.168.1.254 255.255.255.0 UG 0 0 0 eth0 |
Se il router è in grado di raggiungere anche altre reti, non si fa altro che inserire gli instradamenti relativi nel modo appena visto.
#
route add
[Invio]-
net 192.168.77.0 gw 192.168.1.254
$
route
[Invio]
Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 192.168.1.0 * 255.255.255.0 U 0 0 1 eth0 192.168.7.0 192.168.1.254 255.255.255.0 UG 0 0 0 eth0 192.168.77.0 192.168.1.254 255.255.255.0 UG 0 0 0 eth0 |
Quando si vuole fare riferimento a tutti gli indirizzi possibili, si utilizza il numero IP 0.0.0.0, corrispondente al nome simbolico default
. Per indicare un instradamento che permette di raggiungere tutti gli indirizzi che non sono stati specificati diversamente, si utilizza questo indirizzo simbolico.
Da un punto di vista puramente logico, l'indirizzo 0.0.0.0 corrisponde effettivamente alla rete che comprende tutti gli indirizzi possibili, quindi un instradamento che fa riferimento alla rete 0.0.0.0 è quello per «tutti gli indirizzi».
Teoricamente, è possibile utilizzare l'instradamento predefinito per accedere alla rete locale, ma questo è comunque un approccio sconsigliabile. Nell'esempio seguente si utilizza il nome simbolico default
per indicare l'indirizzo di rete 0.0.0.0 e l'interfaccia viene definita esplicitamente.
#
route add
-
net default dev eth0
Anche se la maschera di rete attribuita a quell'interfaccia era quella normale della classe C, e quindi 255.255.255.0, questa dichiarazione permette di inoltrare attraverso di essa qualsiasi tipo di indirizzo. La presenza di questa maschera di rete costringe invece a indicare esplicitamente l'interfaccia di rete, altrimenti il kernel non sa a chi assegnare l'instradamento.
$
route
[Invio]-
n
Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 * 0.0.0.0 U 0 0 1 eth0 |
L'uso di un instradamento predefinito sulla propria rete locale, può avere effetti deleteri: il ping può funzionare correttamente, mentre altre connessioni che richiedono protocolli più sofisticati possono trovarsi in difficoltà. Questo è particolarmente vero in presenza di connessioni PLIP. |
L'approccio più comune consiste invece nel definire l'instradamento default
come passante per un router: potrebbe trattarsi di un router che permette di accedere a tutte le altre sottoreti esistenti.
#
route add
-
net default gw 192.168.1.254
L'instradamento verso la rete locale 192.168.1.0 era già stato definito in modo da poter raggiungere il router.
$
route
[Invio]-
n
Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 192.168.1.0 * 255.255.255.0 U 0 0 1 eth0 0.0.0.0 192.168.1.254 0.0.0.0 UG 0 0 0 eth0 |
Un elaboratore che debba fungere da router richiede alcune caratteristiche particolari:
un kernel compilato in modo da consentire l'inoltro di pacchetti da un'interfaccia a un'altra (nelle versioni vecchie del kernel Linux era necessario abilitare l'opzione IP: forwarding/gatewaying 19.2.7);
due o più interfacce di rete connesse ad altrettante reti fisiche differenti;
la configurazione corretta di ogni interfaccia di rete;
una tabella di instradamento in grado di permettere l'accesso a tutte le reti che si diramano dalle interfacce di rete installate.
Quando il kernel dispone della funzionalità di forwarding/gatewaying (nei kernel recenti è implicita), questa può essere controllata attraverso un file del filesystem virtuale /proc/
. Per motivi di sicurezza, alcune distribuzioni GNU/Linux sono predisposte in modo da disattivare questa funzionalità attraverso uno dei comandi inseriti nella procedura di inizializzazione del sistema. Per riattivare il forwarding/gatewaying, si può agire nel modo seguente:
#
echo 1 > /proc/sys/net/ipv4/ip_forward
La situazione più comune in una piccola rete è quella in cui tutte le reti sono connesse a un unico router. Negli esempi che seguono si fa riferimento alla situazione seguente:
rete A Ethernet 192.168.1.0
l'interfaccia del router connessa su questa rete è eth0
l'indirizzo dell'interfaccia connessa su questa rete è 192.168.1.254
rete B Ethernet 192.168.2.0
l'interfaccia del router connessa su questa rete è eth1
l'indirizzo dell'interfaccia connessa su questa rete è 192.168.2.254
connessione PLIP con il portatile 192.168.3.1
l'interfaccia del router connessa su questa rete è plip1
l'indirizzo dell'interfaccia connessa su questa rete è 192.168.3.254
Figura 78.2:
Schema dell'esempio di un router connesso su due reti e a un portatile attraverso un cavo PLIP.
All'interno del router si dovranno configurare le interfacce di rete nel modo seguente:
#
ifconfig eth0 192.168.1.254 netmask 255.255.255.0
#
ifconfig eth1 192.168.2.254 netmask 255.255.255.0
#
ifconfig plip1 192.168.3.254 pointopoint 192.168.3.1
Successivamente si devono definire gli instradamenti.
#
route add
-
net 192.168.1.0 netmask 255.255.255.0
#
route add
-
net 192.168.2.0 netmask 255.255.255.0
#
route add
-
host 192.168.3.1 plip1
#
route add
-
host 192.168.3.254 plip1
Dal punto di vista del router è tutto finito. Gli altri elaboratori dovranno definire degli instradamenti opportuni in modo da utilizzare il router quando necessario. In particolare, gli elaboratori connessi alla rete A (192.168.1.0), per poter accedere agli altri elaboratori della propria rete locale e delle altre due raggiungibili tramite il router, dovranno inserire gli instradamenti seguenti.
#
route add
-
net 192.168.1.0 netmask 255.255.255.0
#
route add
-
net 192.168.2.0 netmask 255.255.255.0 gw 192.168.1.254
#
route add
-
host 192.168.3.1 gw 192.168.1.254
Dal momento però che non si può accedere ad alcuna altra rete, si può utilizzare la rete default
. Sempre dal punto di vista degli elaboratori della rete A, si possono definire gli instradamenti nel modo seguente:
#
route add
-
net 192.168.1.0 netmask 255.255.255.0
#
route add
-
net default gw 192.168.1.254
Il caso dell'elaboratore portatile connesso attraverso la porta parallela con un cavo PLIP, è un po' particolare: è evidente che tutto il traffico debba essere filtrato dal router, a parte quello diretto proprio al router stesso. Dal punto di vista del portatile si devono definire gli instradamenti seguenti.
#
route add
-
host 192.168.3.254 plip1
#
route add
-
host 192.168.3.1 plip1
#
route add
-
net default gw 192.168.3.254
Quando la rete diventa complicata, ci può essere la necessità di utilizzare più router per collegare insieme le diverse sottoreti. In tal caso, evidentemente, la tabella di instradamento dei router si troverà a contenere instradamenti che a loro volta utilizzano altri router.
Negli esempi che seguono si fa riferimento alla situazione seguente:
rete A Ethernet 192.168.1.0
l'interfaccia del router A connessa su questa rete è eth0
e ha l'indirizzo 192.168.1.254
rete R Ethernet 192.168.254.0 utilizzata esclusivamente per collegare i router
l'interfaccia del router A connessa su questa rete è eth1
e ha l'indirizzo 192.168.254.1
l'interfaccia del router B connessa su questa rete è eth1
e ha l'indirizzo 192.168.254.2
rete B Ethernet 192.168.2.0
l'interfaccia del router B connessa su questa rete è eth0
e ha l'indirizzo 192.168.2.254
Figura 78.3:
Schema dell'esempio di due router connessi tra loro da una dorsale.
Il router A deve poter raggiungere tutte e tre le reti: sulla rete A e R è connesso direttamente, mentre per la rete B deve fare affidamento sul router B.
#
route add
-
net 192.168.1.0 netmask 255.255.255.0
#
route add
-
net 192.168.254.0 netmask 255.255.255.0
#
route add
-
net 192.168.2.0 netmask 255.255.255.0 gw 192.168.254.2
Il router B deve agire in modo analogo.
#
route add
-
net 192.168.2.0 netmask 255.255.255.0
#
route add
-
net 192.168.254.0 netmask 255.255.255.0
#
route add
-
net 192.168.1.0 netmask 255.255.255.0 gw 192.168.254.1
Lo strumento fondamentale per la verifica degli instradamenti è sempre ping
, che è già stato presentato in questo capitolo. In presenza di router si introduce un concetto nuovo, quello del nodo da attraversare. L'attraversamento di un nodo viene definito comunemente salto, oppure hop, e si pone un limite a questi salti, definito TTL (Time To Live), oltre il quale i pacchetti vengono scartati.
In pratica, i pacchetti IP contengono l'indicazione del valore TTL massimo, e questo viene decrementato all'attraversamento di ogni router, a opera dello stesso. Quando si raggiunge lo zero, il pacchetto viene scartato.
In situazioni particolari, il transito dei pacchetti verso una destinazione particolare potrebbe essere impossibile, a causa del numero di salti che si frappongono, e a causa del limite troppo basso del campo TTL dei pacchetti IP. Generalmente, ping
utilizza un TTL di 255, cioè il massimo possibile, cosa che consente di verificare gli instradamenti al limite delle loro possibilità, ma non permette di prevedere il funzionamento corretto di altri tipi di connessioni, in cui si utilizzino valori TTL inferiori.
Per verificare quale sia il percorso utilizzato effettivamente dai pacchetti per raggiungere una destinazione, si utilizza il programma traceroute
.
traceroute [<opzioni>] <destinazione> [<lunghezza>] |
traceroute
permette di verificare il percorso verso una destinazione, dando delle indicazioni che possono aiutare a comprendere in quale punto ci siano delle difficoltà.
traceroute
inizia la trasmissione di pacchetti (utilizzando il protocollo UDP) con un TTL molto basso. In tal modo, si aspetta di ricevere un messaggio di errore (protocollo ICMP) dal nodo in cui il TTL raggiunge lo zero. Incrementando lentamente il valore del TTL, traceroute
riesce a conoscere gli indirizzi dei nodi attraversati, purché tutto funzioni come previsto (cioè che i vari nodi generino correttamente i pacchetti ICMP di errore).
Quando tutto funziona come previsto, traceroute
genera un elenco di nodi di rete a partire da primo che viene attraversato, fino all'ultimo che rappresenta la destinazione richiesta. Se in alcuni punti non si ottiene risposta, i nodi ipotizzati vengono segnalati con degli asterischi. Nell'esempio seguente, si ipotizza la presenza di due nodi sconosciuti, al terzo e quarto posto della catena.
#
traceroute portatile.plip.dg
traceroute to portatile.plip.dg (192.168.254.1), 30 hops max, 40 byte packets 1 dinkel.brot.dg (192.168.1.1) 0.433 ms 0.278 ms 0.216 ms 2 router.brot.dg (192.168.1.254) 2.335 ms 2.278 ms 3.216 ms 3 * * * 4 * * * 5 portatile.plip.dg (192.168.254.1) 10.654 ms 13.543 ms 11.344 ms |
Sui nodi da cui non si ottiene una risposta, non si può dire nulla di certo, ma solo fare delle congetture. in generale non si può nemmeno essere certi che si tratti effettivamente di due nodi: potrebbe essere un solo nodo, oppure più di due. La documentazione di traceroute
, traceroute(8), dà delle indicazioni in più su come interpretare il risultato.
|
Definisce il numero massimo di nodi da attraversare, per mezzo dell'indicazione del TTL massimo da raggiungere. traceroute
inizia normalmente con pacchetti contenenti un TTL di 1, e incrementa gradualmente tale valore, fino a quanto specificato con questa opzione. Se non viene usata, il TTL massimo è di 30 salti.
|
Mostra solo indirizzi numerici invece di tentare di determinare i nomi simbolici dei nodi. Questo tipo di approccio potrebbe essere utile specialmente quando si hanno difficoltà ad accedere a un servizio di risoluzione dei nomi, o comunque quando si vuole avere la situazione completamente sotto controllo.
|
Permette di indicare espressamente l'indirizzo di origine dei pacchetti, presso cui ci si attende di ricevere la risposta alla scansione. Deve trattarsi di un indirizzo corrispondente a un'interfaccia di rete locale.
Quando si predispone un router si ha la necessità di utilizzare più schede di rete contemporaneamente. A parte il problema legato alla configurazione hardware delle schede, si pone poi il problema del riconoscimento di queste da parte del kernel durante l'avvio del sistema. In effetti, il kernel è normalmente in grado di riconoscere automaticamente solo una scheda di rete. Oltre a questo, anche se fosse in grado di riconoscerle tutte in modo automatico, cosa garantirebbe che i nomi di interfaccia siano quelli previsti?
In pratica, quando si utilizzano più schede Ethernet si deve utilizzare un'istruzione opportuna da inviare al kernel all'avvio. Questo problema è già stato visto nel capitolo dedicato all'hardware di rete (capitolo 76).
È possibile attribuire a ogni interfaccia di rete più di un indirizzo IP. Ciò si ottiene definendo delle interfacce virtuali, riferite a quelle reali, a cui poi si attribuiscono degli indirizzi IP differenti. Il nome di un'interfaccia virtuale ha l'aspetto seguente:
<interfaccia-reale>:<n-interfaccia-virtuale> |
Per esempio, eth0
è il nome reale di un'interfaccia di rete Ethernet, mentre eth0:0
, eth0:1
,... sono una serie di interfacce virtuali riferite sempre all'interfaccia reale eth0
. Naturalmente, lo stesso vale per gli altri tipi di interfaccia di rete: ppp0:0
, plip0:0
,...
+------+ +------+ +------+ +------+ | host | | host | | host | | host | +------+ +------+ +------+ +------+ | | | | - - - ------*---------------*-------*-------*---------------*---------- - - - 192.168.100.0 <--- | ---> 192.168.1.0 | | 192.168.100.254 eth0:0 | eth0 192.168.1.254 | +---------------------+ | | | Router | | | +---------------------+ |
Per ottenere la definizione di alias IP, occorre che il kernel sia stato predisposto per questa funzione, attraverso l'opzione seguente:
IP: aliasing support ( 19.2.7) Y/M
Nel momento in cui si configura un'interfaccia virtuale, questa viene definita implicitamente. Si interviene nel modo solito attraverso ifconfig
. L'esempio seguente si riferisce a quanto mostrato nella figura
78.4, in cui, su una sola rete fisica si distinguono gli indirizzi di due sottoreti distinte: 192.168.1.0 e 192.168.100.0.
#
ifconfig eth0 192.168.1.254 netmask 255.255.255.0
#
route add
-
net 192.168.1.0 netmask 255.255.255.0 eth0
#
ifconfig eth0:0 192.168.100.254 netmask 255.255.255.0
#
route add
-
net 192.168.100.0 netmask 255.255.255.0 eth0:0
Un problema simile a quello dell'instradamento attraverso i router è quello dell'inoltro di pacchetti IP attraverso un firewall per il mascheramento IP. La differenza sta nel fatto che, in questo caso, il firewall si occupa di inoltrare i pacchetti, e non solo di «girarli» attraverso l'interfaccia giusta. Il ruolo di un firewall è molto più complesso, tuttavia, per ora si intende mostrare solo l'aspetto legato all'inoltro dei pacchetti IP per mezzo del mascheramento.
+------+ +------+ | Host | | Host | +------+ +------+ | | Rete locale 192.168.2.0 - - - -------------*-----------*----*------------- - - - | +--------+ | Router | +--------+ Altre destinazioni locali | 192.168.1.0 - - - -------------------------*----*------------- - - - | | 192.168.0.0/16 +----------+ Rete esterna | Firewall | - - - --------------------------------| mascher. | 0.0.0.0/0 | IP | +----------+ |
Il firewall permette a una rete locale che utilizza indirizzi IP riservati alle reti private (cioè esclusi dalla rete Internet, e come tali irraggiungibili) di accedere all'esterno. In effetti, tutto il traffico con la rete esterna viene intrattenuto (apparentemente) dal firewall che si occupa di inoltrare le risposte all'interno della rete locale. Ciò significa che all'esterno appare sempre solo un elaboratore, il firewall, mentre dall'esterno non c'è modo di accedere agli elaboratori della rete locale perché questi non hanno un indirizzo accessibile.
La gestione dell'inoltro dei pacchetti attraverso un firewall richiede che il kernel di questo sia predisposto, e precisamente attraverso le opzioni seguenti. In effetti, come nel caso del router, si tratta di un compito svolto dal kernel.
Network firewalls ( 19.2.7) Y
IP: forwarding/gatewaying ( 19.2.7) Y (ammesso che si tratti di un kernel piuttosto vecchio)
IP: firewalling ( 19.2.7) Y
IP: masquerading ( 19.2.7) Y
IP: ICMP masquerading ( 19.2.7) Y
Il firewall, prima di poter compiere il suo lavoro, deve essere instradato attraverso le sue interfacce di rete. Per la precisione, seguendo l'esempio mostrato nella figura 78.5, da una parte deve essere instradato nella rete 192.168.1.0, e per raggiungere la rete 192.168.2.0 deve utilizzare un instradamento attraverso il router. Dall'altra parte, attraverso l'interfaccia connessa alla rete esterna, deve essere instradato sulla rete predefinita, cioè 0.0.0.0. Ciò equivale a dire che si preparano gli instradamenti specifici delle varie parti della rete locale, e che l'instradamento verso l'esterno corrisponde a quello predefinito.
Per il resto della rete locale, l'instradamento predefinito deve portare al firewall, perché solo lui è in grado di gestire il traffico con gli indirizzi esterni alla rete locale.
Il firewall per il mascheramento IP deve essere impostato definendo i gruppi di indirizzi (cioè le sottoreti) di origine e di destinazione. L'esempio mostrato nella figura 78.5 mostra che il firewall è connesso a una rete locale scomposta in diverse sottoreti. Per la precisione si vedono due sottoreti, 192.168.1.0 e 192.168.2.0, ma si lascia intendere che potrebbero essercene altre (192.168.3.0,...). In tal senso, gli indirizzi da inoltrare all'esterno sono tutti quelli della rete 192.168.0.0/255.255.0.0, dove il secondo indirizzo è la maschera di rete.
In questa situazione, la notazione appena vista viene abbreviata comunemente in 192.168.0.0/16, dove il numero 16 rappresenta la quantità di bit a uno della maschera di rete.
Dall'altra parte, gli indirizzi di destinazione sono semplicemente tutti gli altri, e questo si indica semplicemente con la notazione 0.0.0.0/0.0.0.0, ovvero 0.0.0.0/0.
Il programma ipchains
è ciò che serve per attivare e controllare la gestione del firewall. Per la precisione, l'impostazione viene definita attraverso delle regole: prima di definire qualcosa si inizia con la loro cancellazione.
#
ipchains
-
F
Successivamente è il caso di definire una politica predefinita (policy), ovvero il comportamento normale per i comandi successivi, a meno di non specificare diversamente.
#
ipchains
-
P forward ACCEPT
Infine è necessario definire come inoltrare i pacchetti tra le interfacce. Quello che segue si riferisce sempre all'esempio di figura 78.5.
#
ipchains
-
A forward -
s 192.168.0.0/16 -
d 0.0.0.0/0 -
j MASQ
Se con questi comandi ipchains
si «lamenta» generando delle segnalazioni di errore, è probabile che il kernel non sia in grado di gestire l'inoltro IP, o il mascheramento. Se invece tutto è andato bene, si possono inserire questi comandi all'interno dei file utilizzati per l'inizializzazione del sistema; per esempio /etc/rc.d/rc.local
o altro simile.
#... /sbin/ipchains -F /sbin/ipchains -P forward ACCEPT /sbin/ipchains -A forward -s 192.168.0.0/16 -d 0/0 -j MASQ |
La verifica delle regole per l'inoltro IP può essere fatta sempre tramite il programma ipchains
.
#
ipchains
-
L forward -
n
Seguendo sempre il caso già visto, di dovrebbe ottenere quanto segue:
Chain forward (policy ACCEPT): target prot opt source destination ports MASQ all ------ 192.168.0.0/16 0.0.0.0/0 n/a |
I comandi mostrati che definiscono l'inoltro IP non fanno riferimento a interfacce di rete specifiche, ma solo a indirizzi di rete. Perché il firewall sappia da che parte inoltrare i pacchetti, è necessario che gli instradamenti siano stati definiti correttamente, come già accennato all'inizio di questo gruppo di sezioni.
Questo tipo di configurazione del firewall ignora completamente tutte le considerazioni che riguardano la sicurezza, e tutte le forme di controllo del transito dei pacchetti. In particolare, la descrizione del funzionamento di ipchains
può essere reperita nella pagina di manuale ipchains(8).
In questo tipo di configurazione, è necessario che la gestione dell'inoltro dei pacchetti sia attiva. Non basta che il kernel sia stato predisposto (ammesso che sia ancora necessario), perché la funzione di inoltro (appartenente alla gestione dell'instradamento) potrebbe essere stata inibita da un comando contenuto nella procedura di inizializzazione del sistema, come già descritto nelle sezioni dedicate al router in generale.
---------------------------
Appunti Linux 1999.09.21 --- Copyright © 1997-1999 Daniele Giacomini -- daniele @ pluto.linux.it
1.) La connessione PLIP non ha niente a che fare con le interfacce Ethernet, tuttavia il programma ifconfig
fa apparire le interfacce PLIP come se fossero Ethernet, con la differenza che si tratta di una connessione punto-punto.
2.) Si parla di connessione broadcast.
3.) Teoricamente sarebbe possibile indicare un instradamento per ogni elaboratore che si intende raggiungere, ma questo è decisamente poco conveniente dal punto di vista pratico.
4.) È importante considerare il fatto che il router viene visto con questo indirizzo da questa parte, ovvero, sulla rete locale 192.168.1.0. L'interfaccia del router connessa con l'altra rete locale avrà un indirizzo diverso, confacente con l'indirizzo di quella rete.