PDA

View Full Version : Load balancing con Mikrotik RouterOS 7


Spellsword
23-05-2021, 17:46
Scopo della guida è esplorare le funzionalità del routeros 7 per creare delle policy di load balancing di connessioni multiple.
La guida è valida per qualsiasi tipo di rete WAN, l'implementazione qui esposta è specifica per il Mikrotik Chateau LTE12 e una scheda LTE USB aggiuntiva

Prerequisiti hardware:
- Mikrotik Chateau LTE12
- Un adapter m2 -> USB3
- Una scheda LTE M2 quectel e relative antenne
- Una sim dati
Un esempio qui sotto (senza sim)
https://i.imgur.com/QCxmicEm.jpg

Assemblate il tutto, connettelo alla porta usb dello chateau e procedete a collegarvi al terminale.
Potete anche usare winbox, ma chiaramente dovete tradurre su interfaccia quanto qui sotto mostrato.
Se la scheda è supportata (io uso una em12g, ma dovrebbe supportare tutte le quectel M2, le nuovissime EM-160/120 sono già supportate) dovreste trovarla nella lista delle interfacce con il nome lte2.
Potete procedere a prepare le schede lte per la connessione WAN.

Se partite da zero, aggiungete i DNS al router
/ip dns
set allow-remote-requests=yes servers=1.1.1.1,1.0.0.1

Preparate gli apn dei vostri operatori (wind e vodafone in questo esempio)
/interface lte apn
add apn=internet.it default-route-distance=11 name=wind-very use-network-apn=no use-peer-dns=no
add apn=mobile.vodafone.it default-route-distance=10 name=vodafone use-network-apn=no use-peer-dns=no

Il parametro default-route-distance servirà per definire la precedenza per le connessioni iniziate dal router.
Questo vi garantirà sempre di avere una connessione in uscita dal router attiva, per esempio per scaricare gli aggiornamenti di routeros

Eseguiamo il bind dell'apn per attivare le connessioni LTE
/interface lte
set [ find ] allow-roaming=no apn-profiles=vodafone band="" name=lte1
set [ find ] allow-roaming=no apn-profiles=wind-very band="" name=lte2

Aggiungiamo lte2 al gruppo delle interfacce WAN
/interface list member
add interface=lte2 list=WAN

Si da per scontato che la lte1 sia già nel gruppo, è la configurazione di default
Eseguendo questa configurazione sfruttiamo la configurazione di default del masquerade che lavora per gruppi di interfacce
Non è quindi necessario andare a settare una regola di masquerade specifica per la lte2
Potete eseguire questo step per un interfaccia ethernet anche, se per esempio volete bilanciare verso un altro modem/router

Creiamo 2 routing table aggiuntive per il bilanciamento
/routing table
add fib name=rt_wan_usb
add fib name=rt_wan_int
La routing table rt_wan_usb farà riferimento alla lte USB
La routing table rt_wan_int farà riferimento alla lte interna

Adesso procediamo con le regole di bilanciamento

Creiamo le regole in uscita dal router
/ip firewall mangle
add action=mark-connection chain=input in-interface=lte1 new-connection-mark=conn_wan_int
add action=mark-connection chain=input in-interface=lte2 new-connection-mark=conn_wan_usb
add action=mark-routing chain=output connection-mark=conn_wan_int new-routing-mark=rt_wan_int
add action=mark-routing chain=output connection-mark=conn_wan_usb new-routing-mark=rt_wan_usb

Creiamo le regole per i client
Regola per bloccare destination address su una specifica interfaccia
/ip firewall mangle
add action=mark-connection chain=prerouting comment="VPN egress always through lte_int" connection-mark=no-mark dst-address-list=VPN dst-address-type=!local in-interface-list=LAN \
new-connection-mark=conn_wan_int passthrough=yes

Regola per bloccare determinati client sulla lte interna
/ip firewall mangle
add action=mark-connection chain=prerouting comment="from LAN egress through lte_int" connection-mark=no-mark dst-address-type=!local in-interface-list=LAN new-connection-mark=\
conn_wan_int passthrough=yes src-address-list=from_lan_to_lte_int


Regola per bloccare determinati client sulla lte usb
/ip firewall mangle
add action=mark-connection chain=prerouting comment="from LAN egress through lte_usb" connection-mark=no-mark dst-address-type=!local in-interface-list=LAN new-connection-mark=\
conn_wan_usb passthrough=yes src-address-list=from_lan_to_lte_usb

Un altra Regola per bloccare determinati client su lte usb
/ip firewall mangle
add action=mark-connection chain=prerouting comment="streaming egress always through lte_usb" connection-mark=no-mark dst-address-type=!local in-interface-list=LAN \
new-connection-mark=conn_wan_usb passthrough=yes src-address-list=streaming

Per queste regole stiamo sfruttando la proprietà src-address-list per selezionare i pacchetti di alcuni client specifi.
Potete usare altre proprietà, da interfaccia winbox avete un overview delle proprietà utilizzabili.

Potete andare avanti ad aggiungere tutte le regole di cui avete bisogno.
Tutto ciò che non farà match in queste regole verrà bilanciato dalle regole PCC qui sotto

Regole di load balancing vero e proprio
/ip firewall mangle
add action=mark-connection chain=prerouting comment="PCC to lte_int" connection-mark=no-mark dst-address-type=!local in-interface-list=LAN new-connection-mark=conn_wan_int \
passthrough=yes per-connection-classifier=src-address:2/0
add action=mark-connection chain=prerouting comment="PCC to lte_usb" connection-mark=no-mark dst-address-type=!local in-interface-list=LAN new-connection-mark=conn_wan_usb \
passthrough=yes per-connection-classifier=src-address:2/1

Potete variare la policy di balancing come meglio credete, a me basta il Source address
il parametro da cambiare è per-connection-classifier, e potete utilizzare per esempio:
# - Source address
# - Destination address
# - Source + destination address
# - etc
Più il classifier è preciso, più le connessioni saranno distribuite in modo omogeneo
Anche per questa configurazione, da interfaccia winbox avete un overview delle proprietà utilizzabili.

Attenzione al parametro passthrough=yes, se viene omesso non appena il pacchetto matcha una regola viene rimosso dalla catena di prerouting e non raggiungerà la parte di routing-mark qui sotto


Aggiungiamo aggiungiamo il mark per utilizzare la routing table corretta
/ip firewall mangle
add action=mark-routing chain=prerouting connection-mark=conn_wan_int in-interface-list=LAN new-routing-mark=rt_wan_int
add action=mark-routing chain=prerouting connection-mark=conn_wan_usb in-interface-list=LAN new-routing-mark=rt_wan_usb


Aggiungete qualche host alle address-list (gli indirizzi sono di esempio)
/ip firewall address-list
add address=192.168.0.zzz list=streaming
add address=192.168.0.xxx list=streaming
add address=xxx.xxx.xxx.xxx comment="VPN 1" list=VPN
add address=yyy.yyy.yyy.yyy comment="VPN 2" list=VPN
add address=192.168.0.y comment="Desktop" list=from_lan_to_lte_int
add address=192.168.0.x comment="IOT1" list=from_lan_to_lte_usb

Creiamo le regole di routing
/routing rule
add action=lookup-only-in-table dst-address=0.0.0.0/0 routing-mark=rt_wan_usb table=rt_wan_usb
add action=lookup-only-in-table dst-address=0.0.0.0/0 routing-mark=rt_wan_int table=rt_wan_int

Aggiungiamo le route
/ip route
add comment=rt_wan_int_main distance=1 dst-address=0.0.0.0/0 gateway=lte1 routing-table=rt_wan_int
add comment=rt_wan_usb_main distance=1 dst-address=0.0.0.0/0 gateway=lte2 routing-table=rt_wan_usb
add comment=rt_wan_int_bck distance=2 dst-address=0.0.0.0/0 gateway=lte2 routing-table=rt_wan_int
add comment=rt_wan_usb_bck distance=2 dst-address=0.0.0.0/0 gateway=lte1 routing-table=rt_wan_usb

Prestate attenzione alle regole, come vedete ci sono due regole per ciascuna interfaccia/route table
La distance determinata la priorità di utilizzo, minore il valore, maggiore la priorità
Con questa configurazione, state quindi creando una route di default per interfaccia e una di backup
Garantendo il failover in caso di assenza di connessione su una delle schede


Creaiamo la configurazione per gestire il failover/failback

Scegliete 2 host da pingare (io ho scelto i dns di google) e forzate il routing attraverso una sola interfaccia
Scegliete una coppia di host con bassa latenza e alta disponibilità, idealmente i servizi dns sono i migliori

/ip route
add disabled=no dst-address=8.8.8.8/32 gateway=lte1 routing-table=main suppress-hw-offload=no
add disabled=no dst-address=8.8.4.4/32 gateway=lte2 routing-table=main suppress-hw-offload=no

Creiamo gli script necessari per abilitare/disabilitare le routing table addizionali
/system script
add dont-require-permissions=no name=enable_rt_wan_int owner=admin policy=write source="ip route enable [find comment=rt_wan_int_main]"
add dont-require-permissions=no name=disable_rt_wan_int owner=admin policy=write source="ip route disable [find comment=rt_wan_int_main]"
add dont-require-permissions=no name=enable_rt_wan_usb owner=admin policy=write source="ip route enable [find comment=rt_wan_usb_main]"
add dont-require-permissions=no name=disable_rt_wan_usb owner=admin policy=write source="ip route disable [find comment=rt_wan_usb_main]"

Configuriamo Netwatch per pingare gli host scelti e abilitare/disabilitare le interfacce in caso di failover/failback
/tool netwatch
add down-script=disable_rt_wan_int host=8.8.8.8 interval=20s up-script=enable_rt_wan_int
add down-script=disable_rt_wan_usb host=8.8.4.4 interval=20s up-script=enable_rt_wan_usb

Configurazioni utili aggiuntive

Riavviamo un interfaccia tutte le mattine
/system script
add dont-require-permissions=no name=reset_lte1 owner=admin policy=write source=\
":log info \"LTE1 DOWN\";\r\
\n/interface disable lte1\r\
\n/delay 1s\r\
\n/interface enable lte1\r\
\n:log info \"LTE1 UP\";"
/system scheduler
add interval=1d name=reset_lte1_0800 on-event=reset_lte1 policy=write start-date=may/05/2021 start-time=08:00:00

Buona Navigazione e Buona Discussione :)