Descrivere le regole di policy routing in un ambiente linux e’ una cosa abbastanza lunga e complessa, con questo articolo voglio solo fare una introduzione a quello che potete realizzare con il vostro Box linux ed i comandi presenti in iproute2.
Per maggiori informazioni ed approfondimenti suggerisco l’ottimo sito: http://www.policyrouting.org/
iproute2 è una collezione di tool a riga di comando per il controllo del networking e del traffico di rete, sia IPv4 che IPv6. È attualmente sviluppato da Stephen Hemminger. L’autore originale, Alexey Kuznetsov, era responsabile dell’implementazione di QoS nel kernel Linux.
ools”), precedentemente utilizzato per la configurazione delle interfacce di rete, tabelle di route e per la gestione delle tabelle ARP. Tali tool non erano più aggiornati dal 2001. I comandi rimpiazzati da iproute2 sono:
Indirizzo e configurazione del link: ifconfig → ip addr, ip link
Tabelle di routing: route → ip route
Vicini: arp → ip neigh
Tunnel: iptunnel → ip tunnel
Multicast: ipmaddr → ip maddr
netstat → ss
iproute2 unifica la sintassi di questi vari comandi, che si sono evoluti durante i molti anni dello sviluppo di Unix. La sintassi di iproute2 è molto semplice e più consistente tra tutte le funzioni che fornisce, emulando tra l’altro la sintassi del sistema operativo Cisco IOS.
Sintassi:
La base per tutti i comandi sarà ip < oggetto > < azione > < parametri >
Lavoriamo con IP e schede di rete
1 ip link
Con link possiamo lavorare con le schede di rete, ad esempio:
ip link show
Mostra lo stato di tutte le schede di rete (up/down) ed anche il loro Mac Address
ip link set eth0 down|up
Cambia lo stato della scheda di rete eth0 in down o up
2 ip address
Con address lavoriamo con gli indirizzi IP presenti (o da associare) sulle schede di rete.
ip address show
Mostra gli indirizzi di rete di tutte le schede presenti.
ip addr add 192.168.0.23/24 brd + dev eth1
Aggiunge a eth1 l’indirizzo 192.168.0.23, dopo quel comando avevo sulla mia eth1:
ip a l eth1
7: eth1: mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:02:8a:9f:21:34 brd ff:ff:ff:ff:ff:ff
inet 192.168.0.10/24 brd 192.168.0.255 scope global eth1
inet 192.168.0.23/24 brd 192.168.0.255 scope global secondary eth1
Quindi il comando aggiunge un indirizzo secondario sulla scheda di rete.
3 ip route
Con route possiamo vedere e manipolare le tabelle di routing.
ip route show
Mostra la tabella di routing di default.
Questa era una brevissima introduzione, ma vediamo ora come realizzare un
Policy Routing Dinamico
Esempio:: Abbiamo un box firewall (fatto con linux naturalmente) che è collegato a 3 diverse reti:
– Public router – net 120.120.120.0/24 GW 120.120.120.1
– DMZ area – net 192.168.0.0/24 GW 192.168.0.1
. Internal network – net 10.0.0.0/24 GW 10.0.0.1
Default route è sulla scheda pubblica:
ip route show
120.120.120.0/24 dev eth2 proto kernel scope link src 120.120.120.10
default via 120.120.120.1 dev eth2
Possibile problema, dovete fare ssh sul box con il firewall per farci manutenzione, finche arriverete da una macchina proveniente da una delle reti presenti sulle schede di rete non avrete problemi in quanto le route statiche manderanno il pacchetto di riotrno indietro sull’interfaccia giusta.
Ma, se provenite da un’altra rete privata (diciamo 10.10.10.0) che arriva sull’interfaccia privata (10.0.0.0) cosa succederà ?
Se avete aggiunto una route statica per 10.10.10.0 tutto andrà bene ed il pacchetto tornerà indietro dalla giusta scheda di rete, altrimenti il pacchetto utilizzerà il default gateway e quindi proverà ad utilizzare la scheda pubblica per raggiungere 10.10.10.0 facendo così traffico asimmetrico e probabilmente non riuscendo a raggiungerlo.
Le soluzioni sono:
- Aggiungere route statiche per tutti i casi che conosciamo, sconsigliato se non per piccole realtò che non cambiano spesso.
- Creare regole per eseguire un routing dinamico.
Questa seconda soluzione vuole semplicemente dire, “fai uscire il pacchetto dall’interfaccia di rete da cui e’ entrato”, suona bene no ?
Come prima cosa aggiungiamo 2 routing table, così avremo un totale di 3 tabelel di routing.
1 default, per definizione la default è una sola, che utilizza come GW l’interfaccia pubblica.
1 Tabella (tabella 2) che utilizza come GW quello presente sulla rete locale
1 Tabella (tabella 3) che utilizza come GW quello presente sulla rete DMZ
ip route add table 2 default via 10.0.0.1
ip route add table 3 default via 192.168.0.1
Adesso dobbiamo solo dire al nostro kernel quando utilizzare queste tabelle aggiuntive, ci viene in soccorso il comando ip rule
che permette di aggiungere regole per il routing, ci basta infatti dare questi due comandi
ip rule add from 10.0.0.0/24 table 2
ip rule add from 192.168.0.0/24 table 3
Ed adesso abbiamo un box linux abilitato al routing dinamico, semplice…o no ?
E’ possibile verificare le tabelle aggiuntive con il comando
ip route show table X
O cancellarla con
ip route flush table X
Come al solito, spero che questo breve articolo vi abbia fatto capire le potenzialità presenti nei comandi mostrati, per un approfondimento guardate anche il link : http://linux-ip.net/
Popular Posts:
- None Found
È la via 🙂 !
Complimenti per il post ;).
What the…? What is the point of this? Why would you not either:
a) Add an address in the 10.10.10.0/24 range to the internal NIC
b) Expand the netmask on the internal NIC.
It reeks of poorly designed network.
I understand that in my example you could easily solve with an additional address on the NIC.
But in real life we had problems in doing that because the Ip range were on different Vlan used by different departments, i could have used the 802.1q extensions for Linux and add a Vlan on the same NIC, but i preferred the routing way.
Consider this possibility an alternative.
At last i’m more a system administrator than a network man, so it’s possible that you can work around a solution working on router.
Some time ago I tried to use this techniques with dual Internet providers on one interface, but somehow I never manage to get it working (well). I am only talking about incoming traffic, not load balancing the outgoing or fail over (but the later would be nice).
Hello Dennis, dual internet provider from one interface it’s for sure an hard task.
Have you used a trunk on that interface ?
I’ve experience in bonding 2 eth for failover, this usually work perfectly, while from my test (done aroudn 1 year ago) trying to load balance the outgoign traffic to aggregate the bandwith gave me bad results, so at last we gave up and now we are working with Bonded eth but only for failover.