Balanceamento entre links com Mikrotik
March 19th, 2010

Existem duas técnicas bastante utilizadas para balancemanetos entre links, o ECMP (Equal Cost Multi-Path) e o PCC (per-connection-classifier), em se tratando de mikrotik. No PCC ocorre a divisão em igual fluxo a partir de parâmetros pré-definidos, como src-address, src-port, dst-address, dst-port. Ou seja, o PCC torna-se ótimo para balanceamento e alta disponibilidade em cenários onde há preocupação em manter sessões a partir de origem, como msn e tráfego SSL. Para esta técnica, disponível apenas a partir da versa 3.24 do RouterOs, os pacotes tem de retornar pela wan onde entraram, fazendo assim necessário a classificação do tráfego nas wan’s a partir das critérios definidos, forçando a sair pelo gateways onde as sessões estão persistentes. No ECMP os pacotes podem sair por wan’s diferentes das que entraram, apesar de mascarar uma única saída, a entrega dos pacotes continuará sendo a partir de diferentes gateways, não forçando que a entrega seja feito a partir de sua origem quando se estabeleceu a sessão. O ECMP possibilita a escabilidade de carga entre links, podendo definir que o maior link participe mais do balanceamento que outro, ou seja, entre 1 link com taxas de 3Mb/s e outro de 1Mb/s podemos definir o que o link 1 atue com 2/3 no balanceamento e o outro com 1/3 .
Cenário:
Dois links de igual tamanho:
Link1 : 192.168.1.254
Link2 : 192.168.2.254
Interfaces Wan Mikrotik:
ether2: 192.168.1.250
ether3: 192.168.2.250
Interface local Mikrotik :
ether1: 192.168.0.1
Técnicas:
;Definição de interfaces
/ ip address
add address=192.168.0.1/24 network=192.168.0.0 broadcast=192.168.0.255 interface=ether1
add address=192.168.1.250/24 network=192.168.1.0 broadcast=192.168.1.255 interface=ether2
add address=192.168.2.250/24 network=192.168.2.0 broadcast=192.168.2.255 interface=ether3
;Failover e definição de balanceamento 1:1 . Caso o check-gateway aponte falha em um gateway ele irá remover o gateway da listagem
/ ip route
add dst-address=0.0.0.0/0 gateway=192.168.1.254,192.168.2.254 check-gateway=ping
;Saídas dos pacotes pelas interfaces Nateado para os ip’s de respectivos
/ ip firewall nat
add chain=srcnat out-interface=ether2 action=masquerade
add chain=srcnat out-interface=ether3 action=masquerade
; Marcação de conexões e rotas para mascaramento da saída independente da origem, quem entra pela wan1 pode sair pela wan2
/ ip firewall mangle
add chain=input in-interface=ether2 action=mark-connection new-connection-mark=wlan1_conn
add chain=input in-interface=ether3 action=mark-connection new-connection-mark=wlan2_conn
add chain=output connection-mark=wlan1_conn action=mark-routing new-routing-mark=to_wla1
add chain=output connection-mark=wlan2_conn action=mark-routing new-routing-mark=to_wla2
/ ip route
add dst-address=0.0.0.0/0 gateway=192.168.1.254 routing-mark=to_wla1
add dst-address=0.0.0.0/0 gateway=192.168.2.254 routing-mark=to_wla2
PCC
;Definição de interfaces
/ ip address
add address=192.168.0.1/24 network=192.168.0.0 broadcast=192.168.0.255 interface=ether1
add address=192.168.1.250/24 network=192.168.1.0 broadcast=192.168.1.255 interface=ether2
add address=192.168.2.250/24 network=192.168.2.0 broadcast=192.168.2.255 interface=ether3
;Marcar as conexões de entrada para que saiam pela interface que entrou
/ Ip firewall mangle
add chain=input in-interface=ether2 action=mark-connection new-connection-mark=wlan1_conn add chain=input in-interface=ether2 action=mark-connection new-connection-mark=wlan1_conn
add chain=input in-interface=ether3 action=mark-connection new-connection-mark=wlan2_conn add chain = input in-interface=ether3 action=mark-connection new-connection-mark=wlan2_conn
; Marcação de saída no roteador para encaminhamento adequado
add chain=output connection-mark=wlan1_conn action=mark-routing new-routing-mark=to_wlan1
add chain=output connection-mark=wlan2_conn action=mark-routing new-routing-mark=to_wlan2
; Através da política de roteamento forçaremos as saídas pelos respectivos gateways.
add chain=prerouting dst-address=192.168.1.0/24 action=accept in-interface=ether1
add chain=prerouting dst-address=192.168.2.0/24 action=accept in-interface=ether1
; Iremos dividir em dois grupos para marcação de rotas para Internet a partir da política de roteamento, excluindo o tráfego local, já que o prerounting, na marcação, captura todo tráfego. Usaremos como critério de balanceamento e distinção entre sessões de rotas “source and destination addressees”
add chain=prerouting dst-address-type=!local in-interface=ether1 per-connection-classifier=both-addresses:2/0 \
action=mark-connection new-connection-mark=wlan1_conn passthrough=yes
add chain=prerouting dst-address-type=!local in-interface=ether1 per-connection-classifier=both-addresses:2/1 \
action=mark-connection new-connection-mark=wlan2_conn passthrough=yes
; Marcação dos pacotes oriundas das conexões já marcadas
add chain=prerouting connection-mark=wlan1_conn in-interface=ether1 action=mark-routing new-routing-mark=to_wlan1
add chain=prerouting connection-mark=wlan2_conn in-interface=ether1 action=mark-routing new-routing-mark=to_wlan2
; Criando rota para cada marcação
/ ip route
add dst-address=0.0.0.0/0 gateway=192.168.1.254 routing-mark=to_wlan1 check-gateway=ping
add dst-address=0.0.0.0/0 gateway=192.168.2.254 routing-mark=to_wlan2 check-gateway=ping
; Habilitando Failover
add dst-address=0.0.0.0/0 gateway=192.168.1.254 distance=1 check-gateway=ping
add dst-address=0.0.0.0/0 gateway=192.168.2.254 distance=2 check-gateway=ping
; Mascararemos o tráfego para saída a partir das devidas interfaces, de acordo o ip de origem
/ ip firewall nat
add chain=srcnat out-interface=ether2 action=masquerade
add chain=srcnat out-interface=ether3 action=masquerade
[ De volta ao topo ]



