spacer

Sysresccd-networking it Advanced-networking-and-policy-routing

History


About... le politiche di routing

Nel routing classico l'indirizzo di destinazione dei pacchetti IP è usato per conoscere il percorso che deve seguire il pacchetto. Le politiche di routing rappresentano una possibilità di routing avanzato che permette di configurare il routing attraverso parametri aggiuntivi rispetto al solo indirizzo di destinazione. Per esempio si potrebbe volere usare l'indirizzo mittente o la porta per prendere alcuine decisioni. Le politiche di routing sono solo possibili con gli strumenti di rete di nuova generazione, avrete quindi bisogno dei progranmmi iproute2. La buona notizia è che il supporto per le politiche di routing è stato unito all'interno del kernel linux tanto tempo fa, quindi non abbiamo bisogno di una patch per il kernel. Il supporto è opzionale, ma molte distribuzioni Linux lo supportano di default.

I vecchi strumenti di routing sono ancora supportati, ma non è possibile mixare i vecchi percorsi di routing basati sull'indirizzo di destinazione con le tecniche avanzate con parametri estesi. Questo è il perchè dovremo usare molte tavole di routing. Dovremo scrivere regole che dicano al kernel quali tavole di routing devono essere usate per ogni pacchetto della rete. Per esempio, si può specificare che i pacchetti TCP/IP che hanno una specifica porta di destinazione saranno indirizzate usando una specifica tabella di routing, e che tutti gli altri pacchetti useranno la tavola di routing principale.

Le tabelle di routing

Le politiche di routing richiedono più tabelle di routing. Linux-2.6 supporta fino a 255 differenti tabelle. Di default e con il routing classico, si usano solo due tabelle: la tabella del routing locale e la tabella del routing principale. Con le politiche ri routing, si creeranno altre tabelle di routing, presenti in /etc/iproute2/rt_tables.

Le normali tavole di routing

  • Le tabelle di routing locale viene gestita autometicamente dal kernel. L'utente non deve preoccuparsi di questa tabella. Viene usata per memorizzare tutti gli indirizzi locali e permette al kernel di sapere se un pacchetto all'interno di una rete deve essere deve essere consegnato localmente (sulla macchina locale) o se deve essere consegnato ad un altro computer (se questo è possibile). E' la prima reale tabella di routing usata dal kernel per l'instradamento, viene usata subito dopo la routing cache che è una speciale tabella di routing.
  • la principale tabella di routing è usata di default per tutti gli altri indirizzi. Questa è la tabella di routing usata dal comando di instradament, ed è anche la tabella che viene usata quando non si sopecifica il nome della tabella con ip route.
  • Le tabelle di routing personalizzate sono tutte le altre tabelle. Queste tabelle saranno usate quando un pacchetto di rete si accorda con le regole specificate dalle regole IP. Queste tabelle di routing sono tabelle di routing normali, possono avere un default route.

La tabella di routing cache

La tabella di routing cache è una speciale tabella di routing gestita automaticamente dalla tabella del kernel per migliorare le performance. C'è solo una tabella di routing cache anche se se ne possono configurare molte. La cache è dove il kernel salva i risultati degli instradamenti recenti. Salva solo i risultati per uno specifico indirizzo IP, mentre non salva le informazioni di routing di sottoreti. Le routing cache possono essere modificate con con ip route come un tabella e può essere vista da ip route show cache e scaricata da ip route flush cache. La cache è la prima tabella di routing usata dal kernel ogni volta che deve instradare. E' anche usato prima della tabella di routing locale.

Esempi di tabelle di routing

Qui di seguito vengono riportati esempi di tabelle di routing:

  • La tabella di routing locale mostrata da iproute2
% ip route show table local
broadcast 127.255.255.255 dev lo  proto kernel  scope link  src 127.0.0.1
local 192.168.157.3 dev eth0  proto kernel  scope host  src 192.168.157.3
broadcast 192.168.157.0 dev eth0  proto kernel  scope link  src 192.168.157.3
broadcast 127.0.0.0 dev lo  proto kernel  scope link  src 127.0.0.1
broadcast 192.168.157.255 dev eth0  proto kernel  scope link  src 192.168.157.3
local 127.0.0.1 dev lo  proto kernel  scope host  src 127.0.0.1
local 127.0.0.0/8 dev lo  proto kernel  scope host  src 127.0.0.1
  • La principale tabella di routing mostrata da iproute2
% ip route show table main
172.16.1.0/24 via 192.168.157.253 dev eth0
192.168.157.0/24 dev eth0  proto kernel  scope link  src 192.168.157.3
127.0.0.0/8 dev lo  scope link
default via 192.168.157.2 dev eth0
  • La principale tabella di routing mostrata dal route command
% route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
172.16.1.0      192.168.157.253 255.255.255.0   UG    0      0        0 eth0
192.168.157.0   0.0.0.0         255.255.255.0   U     0      0        0 eth0
127.0.0.0       0.0.0.0         255.0.0.0       U     0      0        0 lo
0.0.0.0         192.168.157.2   0.0.0.0         UG    0      0        0 eth0

Regole e politiche

Le regole sono usate per dire al kernel che azione deve seguire per ogni tipo di pacchetto di rete. L'azione usa spesso le tabelle di routing personalizzate, ma possono anche essere utilizzate specifiche azioni come throw, unreachable, prohibit, blackhole.

Qui sono riportati i parametri che si possono usare per decidere che tabella di rete usare:

  • L'indirizzo IP mittente e l'indirizzo IP destinazione
  • Il device di ingresso, cioè da dove il pacchetto arriva
  • Il TOS (Type Of Service), è la parte dell'intestazione del pacchetto IP
  • Il numero fwmark (firewall mark). E' l'attributo che può essere cambiato in netfilter, bisogna usare iptables per farlo.

Esempi di regole

  • Tutti i pacchetti da 192.168.114.0/24 dovrebbero usare la tabella di routing chiamata rt_table1
ip rule add from 192.168.114.0/24 table rt_table1
  • Tutti i pacchetti da 192.168.5.1 a 172.16.1.100 non dovrebbero essere instradati e gli irraggiungibili dovrebbero tornare via ICMP:
ip rule add from 192.168.5.1 to 172.16.1.100 unreachable
  • Tutti i pacchetti da 192.168.5.1 non dovrebbero essere instradati:
ip rule add from 192.168.5.1 prohibit
  • Tutti i pacchetti segnati con fwmark=1 da netfilter (si può fare con iptables) dovrebbero essere indirizzati a rt_table_adsl
ip rule add fwmark 1 table rt_table_adsl
  • Tutti i pacchetti segnati con fwmark=2 da netfilter (si può fare con iptables) dovrebbero essere instradati a rt_table_cable
ip rule add fwmark 2 table rt_table_cable
  • Si può rimuovere una regola esistente usando una sinstassi simile all'aggiunta di un subcomando. Viene riportato come rimuovere l'ultima regola aggiunta:
ip rule del fwmark 2 table rt_table_cable

Come vengono processate le regole

Il kernel supporta fino a 32767 regole. Di default sono utilizzate solo le seguenti regole:

% ip rule
0:      from all lookup local
32766:  from all lookup main
32767:  from all lookup default

Le regole vengono eseguite in ordine, dalla priorità 0 a priorità 32767. Questo significa che la prima regola (regola 0) è la prima che deve essere eseguita e guida tutti i pacchetti alla tabella di routing locale, per poter velocemente processare i pacchetti che devono essere consegnati localmente. Gli instradamenti principali e di default sono gli ultimi ad essere usati. Quindi la tabella di routing principale verrà usata solo se non viene trovato valido nessun instradamento personalizzato per un pacchetto di rete. In altre parole, tutti i pacchetti che non si accordano con le regole specificate da ip rule useranno la tabella principale di routing. La tabella di routing di default è vuota di default. Si può usare se si vogliono specificare instradamenti per pacchetti che non si accordano con nessun instradamento precedente.

Stai attento: anche se tu hai solo classiche tabelle di routing sul tuo sistema, le regole di default sono importanti. Rimuovere le regole di default potrebbero interromopere le regole classiche, quindi il pacchetto potrebbe non accedere alla principale tabella di routing.

Quando si creano regole, bisogna specificare la priorità con priority xxx. Se non si specifica la priorità gli verrà attribuito l'ultimo numero disponibile, ciò significa che le prime regole create saranno 32765, 32764, ...

Esempi di regole

Qui c'è la lista di regole che otteniamo se eseguiamo tutte le regole date nella sezione precedente:

% ip rule show
0:      from all lookup local
32761:  from all fwmark 0x2 lookup rt_table_cable
32762:  from all fwmark 0x1 lookup rt_table_adsl
32763:  from 192.168.5.1 prohibit
32764:  from 192.168.5.1 to 172.16.1.100 unreachable
32765:  from 192.168.114.0/24 lookup rt_table1
32766:  from all lookup main
32767:  from all lookup default

Come organizzare le tabelle di routing

Ricorda che i pacchetti possono controllare più tabelle di routing, ogni tabella di routing può avere più instradamenti. Quindi nel caso in cui nessun instradamento si accordi con la prima tabella di routing, altre tabelle saranno controllate per trovare il giusto instradamento per il pacchetto. Quindi non si devono duplicare gli instradamenti della principale tabella di routing nelle tabelle personalizzate.

Una buona strada per gestire le differenti tabelle di routing è usare il metodo seguente:

  • Aggiungere tutti gli instradamenti normali basati sulla destinazione nella tabella principale di routing.
  • Aggiungere solo un default route in ognuna delle altre tabelle di routing.

Questo modo, termina con qualcosa di semplice, e c'è solo un instradamento per ogni regola, e la lista di regole è simile alla tabella di routing master.

spacer