c'e' solo un modo di fare le cose: farle bene
Dopo l’intervento al ginocchio, eccomi di nuovo a scrivere su IdeaFactory e voglio iniziare scusandomi con tutti quelli che mi hanno scritto o contattato via Facebook e non hanno ancora ricevuto risposta.
Purtroppo non è facile stare seduti davanti ad un PC (anche se è un bel iMac) dopo un intervento al ginocchio.
Ma veniamo all’articolo. Forse il titolo non rende l’idea ma l’argomento di oggi risponde a questa domanda: avendo due connessioni ad Internet collegate alla mia Linux box che funge da router, come faccio a gestire il fail di una delle connessioni inoltrando a quella funzionante il traffico?
Per meglio comprende l’articolo, vi consiglio di spulciare velocemente due miei vecchi post:
Rinfrescata la memoria sul routing di Linux, passiamo ad analizzare la logica di funzionamento dello script. (continua…)
In un precedente post avevo spiegato come è possibile fare load balance su una linux box collegata a due provider differenti con due schede di rete distinte.
Cosa succede se i gateway appartengono alla stessa sotto rete? Problema tirato fuori da Alessandro attraverso i commenti dell’articolo “iproute: load balance verso 2 gateway“.
Supponiamo che l’indirizzo di rete della nostra LAN sia 192.168.1.0/24 e che all’interno ci siano due gateway:
E’ indispensabile creare le tabelle di routing aggiuntive di iproute editando il file /etc/iproute2/rt_tables:
#
# reserved values
#
255 local
254 main
253 default
# Aggiunte
252 alice
251 micso
# Fine
0 unspec
#
# local
#
#1 inr.ruhep
Disabilitiamo l’rp_filter per l’interfaccia ethernet (nel mio caso eth0):
echo 0 > /proc/sys/net/ipv4/conf/eth0/rp_filter
Abilitiamo l’ip forward (forse non serve):
echo 1 > /proc/sys/net/ipv4/ip_forward
Marchiamo i pacchetti in base al mac address di provenienza:
iptables -t mangle -I PREROUTING -m mac --mac-source 00:1c:a2:e6:dc:10 -j MARK --set-mark 1
iptables -t mangle -I PREROUTING -m mac --mac-source 00:1a:c1:36:a7:c4 -j MARK --set-mark 2
00:1c:a2:e6:dc:10: MAC router di Alice
00:1a:c1:36:a7:c4: MAC router di Micso
Creiamo il routing per i pacchetti marcati:
ip rule add fwmark 2 lookup micso
ip rule add fwmark 1 lookup alice
Adesso aggiungiamo l’ip della macchina linux su cui stiamo lavorando alle due tabelle di routing appena create:
ip rule add from 192.168.1.7 table alice
ip rule add from 192.168.1.7 table micso
Per sicurezza aggiungiamo anche l’ip locale:
ip rule add from 127.0.0.1 table micso
ip rule add from 127.0.0.1 table alice
Cancelliamo la regola di routing di default:
route del default
Tramite iproute settiamo il load balance attraverso i due gateway:
ip route add default scope global nexthop via 192.168.1.1 dev eth0 weight 1 nexthop via 192.168.1.254 dev eth0 weight 1
Eh tutti vissero felici e contenti!:)
Spero di aver dato una mano ad Alessandro e a tutti quelli che sono incappati nella medesima configurazione.
Per finire ricordo che le tabelle di routing (alice e micso), l’ip della linux box (192.168.1.7) , gli ip dei gateway (192.168.1.1 e 192.168.1.254) ed i MAC address dei 2 router (00:1c:a2:e6:dc:10 e 00:1a:c1:36:a7:c4) devono essere adattati alle proprie esegenze.
Spesso Linux viene usato come router e quelli che definiscono tale soluzione “casalinga” si sbagliano di grosso perché grazie alla potenzilità di netfilter e di iproute linux si trasforma un un avanzatissimo router dalle mille funzionalità.
In questo articolo descriverò com’è possibile dividire il traffico proveniente dalla vostra LAN verso due gateway di due provider distinti in modo tale da velocizzare il download dei client.
Schemattizzando la rete, dovremmo avere questo:

Powered by Lifestream.
| L | M | M | G | V | S | D |
|---|---|---|---|---|---|---|
| « feb | ||||||
| 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 8 | 9 | 10 | 11 | 12 | 13 | 14 |
| 15 | 16 | 17 | 18 | 19 | 20 | 21 |
| 22 | 23 | 24 | 25 | 26 | 27 | 28 |
| 29 | 30 | 31 | ||||