
Supponiamo quindi di avere a disposizione due connessioni e di voler bilanciare il traffico in uscita, dobbiamo per forza di cose bilanciare il traffico "per connessioni" e non per pacchetti altrimenti si potrebbero verificare delle sessioni spezzate, proprio perchè la maggior parte di applicativi ha bisogno di inizializzare, elaborare e terminare una sessione sempre con la stessa connettività, per cui bisogna far in modo che ogni sessione inizi e termini sempre con la stessa connettivita, come per esempio connessioni del tipo SSH, Telnet, Ftp, https e molte altre.
Per fare tutto ciò bisogna applicare delle regole di firewall, unire le sessioni e in seguito instradarle.
Ipotizziamo che le connessioni abbiano questi IP:
10.111.0.1 la prima connettività su interfaccia ether1
10.112.0.1 la seconda connettività su interfaccia ether2
Eseguiamo i seguenti passaggi:
/ ip address
add address=192.168.0.1/24 network=192.168.0.0 broadcast=192.168.0.255 interface=ether3
add address=10.111.0.2/24 network=10.111.0.0 broadcast=10.111.0.255 interface=ether1
add address=10.112.0.2/24 network=10.112.0.0 broadcast=10.112.0.255 interface=ether2
Dove nel nostro caso l'interfaccia ether1 e ether2 sono interconnesse ad un router xDSL, metre l'interfaccia ether3 è correttamente configurata per ricevere richiesta di connettività dai client.
A questo punto iniziamo ad impostare le regole firewall:
-Applicheremo due regole che andranno a marcare le connessioni in ingresso (come di seguito)
/ ip firewall mangle
add chain=input in-interface=ether1 action=mark-connection new-connection-mark=ether1_conn
add chain=input in-interface=ether2 action=mark-connection new-connection-mark=ether2_conn
-Poi applicheremo queste altre due regole in modo che i pacchetti arrivati da una singola connessione escano su internet dalla stessa connessione (come di seguito)
add chain=output connection-mark=ether1_conn action=mark-routing new-routing-mark=to_ether1
add chain=output connection-mark=ether2_conn action=mark-routing new-routing-mark=to_ether2
-Realizziamo un'altra regola che fa in modo che i pacchetti destinati ad ogni singola interfaccia non si instradino in una subnet sbagliata (come di seguito)
add chain=prerouting dst-address=10.111.0.0/24 action=accept in-interface=ether3
add chain=prerouting dst-address=10.112.0.0/24 action=accept in-interface=ether3
-Adesso entriamo nel cuore vero e proprio bilanciamento, facendo in modo che tutto il traffico non destinato al nostro concentratore (per cui destinato verso internet) venga quindi marcato per connessione utilizzando il sistema PCC: Acronimo di "per connection classifier"
add chain=prerouting dst-address-type=!local in-interface=ether3 per-connection-classifier=both-addresses:
2/0 \ action=mark-connection new-connection-mark=ether1_conn passthrough=yes
add chain=prerouting dst-address-type=!local in-interface=ether3 per-connection-classifier=both-addresses:
2/1 \ action=mark-connection new-connection-mark=ether2_conn passthrough=yes
Dove in questo caso il valore 2/0 e 2/1 sta ad indicare il peso che si vuole dare ad ogni singola connessione, e nel nostro esempio la stiamo bilanciando allo stesso modo.
-Ma supponiamo che la connessione sull'interfaccia ether1 abbia un quantitativo di banda maggiore rispetto alla seconda connessione, faremo in modo quindi di mandare più traffico sulla prima connessione invece che sulla seconda, per cui imposteremo questa regola (come di seguito)
add chain=prerouting dst-address-type=!local in-interface=ether3 per-connection-classifier=both-addresses:
3/0 \ action=mark-connection new-connection-mark=ether1_conn passthrough=yes
add chain=prerouting dst-address-type=!local in-interface=ether3 per-connection-classifier=both-addresses:
3/1 \ action=mark-connection new-connection-mark=ether1_conn passthrough=yes
add chain=prerouting dst-address-type=!local in-interface=ether3 per-connection-classifier=both-addresses:
3/2 \ action=mark-connection new-connection-mark=ether2_conn passthrough=yes
Per l'appunto abbiamo diviso il traffico in tre flussi, un solo flusso destinato alla ether2, e due flussi destinati alla ether1
-Impostiamo il marcatore di routing in base al connection mark precedente
add chain=prerouting connection-mark=ether1_conn in-interface=ether3 action=mark-routing new-routing-
mark=to_ether1
add chain=prerouting connection-mark=ether2_conn in-interface=ether3 action=mark-routing new-routing-
mark=to_ether2
-Dopo di che imposteremo le rotte per i pacchetti marcati verso i due gateway
/ ip route
add dst-address=0.0.0.0/0 gateway=10.111.0.1 routing-mark=to_ether1 check-gateway=ping
add dst-address=0.0.0.0/0 gateway=10.112.0.1 routing-mark=to_ether2 check-gateway=ping
-Abilitiamo il faileover in modo da smistare la connessione sull'altro gateway in caso di mancato funzionamento
add dst-address=0.0.0.0/0 gateway=10.111.0.1 distance=1 check-gateway=ping
add dst-address=0.0.0.0/0 gateway=10.112.0.1 distance=1 check-gateway=ping
-Nattiamo le connessioni in uscita su entrambe le interfaccie
/ ip firewall nat
add chain=srcnat out-interface=ether1 action=masquerade
add chain=srcnat out-interface=ether2 action=masquerade
Con questa serie di regole applicate saremo sicuri di utilizzare entrambe le connessione in uscita verso internet e di bilanciare il traffico in base alla propria preferenza.
P.S: Questa guida è stata realizzata prendendo in considerazione un articolo presente sul wiki ufficiale mikrotik.