Aggregazione di banda

In questa sezione andremo ad analizzare l’implementazione del cosiddetto Load Balancing con l’aggiunta del Failover mediante un router MikroTik, andando a controllare la configurazione necessaria per predisporre il router facendo le opportune considerazioni del caso.
A tal scopo il router utilizzato in questa configurazione è il MikroTik RB4011, una macchina di discrete caratteristiche per il suo costo:

  • Architettura Arm
    • CPU Arm v7 – quad core – 1.4GHz
    • 1Gb RAM
    • 512Mb di disco su Nand
    • 10 x porte FastEthernet 1Gbits/s
    • 1 x porta SFP+ 10Gbits/s

Per la configurazione in esame vengono sfruttate due connessioni Internet di tipo 4G LTE, mediante l’uso di routers 4G collegati alle due FastEthernet dell’RB4011 che hanno svolto la funzione di interfacce WAN. In questo caso avendo due WAN si tratta di gestire l’instradamento selettivo verso Internet in modo da distribuire i carichi, in parte verso una connessione ed in parte verso l’altra.
A questo punto bisogna fare una prima precisazione per quanto concerne l’aggregazione di banda rispetto al concetto di load balancing. Poter aggregare la banda da più fonti Internet richiede che si possano generare più connessioni contemporanee quando si accede ad un servizio; questo dipende molto dalle applicazioni di rete e dai protocolli. Per esempio, utilizzando l’app di uno dei sistemi di speedtest che implementa la funzione di usare più streams dati durante il test, ecco che è possibile aggregare effettivamente la banda come sommatoria delle singole connessioni. Viceversa, in quasi tutti gli altri casi, si tratta di distribuire il traffico generato/richiesto dai device della LAN tra tutte le connessioni WAN di cui disponiamo, cercando di consumarle in modo più omogeneamente possibile.
Esistono delle implementazioni che prevedono il bonding delle interfacce (ovvero l’aggregazione fisica di due o più interfacce di rete) e alcune che invece sfruttano sistemi come l’MPTCP (Multi Path TCP), ovvero la realizzazione di più percorsi TCP su cui far viaggiare i singolo stream di traffico per poi essere aggregati.
Solitamente queste aggregazioni per avvenire richiedono che sia alla fonte che alla destinazione sia possibile aggregare il traffico, altrimenti la cosa non funzionerà mai in modo così matematico.
Pertanto, potendo solo controllare la sorgente della trasmissione, ovvero il nostro network, per far in modo che l’aggregazione possa completarsi alla destinazione, bisogna avvalersi di server remoti presenti nei data center dei vari providers che forniscono server VPS o sistemi cloud a noleggio.
In questo modo si dovrà ricreare presso il data center il punto di raccolta del traffico aggregato per poter poi raggiungere la destinazione Internet finale.
A tal scopo è importante notare che la banda Internet messa a disposizione dal data center dovrà essere uguale o maggiore rispetto la banda complessiva ottenuta sommando tutte le connessioni WAN di cui disponiamo nel nostro punto di partenza.
Inoltre, qualora l’implementazione sfruttasse il bonding delle interfacce fisiche, c’è da ricordare che spesso vengono utilizzati sistemi di trasmissione e controllo del traffico basati sul RoundRobin, ovvero su una sorta di bilanciamento tra le risorse. Pertanto se stessimo aggregando connessioni molto diverse tra loro in termini di capacità di banda, per effetto del RoundRobin la capacità massima disponibile sarebbe paragonabile alla velocità della connessione minima presente in quel momento.
Diversamente mediante MPTCP questo fenomeno non si verificherebbe, anche se si pone sempre la questione di doversi avvalere di un sito remoto presso il data center per raccogliere il traffico generato in modo da poter aggregare verso la destinazione finale.
Pertanto, immaginando che da un device della LAN si cercasse di vedere un film su Netflix, sfruttando per esempio 4 connessioni di rete (ADSL, Fibra, 4G LTE) la nostra configurazione locale dovrebbe generare 4 flussi in MPTCP verso il nostro router installato presso il data center, il quale a sua volta sempre tramite MPTCP ricombinerebbe i 4 flussi per rilanciare la comunicazione verso il server Netflix sfruttando l’elevata banda disponibile nel data center; questo ci permetterebbe di ricevere il film come un flusso pari alla somma delle 4 connessioni. Ovviamente al prezzo di metter in piedi tutta questa configurazione, incluso l’uso di un data center.

Quando si approccia alla questione di aggregare la banda in modo diverso, considerandola come un sistema per sfruttare tutte le connessioni WAN disponibili non tanto per fornire al singolo device la somma delle connessioni disponibili, bensì per permettere a più devices di sfruttare le diverse connessioni in modo più omogeneo, ecco che si può parlare di implementazione di un meccanismo di Load balancing. Per fare ciò non serve appoggiarsi ad alcun data center e la configurazione viene gestita unicamente dal router principale a cui sono connessi i modem/router delle connessioni Internet.
In tal senso poiché ogni router dispone di una tavola di routing principale, in cui gestisce tutti gli instradamenti sia verso Internet che verso altre subnet della nostra rete, bisognerà definire delle regole di routing per inoltrare il traffico verso le varie WAN che abbiamo deciso di impiegare.
Poiché la default route può essere solo una, visto che due instradamenti con la stessa metrica non saranno entrambi attivi contemporaneamente, bisognerà definire delle tavole di routing secondarie per gestire gli instradamenti selettivi su ciascuna WAN.
A tal scopo RouterOs ci viene incontro grazie alla parte Mangle presente nel setup del Firewall.
Ecco un setup per definire il load balancing grazie alle regole Mangle per marcare le connessioni che vorremo instradare sulla WAN1 o sulla WAN2.

/ip firewall mangle
add action=accept chain=prerouting dst-address-list=ConnectedNetworks

add action=jump chain=prerouting connection-state=new jump-target=conn-mark

add action=mark-routing chain=prerouting connection-mark=WAN1_conn in-interface=LAN \
    new-routing-mark=route_WAN1 passthrough=no

add action=mark-routing chain=prerouting connection-mark=WAN2_conn in-interface=LAN \
    new-routing-mark=route_WAN2 passthrough=no

add action=mark-connection chain=conn-mark connection-mark=no-mark dst-address-list=\
    !LB_Disabled in-interface=ether1-WAN new-connection-mark=WAN1_conn passthrough=yes

add action=mark-connection chain=conn-mark connection-mark=no-mark dst-address-list=\
    !LB_Disabled in-interface=ether10-WAN new-connection-mark=WAN2_conn passthrough=yes

add action=mark-connection chain=conn-mark connection-mark=no-mark dst-address-type=\
    !local in-interface=LAN new-connection-mark=WAN1_conn passthrough=yes per-connection-classifier=both-addresses-and-ports:2/0 src-address-list=!LB_Disabled

add action=mark-connection chain=conn-mark connection-mark=no-mark dst-address-type=\
    !local in-interface=LAN new-connection-mark=WAN2_conn passthrough=yes per-connection-classifier=both-addresses-and-ports:2/1 src-address-list=!LB_Disabled

add action=mark-routing chain=output connection-mark=WAN1_conn \
    dst-address-list=!ConnectedNetworks new-routing-mark=route_WAN1 passthrough=no

add action=mark-routing chain=output connection-mark=WAN2_conn \
    dst-address-list=!ConnectedNetworks new-routing-mark=route_WAN2 passthrough=no

Vediamo più in dettaglio cosa fanno queste regole.

  1. add action=accept chain=prerouting dst-address-list=ConnectedNetworks
    • questa regola consente di escludere dall’operazione di marcare le connessioni tutte quelle destinazioni che fanno parte del nostro network, ovvero le connessioni dirette al nostro router. Bisognerà creare una Address-List inserendo tutti gli IP o subnet che si devono escludere dalle regole Mangle.
  2. add action=jump chain=prerouting connection-state=new jump-target=conn-mark
    • questa regola intercetta tutte le nuove connessioni e sposta il controllo nella chain conn-mark, in modo che tutte le regole successive all’interno della chain vengano eseguite solo su nuove connessioni.
  3. add action=mark-routing chain=prerouting connection-mark=WAN1_conn in-interface=LAN new-routing-mark=route_WAN1 passthrough=no
    • questa regola prende il traffico proveniente dalla LAN che risulta già marcato come connessione destinata via WAN1 e definisce il marker per la tavola di routing route_WAN1.
  4. add action=mark-routing chain=prerouting connection-mark=WAN2_conn in-interface=LAN new-routing-mark=route_WAN2 passthrough=no
    • questa regola prende il traffico proveniente dalla LAN che risulta già marcato come connessione destinata via WAN2 e definisce il marker per la tavola di routing route_WAN2.
  5. add action=mark-connection chain=conn-mark connection-mark=no-mark dst-address-list=!LB_Disabled in-interface=ether1-WAN new-connection-mark=WAN1_conn passthrough=yes
    • il traffico entrante dall’interfaccia WAN1 che non risulta già marcato viene processato per ricevere il marker WAN1_conn da associare alla connessione stessa. In seguito questo traffico verrà processato per essere inserito nella tavola di routing specifica per la WAN1. Da notare la presenza di una address list per evitare di processare il traffico diretto verso macchine a cui non si vuole applicare il load balancing.
  6. add action=mark-connection chain=conn-mark connection-mark=no-mark dst-address-list=!LB_Disabled in-interface=ether10-WAN new-connection-mark=WAN2_conn passthrough=yes
    • il traffico entrante dall’interfaccia WAN2 che non risulta già marcato viene processato per ricevere il marker WAN2_conn da associare alla connessione stessa. In seguito questo traffico verrà processato per essere inserito nella tavola di routing specifica per la WAN1. Da notare la presenza di una address list per evitare di processare il traffico diretto verso macchine a cui non si vuole applicare il load balancing.
  7. add action=mark-connection chain=conn-mark connection-mark=no-mark dst-address-type=!local in-interface=LAN new-connection-mark=WAN1_conn passthrough=yes per-connection-classifier=both-addresses-and-ports:2/0 src-address-list=!LB_Disabled
    • questa regola è il selettore che consente di smistare le connessioni, alcune verso la WAN1 e altre verso la WAN2. In pratica per il traffico proveniente dalla LAN che non risulta già marcato, viene usato l’algoritmo MikroTik per determinare in base all’indirizzo sorgente/destinazione e alle porte sorgente/destinazione un codice che faccia decidere al router verso quale WAN destinare il traffico. Il traffico locale viene escluso in modo da farlo passare attraverso la tavola di routing principale. Grazie a questa regola il traffico verrà successivamente marcato per finire nella tavola di routing secondaria per la WAN1.
  8. add action=mark-connection chain=conn-mark connection-mark=no-mark dst-address-type=!local in-interface=LAN new-connection-mark=WAN2_conn passthrough=yes per-connection-classifier=both-addresses-and-ports:2/1 src-address-list=!LB_Disabled
    • questa regola è il selettore che consente di smistare le connessioni, alcune verso la WAN1 e altre verso la WAN2. In pratica per il traffico proveniente dalla LAN che non risulta già marcato, viene usato l’algoritmo MikroTik per determinare in base all’indirizzo sorgente/destinazione e alle porte sorgente/destinazione un codice che faccia decidere al router verso quale WAN destinare il traffico. Il traffico locale viene escluso in modo da farlo passare attraverso la tavola di routing principale. Grazie a questa regola il traffico verrà successivamente marcato per finire nella tavola di routing secondaria per la WAN2.
  9. add action=mark-routing chain=output connection-mark=WAN1_conn dst-address-list=!ConnectedNetworks new-routing-mark=route_WAN1 passthrough=no
    • questa regola consente di gestire il traffico in uscita generato dal router (non dai clients della LAN). Quindi al traffico che risulta già marcato come connessione WAN1 verrà applicato il marker di routing route_WAN1 per farlo inserire nella tavola di routing della WAN1.
  10. add action=mark-routing chain=output connection-mark=WAN2_conn dst-address-list=!ConnectedNetworks new-routing-mark=route_WAN2 passthrough=no
    • questa regola consente di gestire il traffico in uscita generato dal router (non dai clients della LAN). Quindi al traffico che risulta già marcato come connessione WAN2 verrà applicato il marker di routing route_WAN2 per farlo inserire nella tavola di routing della WAN2.

Questa implementazione sfrutta il selettore di traffico PCC (per-connection-classifier) a cui si può indicare in base a quale criterio far agire l’agoritmo. L’impostazione both-addresses-and-ports consente di smistare quasi ogni nuova connessione verso l’altra WAN, però rischia di compromettere le sessioni HTTPS verso siti protetti; infatti se un sito dopo il login vi rimanda ad un’altra pagina che ha un indirizzo interno diverso, l’algoritmo farà passare questa nuova connessione verso l’altra WAN, per bilanciare il traffico, ma questo spesso interrompe le connessioni sicure dando errori. Un caso tipico possono essere tutti i siti delle banche o altri servizi che verificano che le varie richieste di sessione associate ad un utente arrivino dallo stesso IP. In questo caso, invece, con un selettore del traffico troppo aggressivo, alcune sessioni arriveranno dall’IP della WAN1 e altre da quello della WAN2, causando errori nella connessione HTTPS al server. In questo caso bisogna rilassare la regola ed evitare che continui a far cambiare WAN.

Per completare la configurazione bisogna lavorare sulle tavole di routing, per definire appunto le tabelle secondarie relative alla WAN1 e WAN2. A tal proposito si rimanda all’articolo relativo a come gestire anche il FailOver nella sezione di IP route di RouterOs.

Quella che segue è una breve DEMO dove ho effettuato un doppio collegamento in download per verificare che entrambe le WAN fossero interessate dal traffico. Ciò che si vedrà è che il traffico complessivo aggregato sulla LAN risulta pari ai due contributi scaricati dalle rispettive WAN.

Video demo per mostrare il Load Balancing tramite router MikroTik RB4011
Banda consumata

Infine questo grafico indica il consumo complessivo di banda Internet relativo all’interfaccia WAN1 (primaria) nel corso di un anno a partire da Aprile/2020 anche a causa dello Smart Working per via del Covid-19. Si tratta di una media giornaliera e la risoluzione del grafico mostra proprio 1 giorno di media di traffico effettuato; la parte in verde indica il downstream, mentre in blue la parte in upstream.

La configurazione trattata consente di implementare il Load Balancing e insieme alla configurazione delle tavole di routing si potrà implementare anche la funzione di Failover.

error: Content is protected !!