Routing tra due uplinks/providers e Load balancing

Sin dai primi giorni di lavoro, circa 20 anni fa, le prestazione dei sistemi informatici sono state una spina nel fianco del sistemista in quanto l’utente medio scordandosi, del pallottoliere e della Calcolatrice tipo Odhner, pretende che qualunque operazione chieda al suo computer sia immediata soprattutto l’accesso alla propria pagina facebook o alla caselle di posta per vedere le ultime offerte che amazon ha riservato.

Detto questo torniamo al nostro titolo “bilanciamento di carico e instradamento verso due o più provider“. Questo argomento ormai è stato trattato con diversi tutorial su molti siti autorevoli, ma ultimamente mi sono accorto che seguendo queste guide i sistemi rispondevano con numerosi errori, un po’ perché queste trattazioni sono più teoriche che pratiche e un po’ perché i software che gestiscono i sistemi sono cambiati da quando queste guide sono state pubblicate. Ecco perché questo articolo, più come promemoria che come guida vera e propria.

Prendiamo lo scenario più classico, un’azienda che ha necessità di banda elevata per la connessione a internet spesso è costretta a escludere la fibra per i costi elevati di un link FTTH, la soluzione più economica è avere 2 o più link anche da provider diversi e aggregarli o dividere il carico in base alle preformace e tipologia dei link. Vediamo come fare avendo 2 link e usando Linux.

La configurazione hardware ha poca importanza se non che la macchina dovrà avere una scheda, lato WAN, per ogni provider attivato, 2 linee adsl 2 schede wan, 3 linee adsl 3 schede wan e così via, e almeno una scheda lato LAN. In alcuni casi ho dovuto usare gli alias per le schede wan in quanto le macchine che mi hanno fornito avevano solo 2 schede ethernet e una delle 2 era destinata alla LAN ma vi garantisco che questa non è la soluzione ottimale sia per la configurazione che per le prestazioni. Ci sono stati altre istallazione che oltra ad avere tutte le schede ethernet necessarie per le WAN avevo a disposizione anche 2 ethernet lato LAN che possono essere usate per la ridondanza o per l’aggregazione o per entrambe le necessità, di questo argomento ne ho parlato in un altro articolo.

Guardando lo schema preso da questo tutorial http://www.tldp.org/HOWTO/Adv-Routing-HOWTO/lartc.rpdb.multiple-links.html, che è stato il punto di partenza di tutte le configurazioni che ho fatto, possiamo subito capire come sarà strutturato il gateway.

schema connessione multi link

Configurazione comune di un multilink

Partiamo da una nuova installazione, minima, della vostra distribuzione preferita e impostiamo, per esempio, l’interfaccia wan eth1 collegata all’ISP A con IP 10.1.1.2, e l’interfaccia wan eth2 collegata all’ISP B con IP 172.10.10.2.
I gateway sono per il provider A 10.1.1.1 e per il B 172.10.10.1 le subnet per questi esempi sono ovviamente 255.255.255.0 nelle configurazioni più classiche. L’interfaccia LAN avrà IP 192.168.1.250. subnet 255.255.255.0.
La prima cosa da fare per il bilanciamento è aggiungere due nuove tabelle di routing definite ad esempio, ISP1 e ISP2. Queste vanno aggiunte nel file /etc/iproute2/rt_tables (per maggiori dettagli sul file rt_tables consiglio questo link http://linux-ip.net/html/routing-tables.html). Il passo successive è impostare le tabelle di routings come segue:

ip route add 10.1.1.0/24 dev eth1 src 10.1.1.2 table ISPA
ip route add default via 10.1.1.1 table ISPA
ip route add 172.10.10.0/24 dev eth2 src 172.10.10.2 table ISPB
ip route add default via 172.10.10.1 table ISPB

questa è una configurazione che si farebbe anche nel caso di un unico provider, visto che i provider sono 2 gli instradamenti sono due. Successivamente, si impostano le regole di routing. Queste in realtà scelgono tabella di routing da usare per un percorso (ISP A) o per l’altro percorso (ISP B). Si vuole fare in modo che la tabella di routing usi l’interfaccia giusta in base all’indirizzo sorgente.

ip rule add from 10.1.1.2 table ISPA
ip rule add from 172.10.10.2 table ISPB

Le tabelle successive servono per un corretto instradamento da e verso l’interfaccia LAN.

ip route add 192.168.0.0/24 dev eth0 table ISPA
ip route add 172.10.10.0/24 dev eth2 table ISPA
ip route add 127.0.0.0/8 dev lo table ISPA
ip route add 192.168.0.0/24 dev eth0 table ISPB
ip route add 10.1.1.0/24 dev eth1 table ISPB
ip route add 127.0.0.0/8 dev lo table ISPB

L’ultimo passo è bilanciare il carico e impostare un default gateway ecco come fare.

ip route add default scope global nexthop via 10.1.1.2 dev eth1 weight 1 nexthop via 172.10.10.2 dev eth2 weight 1

Il parametro “weight” indica quale gateway usare preferibilmente, in questo caso è bilanciato, aumentando il parametro si sposta il “carico” da un gaterway all’altro.

In fine è utile “marcare” i pacchetti che usano una tabella di routing o l’altra.

ip rule add fwmark 1 lookup ISPA
ip rule add fwmark 2 lookup ISPB

Questi marcatori sono utilizzabili da iptables per “forzare” l’uso di un gateway diverso da quello di default ne momenti di carico normale.
Verficare che il sistema abbia preso tutti i comandi con

ip route show

il risultato dovrà essere qualcosa di simile a

default
nexthop via 10.1.1.1 dev eth1 weight 1
nexthop via 172.10.10.1 dev eth2 weight 1
172.10.10.0/24 dev eth2 proto kernel scope link src 172.10.10.2
10.1.1.1/24 dev eth1 proto kernel scope link src 10.1.1.2
192.168.0.0/24 dev eth0 proto kernel scope link src 192.168.0.250

Finita la configurazione e verificato che i client LAN abbiano accesso a internet bisogna verificare che il sistema funzioni, disabilitando una alla volta eth1 e eth2 durante questa verifiche i cliente devono continuare a navigare, non ci si deve aspettare una assoluta trasparenza, se durante i test si sta scaricando un file è probabile che il download si intgerrompa, dipende che gateway si sta usando in quel momento.

Concludendo questa configurazione è solo il minimo indispensabile per bilanciare il carico sui due provider, configurazione attualmente funzionante diversi router Linux (debian dalla 6 alla 8) installatie e gestite da Seanet.
L’hardening della distribuzione è trattata in un altro articolo così come le impostazioni base di una firewall che consente il normale uso di internet da parte di utenti con necessità medie.