20.6 La gestione delle routing table
Quando un sistema deve inviare sulla rete un pacchetto, deve sapere a chi inoltrarlo, ovvero
deve individuare l’interfaccia connessa fisicamente allo stesso link di cui fa parte il sistema in
questione: il next-hop. Le indicazioni che permettono al sistema di individuare l’appropriato
next-hop a cui inviare il pacchetto sono delle “regole” inserite sotto forma di righe
all’interno di tabelle, dette appunto routing table. Tali regole prendono il nome di
route.
GNU/Linux ha la possibilità di gestire più ruoting table, sulla base delle quali gestisce il
routing dei pacchetti. Ogni routing table è identificata da un valore numerico da 1 a 255, che
equivale ad un nome elencato nel file /etc/iproute2/rt_tables.
Generalmente le route vengono inserite nella routing table 254 (main) che è quella che
viene usata dal kernel per il calcolo degli instradmenti dei pacchetti.
Per default esiste almeno un’altra routing table, la 255 (local), adibita a contenere le
route relative agli indirizzi locali e di broadcast. Tale routing table viene gestita
automaticamente dal kernel e non c’è bisogno di amministrarla manualmente.
Quando un pacchetto deve essere inoltrato sulla rete, vengono eseguite, nell’ordine
indicato, le seguenti operazioni per determinare il next-hop a cui inviarlo:
- Vengono considerate soltanto le route il cui prefisso coincide con quello
dell’indirizzo di destinazione del pacchetto e di queste vengono prese quelle che
hanno il prefisso più lungo.
- Vengono considerate le route con lo stesso TOS di quello del pacchetto. Nel caso
non esista nessuna riga con lo stesso TOS del pacchetto, viene considerata quella
con TOS=0.
- Vengono considerate le route con il miglior valore di metrica (preferenza).
- In caso vi siano più route che soddisfano i criteri precedenti, viene considerata
soltanto la prima di queste.
Quindi, In generale, una route è identificata univocamente dalla terna <prefix, TOS, metric>,
eccezion fatta per quelle relative agli instradamenti di default: possono cioè esistere più route
relative all’instradamento di default sulle macchine che non eseguono il forwarding di
pacchetti.
Esistono vari tipi di route:
[da completare ...]
Le routing table local e main possono essere gestite con il comando route (man page
route(8)).
____________________________________________________________________
Comando: route
Path: /sbin/route
SINTASSI
# route [option] [operation]
DESCRIZIONE
-
option indica la modalità di funzionamento di route. Può assumere i seguenti
valori
-
-A family
specifica la famiglia di protocolli da considerare, secondo quanto
specificato da family (v. tab. 20.9);
| Tabella 20.9: | Possibili famiglie di protocolli gestite da route. |
|
-
-C | --cache
indica di operare sulla cache di routing del kernel;
-
-F | --fib
indica di operare sulla routing table FIB (Forwarding Information Base) del
kernel (default);
-
-v | --verbose
indica di visualizzare più informazioni durante l’utilizzo di route;
-
-n | --numeric
indica di visualizzare gli indirizzi in forma numerica, piuttosto che i nomi
mnemonici a cui si riferiscono;
-
-e | --extend
indica di utilizzare il formato di netstat per la visualizzazione della routing
table (può essere ripetuto più volte per aumentare la quantità di
informazioni visualizzate);
-
-h | --help
visualizza un aiuto sommario di route;
-
-V | --version
visualizza la versione dei route;
-
operation indica l’operazione da effettuare. Può assumere uno dei seguenti
valori
-
add opt target parm
aggiunge una route nella routing table. I possibili parametri sono
descritti di seguito
-
opt indica l’opzione da utilizzare. Può assumere uno dei seguenti
valori
-
-net indica che target esprime l’indirizzo di una rete;
-
-host indica che target esprime l’indirizzo di una interfaccia di
rete (host);
-
target specifica l’indirizzo di destinazione;
-
parm indica l’opzione da utilizzare. Può assumere uno dei seguenti
valori
-
netmask mask
specifica la net mask da utilizzare per l’indirizzo espresso
da target (indica qual è la parte rete e quella host);
-
gw gateway
specifica l’indirizzo del gateway o router (next-hop) al
quale inoltrare i pacchetti (tale indirizzo deve essere
raggiungibile direttamente dal sistema considerato);
-
metric value
specifica la metrica per la route;
-
mss size
imposta la MSS (Maximum Segment Size) del TCP
a size byte (per default è uguale a MTU -
dimensioneheader);
-
window size
imposta la finestra (window) del TCP a size byte;
-
irtt value
imposta l’IRTT (Initial Round Trip Time) per il TCP a
value millisecondi (default 300 ms);
-
reject indica di far fallire il meccanismo di routing per la route
considerata;
-
mod | dyn | reinstate
indica di considerare una route dinamica (generalmente
utilizzati soltanto dai deamon di routing);
-
dev If indica l’interfaccia di rete da associare alla route,
secondo quanto specificato da If (altrimenti il kernel
tenta di risolvere da solo l’associazione, controllando
altre route esistenti);
-
del opt target parm
elimina una route dalla routing table. I possibili parametri sono descritti di
seguito
-
opt indica l’opzione da utilizzare. Può assumere uno dei seguenti
valori
-
-net indica che target esprime l’indirizzo di una rete;
-
-host indica che target esprime l’indirizzo di una interfaccia di
rete (host);
-
target specifica l’indirizzo di destinazione;
-
parm indica l’opzione da utilizzare. Può assumere uno dei seguenti
valori
-
netmask mask
specifica la net mask da utilizzare per l’indirizzo espresso
da target (indica qual è la parte rete e quella host);
-
gw gateway
specifica l’indirizzo del gateway o router (next-hop) al
quale inoltrare i pacchetti (tale indirizzo deve essere
raggiungibile direttamente dal sistema considerato);
-
metric value
specifica la metrica per la route;
-
dev If indica l’interfaccia di rete da associare alla route,
secondo quanto specificato da If (altrimenti il kernel
tenta di risolvere da solo l’associazione, controllando
altre route esistenti);
-
flush elimina tutte le route dalla routing table;
____________________________________________________________________
La routing table è comunque accessibile attraverso i file /proc/net/route,
/proc/net/ipv6_route e /proc/net/rt_cache.
[da completare ...]
L’output di route è una essenzialmente una tabella contenente le varie route. Il significato
dei vari campi è riportato di seguito
- Destination
è l’indirizzo IP di destinazione del pacchetto, che può essere un indirizzo di un
host, l’indirizzo di una rete (quindi tutti i pacchetti indirizzati ad un host di
questa rete soddisferanno questa regola), oppure default, ossia tutti i pacchetti
che non soddisfano le regole precedenti;
- Gateway
nel caso che ci sia bisogno di un router per instradare alcuni pacchetti, questo
campo contiene l’indirizzo del router. Ovviamente tale macchina deve essere
raggiungibile (cioè deve essere sulla stessa subnet). Questo differenzia una
indirect route da una direct route: una direct route è una riga nella routing
table che indica l’indirizzo di destinazione finale, mentre una indirect route
indica il next-hop router (gateway) al quale inviare gli IP datagram destinati
ad una determinata macchina (o rete) - sarà poi compito del router inoltrare
opportunamente gli IP datagram per farli arrivare a destinazione;
- Genmask
rappresenta la subnet mask relativa all’indirizzo visualizato nella colonna
Destination;
-
Flags in questo campo appaiono delle lettere che hanno il significato riportato in
tab. 20.10;
| Tabella 20.10: | Possibili flag dell’output del comando route. |
|
-
Metric è il numero di hop per arrivare al destinatario (non utilizzato dal kernel);
-
Ref è il numero di utilizzatori attivi della route (non è utilizzato dalkernel Linux);
-
Use è il numero di riferimenti alla route. Può anche essere il numero di fallimenti (-F) o
routing andati a buon fine (-C);
-
Iface è l’interfaccia di rete attraverso la quale l’IP datagram deve essere inviato;
-
MSS è il MSS (Maximum Segment Size) del il TCP per la route considerata;
-
Window è la finestra del il TCP per la route considerata;
-
irtt è il valore dell’IRTT (Initial Round Trip Time), in base al quale il kernel imposta i
parametri del TCP;
La gestione della routing table può esseere effettuata anche per mezzo del comando
ip.
____________________________________________________________________
Comando: ip
Path: /sbin/ip
SINTASSI
# ip route {add | a} [type] prefix [argument]
# ip route {change | chg} [type] prefix [argument]
# ip route {replace | repl} [type] prefix [argument]
# ip route {delete | del | d} [type] prefix [argument]
DESCRIZIONE
Inserisce una nuova riga nella routing table.
Modifica una riga già esistente nella routing table.
Modifica o aggiunge una riga nella routing table.
Elimina una riga dalla routing table.
-
type indica il tipo di indirizzo specificato di seguito. Se non specificato viene
considerato unicast;
-
prefix specifica il prefisso dell’indirizzo di destinazione relativo ad una regola di
routing. Questo ha la forma di un indirizzo seguito dal carattere ‘/’ e da un
numero che indica il numero di bit che costituiscono la parte rete dell’indirizzo
in questione (se non è specificato, nella regola in questione viene considerato
tutto l’indirizzo IP). Può essere anche specificato il valore default che indica
l’indirizzamento di default ed equivale all’indirizzo 0/0 (IPv4) o ::/0 (IPv6);
-
argument specifica eventuali ulteriori argomenti. Quelli possibili sono i seguenti
-
tos value
specifica il TOS (Type Of Service) del pacchetto secondo quanto
indicato da value, che può essere un valore esadecimale su 8 bit o un
identificatore elencato nel file /etc/iproute2/rt_dsfield;
-
table tableid
specifica la routing table nella quale inserire la regola considerata:
tableid può essere un valore numerico o un identificatore elencato nel
file /etc/iproute2/rt_tables. Se tale valore non viene specificato,
la regola viene inserita nella routing table principale, a meno che non
si tratti di una regola che riguarda il routing locale, broadcast e nat,
nel qual caso vien inserita nella routing table locale;
-
proto value
specifica il protocollo da considerare: value può essere un numero o
un identificatore elencato nel file /etc/iproute2/rt_protos;
-
scope value
specifica l’area di validità dell’indirizzo della regola di routing:
value può essere un numero o un identificatore elencato nel
file /etc/iproute2/rt_scopes. Se non viene specificato, viene
considerata una validità globale per le regole in cui compaiono
indirizzi unicast verso gateway/router, a livello di link per quelle in
cui compaiono indirizzi unicast diretti e broadcast, e a livello locale
per quelle relative alla routing table locale;
-
metric value
specifica un valore di preferenza per la regola di routing, espresso da
un numero su 32 bit;
-
via addr
spcifica l’indirizzo del next-hop (per regole di nat è il primo indirizzo
del blocco di indirizzi di destinazione);
-
dev name
specifica l’interfaccia di uscita;
-
weight value
specifica un peso da assegnare alla regola di routing che fa parte di
un multipath routing;
-
flag ???
-
onlink indica che l’interfaccia next-hop deve essere fisicamente
allacciata allo stesso collegamento dell’interfaccia a cui fa
riferimento la regola, anche se il prefisso dell’indirizzo non
coincide con essa;
-
pervasive
;
-
equalize
permette di instradare i pacchetti diretti verso uno stesso destinatario, su
più percorsi (possibili), in maniera casuale;
-
mtu value
specifica la MTU nel percorso per raggiungere il destinatario;
-
advmss value
specifica il MSS (Maximal Segment Size) da utilizzare per comunicare via
TCP con il destinatario. Se non specificato, viene calcolato in base alla
MTU fino al next-hop;
-
rtt value
specifica una stima iniziale del RTT (Round Trip Time);
-
rttvar value
specifica una stima iniziale della varianza del RTT;
-
window value
specifica, in byte, la massima window per il TCP;
-
cwnd value
specifica il clamp ??? per la congestion window ???;
-
ssthresh value
specifica una stima iniziale dello slow start threshold;
-
realms realmid
specifica il realm al quale la regola è assegnata: realmid può essere un
numero o un identificatore elencato nel file /etc/iproute2/rt_realms;
SINTASSI
# ip route {flush | f} argument
# ip route {show | sh | list | ls | l} [argument]
DESCRIZIONE
Elimina le righe presenti nella routing table.
Elenca le righe presenti nella routing table.
-
argument specifica eventuali ulteriori argomenti. Quelli possibili sono i seguenti
-
root prefix
seleziona le regole di routing il cui prefisso (indirizzo di destinazione)
sia non più corto di prefix;
-
match prefix
seleziona le regole di routing il cui prefisso (indirizzo di destinazione)
sia non più lungo di prefix;
-
exact prefix
seleziona le regole di routing il cui prefisso (indirizzo di destinazione)
sia esattamente quello specificato da prefix;
-
table tableid
;
-
proto rtproto
;
-
type type-id
;
-
scope scope-id
;
________________________________________________________________________
In genere la politica di routing utilizzata per l’instradamento dei pacchetti su
Internet è basata soltanto sull’indirizzo di destinazione del pacchetto (ed in teoria
anche sul TOS) come indicato dalla RFC 1812. È però possiblile utilizzare altre
politiche di routing sulla base di altri campi del pacchetto (indirizzo del mittente,
...).
La gestione delle politiche di routing va sotto il nome di policy routing (da non
confondere con routing policy) o cunning routing. Tale gestione è possibile per mezo di un
RPBD (Routing Policy DataBase) che seleziona l’instradamento sulla base di un insieme di
regole (rule). Ogni regola è sono associata ad un valore che ne determina la priorità.
Al momento il RPDB di GNU/Linux permette di basare le regole per il calcolo
dell’instradamento sui seguenti campi
-
• indirizzo del mittente
-
• indirizzo del destinatario
-
• TOS
-
• interfaccia dalla quale il pacchetto è stato ricevuto