[successivo] [precedente] [inizio] [fine] [indice generale] [violazione GPL] [translators] [docinfo] [indice analitico] [volume] [parte]
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.
|
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 una richiesta di eco ICMP (ping) verso la propria interfaccia locale, quindi verso il router e successivamente si tenta di raggiungere qualcosa che si trova oltre il router.
I router, dovendo vagliare il traffico dei pacchetti che li attraversano, hanno il compito di informare l'origine quando ricevono un pacchetto che, per qualche ragione, non possono far pervenire alla destinazione. Per esempio, un router che rappresenta l'ultimo salto prima di un certo elaboratore, se si accorge che questo elaboratore non è presente (magari è spento), quando riceve un pacchetto destinato a tale elaboratore, deve informare l'origine.
L'errore di questo tipo viene segnalato con un pacchetto ICMP di tipo 3, a cui corrisponde la definizione destination-unreachable.
|
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 rete logica particolare, quella a cui il router è in grado di accedere.
Secondo lo schema seguente, il router 192.168.1.254 viene utilizzato per accedere alla rete 192.168.7.0.(1)
Destinazione | Maschera di rete | Router | Interfaccia di rete |
192.168.1.0 | 255.255.255.0 | -- | eth0 |
192.168.7.0 | 255.255.255.0 | 192.168.1.254 | eth0 |
Con un sistema GNU/Linux si può usare Route nel modo seguente:
#
route add -net 192.168.7.0 netmask 255.255.255.0
<-'
`->gw 192.168.1.254 dev eth0
Supponendo già definito l'instradamento verso la rete locale 192.168.1.0, in modo da poter raggiungere il router, si può ottenere il risultato seguente:
$
route -n
[Invio]
Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 192.168.1.0 0.0.0.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 -net 192.168.77.0 netmask 255.255.255.0
<-'
`->gw 192.168.1.254 dev eth0
[Invio]
$
route -n
[Invio]
Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 192.168.1.0 0.0.0.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 tutte le destinazioni che non sono state specificate diversamente, si utilizza questo indirizzo simbolico.
Da un punto di vista puramente logico, l'indirizzo 0.0.0.0, associato alla maschera di rete 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, perché esclude la disponibilità di altre reti a cui poter accedere.
Destinazione | Maschera di rete | Router | Interfaccia di rete |
0.0.0.0 | 0.0.0.0 | -- | eth0 |
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
$
route -n
[Invio]
Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 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: l'eco ICMP (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.
Destinazione | Maschera di rete | Router | Interfaccia di rete |
192.168.1.0 | 255.255.255.0 | -- | eth0 |
0.0.0.0 | 0.0.0.0 | 192.168.1.254 | eth0 |
Con un sistema GNU/Linux, la cosa si traduce in pratica nel comando seguente:
#
route add -net default gw 192.168.1.254 dev eth0
L'instradamento verso la rete locale 192.168.1.0 era già stato definito in modo da poter raggiungere il router; di conseguenza:
$
route -n
[Invio]
Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 192.168.1.0 0.0.0.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 |
Anche quando si definisce l'instradamento predefinito, è importante osservare che questo appare per ultimo nella tabella relativa. Infatti, la rete 0.0.0.0/0.0.0.0 include tutti gli indirizzi IPv4, ma il fatto che gli intervalli di indirizzi più ristretti appaiono prima, evita di fare confusione.
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 un'opzione apposita, tra quelle della configurazione della rete; sezione 29.2.9);
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 Linux dispone della funzionalità di forwarding/gatewaying (nei kernel recenti è implicita), questa può essere controllata attraverso un file del file system 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 router unico. Negli esempi che seguono si fa riferimento alla situazione seguente:
connessione PLIP con il portatile 192.168.3.1
|
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 dev eth0
(2)
#
route add -net 192.168.2.0 netmask 255.255.255.0 dev eth1
(3)
#
route add -host 192.168.3.1 dev plip1
#
route add -host 192.168.3.254 dev 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 dev eth0
(4)
#
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ò fare riferimento all'instradamento predefinito. 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 dev eth0
(5)
#
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 dev plip1
#
route add -host 192.168.3.1 dev 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 si fa riferimento alla situazione seguente:
|
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 dev eth0
(6)
#
route add -net 192.168.254.0 netmask 255.255.255.0 dev eth1
(7)
#
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 dev eth0
(8)
#
route add -net 192.168.254.0 netmask 255.255.255.0 dev eth1
(9)
#
route add -net 192.168.1.0 netmask 255.255.255.0 gw 192.168.254.1
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 Linux è 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, rimarrebbe il problema di garantire che i nomi di interfaccia siano sempre quelli previsti.
In pratica, con un sistema GNU/Linux, disponendo di 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 112).
Lo strumento fondamentale per la verifica degli instradamenti è sempre ping, che è già stato presentato a proposito dell'instradamento nella rete locale. 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; in particolare 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, che viene decrementato all'attraversamento di ogni router, a opera dello stesso. Quando si raggiunge lo zero, il pacchetto viene scartato, inviando all'origine un messaggio ICMP di errore.
|
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 valore 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 Traceroute, (10) a cui corrisponde l'eseguibile traceroute, che si usa con la sintassi seguente:
traceroute [opzioni] destinazione [lunghezza]
Traceroute, oltre che individuare il percorso effettivo verso la destinazione, può dare delle indicazioni per aiutare a comprendere in quale punto ci sono delle difficoltà.
Traceroute inizia la trasmissione di pacchetti (utilizzando il protocollo UDP) con un valore TTL molto basso. In tal modo, si aspetta di ricevere un messaggio di errore, attraverso il protocollo ICMP, dal nodo in cui il valore TTL raggiunge lo zero. Incrementando lentamente il valore 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). Per individuare correttamente anche l'ultimo nodo, Traceroute cerca di generare un errore differente, per ottenere un messaggio ICMP differente.
|
Quando tutto funziona come previsto, Traceroute genera un elenco di nodi di rete a partire dal 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.
Tabella 116.4. Alcune opzioni per l'eseguibile traceroute.
Un problema simile a quello dell'instradamento attraverso i router è quello dell'inoltro di pacchetti IP attraverso un router NAT/PAT (Network address translation, Port address translation). La differenza sta nel fatto che, in questo caso, il router NAT/PAT si occupa di inoltrare i pacchetti e non solo di «girarli» attraverso l'interfaccia giusta.
|
Il meccanismo NAT/PAT permette tipicamente 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 tal caso, tutto il traffico con la rete esterna viene intrattenuto (apparentemente) dal router NAT/PAT che si occupa di inoltrare le risposte all'interno della rete locale. Ciò significa che all'esterno appare sempre solo un elaboratore, il router NAT/PAT, mentre dall'esterno non c'è modo di accedere agli elaboratori della rete locale perché questi non hanno un indirizzo accessibile.
Nel caso di GNU/Linux la gestione dell'inoltro dei pacchetti attraverso il meccanismo NAT/PAT richiede che il kernel di questo sia predisposto opportunamente (sezione 29.2.9).
Il router NAT/PAT, 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 116.7, da una parte deve essere instradato nella rete 192.168.1.0, mentre per raggiungere la rete 192.168.2.0 deve utilizzare un instradamento attraverso il router relativo. 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 router NAT/PAT, perché solo lui è in grado di gestire il traffico con gli indirizzi esterni alla rete locale.
Il meccanismo NAT/PAT deve essere impostato definendo i gruppi di indirizzi (cioè le sottoreti) di origine e di destinazione. L'esempio mostrato nella figura 116.7 mostra che il router NAT/PAT è 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, cosa che si indica semplicemente con la notazione 0.0.0.0/0.0.0.0, ovvero 0.0.0.0/0.
Il programma iptables è ciò che serve per attivare e controllare la gestione del NAT/PAT con un kernel Linux. Per la precisione, l'impostazione viene definita attraverso delle regole: prima di definire qualcosa si inizia con la loro cancellazione.
#
iptables -t filter -F
[Invio]
#
iptables -t mangle -F
[Invio]
#
iptables -t nat -F
[Invio]
#
iptables -t filter -X
[Invio]
#
iptables -t mangle -X
[Invio]
#
iptables -t nat -X
[Invio]
Successivamente è il caso di definire una politica predefinita (policy), ovvero il comportamento normale per i comandi successivi, a meno di non specificare diversamente.
#
iptables -P FORWARD ACCEPT
[Invio]
Infine è necessario definire come inoltrare i pacchetti tra le interfacce. Quello che segue si riferisce sempre all'esempio di figura 116.7, dove si suppone in particolare che l'interfaccia collegata all'esterno sia eth0.(11)
#
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
[Invio]
Se con questi comandi iptables si «lamenta» generando delle segnalazioni di errore, è probabile che il kernel non sia in grado di gestire l'inoltro IP o il NAT/PAT (la traduzione degli indirizzi). Si può comunque verificare con i comandi seguenti:
#
iptables -t filter -L -n
[Invio]
Chain INPUT (policy ACCEPT) target prot opt source destination Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination |
#
iptables -t mangle -L -n
[Invio]
Chain PREROUTING (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination |
#
iptables -t nat -L -n
[Invio]
Chain PREROUTING (policy ACCEPT) target prot opt source destination Chain POSTROUTING (policy ACCEPT) target prot opt source destination MASQUERADE all -- 0.0.0.0/0 0.0.0.0/0 Chain OUTPUT (policy ACCEPT) target prot opt source destination |
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/iptables -t filter -F /sbin/iptables -t mangle -F /sbin/iptables -t nat -F /sbin/iptables -t filter -X /sbin/iptables -t mangle -X /sbin/iptables -t nat -X /sbin/iptables -P FORWARD ACCEPT /sbin/iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE /sbin/iptables -t filter -L -n /sbin/iptables -t mangle -L -n /sbin/iptables -t nat -L -n |
I comandi mostrati che definiscono l'inoltro IP non fanno riferimento a interfacce di rete specifiche, ma solo a indirizzi di rete. Perché il router NAT/PAT sappia da che parte inoltrare i pacchetti, è necessario che gli instradamenti siano stati definiti correttamente.
Questo tipo di configurazione del router NAT/PAT 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 iptables può essere reperita nella pagina di manuale iptables(8); inoltre, si può leggere la parte xxxiv.
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 di informatica libera 2003.01.01 --- Copyright © 2000-2003 Daniele Giacomini --daniele @ swlibero.org
1) È importante considerare il fatto che il router viene visto con l'indirizzo 192.168.1.254 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.
2) Questo instradamento dovrebbe essere già stato definito automaticamente da Ifconfig.
3) Questo instradamento dovrebbe essere già stato definito automaticamente da Ifconfig.
4) Questo instradamento dovrebbe essere già stato definito automaticamente da Ifconfig.
5) Questo instradamento dovrebbe essere già stato definito automaticamente da Ifconfig.
6) Questo instradamento dovrebbe essere già stato definito automaticamente da Ifconfig.
7) Questo instradamento dovrebbe essere già stato definito automaticamente da Ifconfig.
8) Questo instradamento dovrebbe essere già stato definito automaticamente da Ifconfig.
9) Questo instradamento dovrebbe essere già stato definito automaticamente da Ifconfig.
10) Traceroute UCB BSD
11) Ma potrebbe trattarsi benissimo di ppp0, nel caso di una connessione attraverso il protocollo PPP, o di qualunque altra interfaccia reale.
Dovrebbe essere possibile fare riferimento a questa pagina anche con il nome ipv4_instradamento_oltre_l_ambito_della_rete_locale.html
[successivo] [precedente] [inizio] [fine] [indice generale] [violazione GPL] [translators] [docinfo] [indice analitico]