[inizio] [indice generale] [precedente] [successivo] [indice analitico] [contributi]


89. IPv4: configurazione, instradamento e verifiche

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 Linux.

Tabella 89.1: Riepilogo dei programmi e dei file descritti in questo capitolo per la gestione degli instradamenti.

Generalmente, ma non necessariamente, valgono queste regole:

89.1 Kernel per la 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 interfacce di rete particolari che si utilizzano. Ciò può essere fatto sia attraverso la realizzazione di un kernel monolitico, sia modulare. Per quanto riguarda la gestione specifica di ogni singola scheda, si punta preferibilmente all'utilizzo di moduli.

89.2 Configurazione delle interfacce di rete

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).

89.2.1 # ifconfig

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.

Interfacce

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 87.1.

Famiglie di indirizzamento

Il primo argomento successivo al nome di interfaccia può essere la sigla identificativa di una famiglia di indirizzamento, ovvero di un sistema di protocolli di comunicazione particolare. 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.

Indirizzo

L'indirizzo è il modo con cui l'interfaccia viene riconosciuta all'interno del tipo di protocollo particolare 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.

Opzioni

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 | -arp

Abilita o disabilita l'uso del protocollo ARP per questa interfaccia.

trailers | -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 | -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>] | -pointopoint

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>] | -broadcast

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.

Esempi

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.

89.3 Indirizzi

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, con la quale, 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 interfaccia particolare 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.

89.3.1 Loopback

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 `lo' per il buon funzionamento del sistema, soprattutto quando l'elaboratore ha già una connessione a una rete reale. Infatti, si potrebbe essere tentati di non definire tale interfaccia, oppure di non attivare l'instradamento relativo, quando sono presenti altre interfacce fisiche reali. Ciò potrebbe provocare un malfunzionamento intermittente della rete.

89.3.2 Ethernet

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
          ...

89.3.3 PLIP

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.

89.3.3.1 PLIP come sottorete

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

89.3.3.2 PLIP senza sprecare indirizzi

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).

89.4 Instradamento

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 IPv4 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'.

89.4.1 # 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.

Analisi della tabella di instradamento

route [-v] [-n] [-e | -ee]

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.

Aggiunta di un nuovo instradamento

route [-v] add [-net|-host] <destinazione> [netmask <maschera-di-rete>] [gw <router>] [metric <valore-metrico>] [mss <dimensione>] [window <dimensione>] [irtt <durata>] [reject] [mod] [dyn] [reinstate] [[dev] <interfaccia>]

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.

Eliminazione di un instradamento

route [-v] del [-net|-host] <destinazione> [netmask <maschera-di-rete>] [gw <router>] [metric <valore-metrico>] [[dev] <interfaccia>]

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.

Opzioni

-v

Dettagliato.

-n

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.

-e

Utilizza `netstat' per visualizzare la tabella di instradamento.

-ee

Funziona come l'opzione `-e', ma il risultato è più dettagliato e si distribuisce in un numero di colonne maggiore.

-net <destinazione>

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'.

-host <destinazione>

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 nodo singolo, 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.

Analisi del risultato

La tabella di instradamento che si ottiene è strutturata in diverse colonne il cui significato viene descritto nella tabella 89.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.

Tabella 89.2: Intestazioni della tabella di instradamento.

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 89.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').

Tabella 89.3: Significato delle lettere e dei simboli utilizzati nella colonna `Flags' della tabella di instradamento.

Esempi

route add -host 127.0.0.1

Attiva l'instradamento verso l'interfaccia locale 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.

89.5 Verifica di un instradamento

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 indirizzo determinato, ovvero, a un'interfaccia determinata. 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.

89.5.1 $ ping

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.

Alcune opzioni

-c <quantità>

Conclude i funzionamento di `ping' dopo aver ricevuto il numero indicato di risposte.

-f

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'.

-i <n-secondi-pausa>

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 `-f', il valore predefinito di questa è di un secondo.

-p <stringa-di-riempimento>

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à.

-s <dimensione>

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).

Esempi

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.

89.6 Instradamento attraverso un'interfaccia

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.

89.6.1 Loopback

La definizione dell'instradamento per gli indirizzi locali 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 -n[Invio]

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 `route add 127.0.0.1'.

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

89.6.2 Ethernet

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 -n[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

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 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 inclusa automaticamente 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, 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

89.6.3 PLIP

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 -n[Invio]

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

89.6.4 Indicazione precisa dell'interfaccia

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 `plip1'.

89.7 ARP

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'.

89.7.1 # arp

arp <opzioni>

`arp' permette di ispezionare e di modificare la tabella ARP del sistema.

Alcune opzioni

-n | --numeric

Mostra solo indirizzi numerici invece di tentare di determinare i nomi simbolici dei nodi.

-a [<host>] | --display [<host>]

Mostra le voci corrispondenti a un nodo particolare, oppure tutti gli abbinamenti conosciuti.

-d <host> | --delete <host>

Elimina le voci riferite al nodo indicato.

-s <host> <indirizzo-fisico>

Crea una voce nella tabella ARP, abbinando l'indirizzo di un nodo a un indirizzo fisico (generalmente si tratta di un indirizzo Ethernet).

-f <file> | --file <file>

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'.

Esempi

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.

89.7.2 /etc/ethers

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

89.8 Instradamento attraverso un router

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.

96.jpg

Figura 89.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 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.

89.8.1 Router per accedere ad altre reti

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 -n[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

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 gw 192.168.1.254[Invio]

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

89.9 Instradamento predefinito

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 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 -n[Invio]

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: l'echo 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.

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 -n[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
0.0.0.0         192.168.1.254   0.0.0.0         UG    0      0        0 eth0

89.10 Router

Un elaboratore che debba fungere da router richiede alcune caratteristiche particolari:

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

89.10.1 Router unico per tutte le reti

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:

97.jpg

Figura 89.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

89.10.2 Router verso un altro router

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:

98.jpg

Figura 89.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

89.11 Verifica di un instradamento attraverso i router

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, che 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 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 il programma `traceroute'.

89.11.1 # 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 valore TTL molto basso. In tal modo, si aspetta di ricevere un messaggio di errore (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).

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.

Alcune opzioni

-m <ttl-massimo>

Definisce il numero massimo di nodi da attraversare, per mezzo dell'indicazione del valore TTL massimo da raggiungere. `traceroute' inizia normalmente con pacchetti contenenti un valore TTL unitario e incrementa gradualmente tale valore, fino a quanto specificato con questa opzione. Se non viene usata, il valore TTL massimo è di 30 salti.

-n

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.

-s <indirizzo-di-origine>

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.

89.11.2 Individuazione delle schede di rete

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 87).

89.12 Alias IP

È 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        |
                         |                     |
			 +---------------------+

Figura 89.4: Utilizzo ipotetico degli alias IP.

Per ottenere la definizione di alias IP, occorre che il kernel sia stato predisposto per questa funzione, attraverso l'opzione seguente:

89.12.1 Configurazione e instradamento dell'interfaccia virtuale

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 89.4, in cui, su una sola rete fisica si distinguono gli indirizzi di due sottoreti differenti: 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

89.13 Inoltro IP attraverso il mascheramento

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       |
				      +----------+

Figura 89.5: Schema di utilizzo di un firewall per il mascheramento 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.

89.13.1 Kernel per il firewall

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.

89.13.2 Instradamento dal firewall e verso il firewall

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 89.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.

89.13.3 Definizione degli indirizzi del sistema di mascheramento

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 89.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.

89.13.4 Configurazione con ipchains

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 89.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

89.13.5 Controllo

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

89.13.6 Note finali

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 2000.04.12 --- Copyright © 1997-2000 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.


[inizio] [indice generale] [precedente] [successivo] [indice analitico] [contributi]