Load Balance no Mikrotik usando PCC, Detalhado e Explicado
Autor: Luiz Claudio Martins Maia
Bacharel em Ciência da Computação, CESUPA – lcm@lcmm.info
Abstract: This document demonstrates how to configure a load balancing (Load Balance), ip or port oriented in mikrotik 3:30 through two or more links.
Palavras-chave: Mikrotik; Load Balance; PCC.
1. Introdução
O objetivo deste documento e demonstrar como configurar um balanceamento de carga entre múltiplos links, utilizando PCC no mikrotik.Existem algumas formas de balancear links, porém existem também algumas complicações com alguns deles, um exemplo é o ECMP, no qual por padrão o kernel linux limpa a tabela de roteamento de 10 em 10 minutos em média, forçando a perda de conexão em aplicações “keep_alive”.
O PCC ou “per connection classifier”, marca os pacotes para que os mesmos sejam direcionados para o gateway certo, com isso a conexão ficará pertinente à certo gateway.
2. Cenário

Ether1 – Lan 10.10.10.0/24
Ether3 – Wan Embratel (router + 4 modems PPP) / Link 8 Mb/s
Ether4 – Wan OI (router+2modems PPP)/ Link 4 Mb/s
3. Regras para os Impacientes
/ip firewall mangle
add action=accept chain=output comment=”Sem Balance” disabled=no dst-address-list=SemBalance
add action=accept chain=prerouting comment=”" disabled=no dst-address=200.200.200.200/29 in-interface=ether1
add action=accept chain=prerouting comment=”" disabled=no dst-address=222.222.222.222/28 in-interface=ether1
add action=mark-connection chain=input comment=”____________Inicio Conf PCC (Load Balance) ————— Marca Conexoes de entrada para que voltem pelo mesmo link” disabled=no in-interface=ether3 new-connection-mark=EBT_conn passthrough=yes
add action=mark-connection chain=input comment=”" disabled=no in-interface=ether4 new-connection-mark=OI_conn passthrough=yes
add action=mark-connection chain=output comment=”Load Balance Proxy” connection-state=new disabled=no dst-address=!10.10.10.0/24 new-connection-mark=EBT_conn passthrough=yes per-connection-classifier=both-addresses:3/0
add action=mark-connection chain=output comment=”" connection-state=new disabled=no dst-address=!10.10.10.0/24 new-connection-mark=EBT_conn passthrough=yes per-connection-classifier=both-addresses:3/1
add action=mark-connection chain=output comment=”" connection-state=new disabled=no dst-address=!10.10.10.0/24 new-connection-mark=OI_conn passthrough=yes per-connection-classifier=both-addresses:3/2
add action=mark-routing chain=output comment=”Retorna as conexoes marcadas no inicio, pelo mesmo link que entraram” connection-mark=EBT_conn disabled=no new-routing-mark=EBT_traffic passthrough=yes
add action=mark-routing chain=output comment=”" connection-mark=OI_conn disabled=no new-routing-mark=OI_traffic passthrough=yes
add action=mark-connection chain=prerouting comment=”Load Balance (PCC), para os dois links (OI e EBT) sendo um peso maior o link da EBT por causa da velocidade maior” disabled=no dst-address-type=!local in-interface=ether1 new-connection-mark=EBT_conn passthrough=yes per-connection-classifier=both-addresses:3/0
add action=mark-connection chain=prerouting comment=”" disabled=no dst-address-type=!local in-interface=ether1 new-connection-mark=EBT_conn passthrough=yes per-connection-classifier=both-addresses:3/1
add action=mark-connection chain=prerouting comment=”" disabled=no dst-address-type=!local in-interface=ether1 new-connection-mark=OI_conn passthrough=yes per-connection-classifier=both-addresses:3/2
add action=mark-routing chain=prerouting comment=”Aponta as conexoes do load balance para as novas tabelas de roteamento, possibilitando o Load Balance(PCC)” connection-mark=EBT_conn disabled=no in-interface=ether1 new-routing-mark=EBT_traffic passthrough=yes
add action=mark-routing chain=prerouting comment=”____________FIM Load Balance (PCC)” connection-mark=OI_conn disabled=no in-interface=ether1 new-routing-mark=OI_traffic passthrough=yes
/ip route
add comment=”Rota Saida Principal EBT sem Load Balance” disabled=no distance=2 dst-address=0.0.0.0/0 gateway=222.222.222.222 scope=30 \
target-scope=10
add comment=”Rota saida OI sem Load Balance” disabled=no distance=3 dst-address=0.0.0.0/0 gateway=200.200.200.200 scope=30 \
target-scope=10
add comment=”Rota saida OI para Load Balance” disabled=no distance=1 dst-address=0.0.0.0/0 gateway= 200.200.200.200 routing-mark=\
OI_traffic scope=30 target-scope=10
add comment=”Rota Saida EBT para Load Balance” disabled=no distance=1 dst-address=0.0.0.0/0 gateway= 222.222.222.222 routing-mark=\
EBT_traffic scope=30 target-scope=10
add comment=”Rota para Rede interna” disabled=no distance=1 dst-address=10.10.10.0/24 gateway=10.10.10.1 scope=30 target-scope=10
/ip firewall nat
add action=masquerade chain=srcnat comment=”Mascaramento Link EBT” disabled=no out-interface=ether3
add action=masquerade chain=srcnat comment=”Mascaramento Link OI” disabled=no out-interface=ether4
4. Explicação das Regras
/ip firewall mangle
add action=accept chain=output comment=”Sem Balance” disabled=no dst-address-list=SemBalance
A regra acima cria uma address list para cadastrar ips que você queira que saia pela rota default e não pelo balanceamento.
/ip firewall mangleÉ necessário “remover” do balanceamento as redes que estão conectadas diretamente ao mikrotik, neste caso meus dois links: 200.200.200.200/29 e 222.222.222.222/28, para que não sejam balanceados entre si!
add action=accept chain=prerouting comment=”" disabled=no dst-address=200.200.200.200/29 in-interface=ether1
add action=accept chain=prerouting comment=”" disabled=no dst-address=222.222.222.222/28 in-interface=ether1
/ip firewall mangleEsta regra serve para marcar os pacotes que estão entrando, para que os mesmos saiam pelo link que entraram, ou seja, caso seja estabelecia uma conexão entrante no link da oi com destino, por exemplo, ao meu servidor web, esta será marcada como “OI_conn”, e nas próximas regras será direcionado para a saída correta que é a interface ether4.
add action=mark-connection chain=input comment=”____________Inicio Conf PCC (Load Balance) ————— Marca Conexoes de entrada para que voltem pelo mesmo link” disabled=no in-interface=ether3 new-connection-mark=EBT_conn passthrough=yes
add action=mark-connection chain=input comment=”" disabled=no in-interface=ether4 new-connection-mark=OI_conn passthrough=yes
/ip firewall mangle
add action=mark-connection chain=output comment=”Load Balance Proxy” connection-state=new disabled=no dst-address=!10.10.10.0/24 new-connection-mark=EBT_conn passthrough=yes per-connection-classifier=both-addresses:3/0
add action=mark-connection chain=output comment=”" connection-state=new disabled=no dst-address=!10.10.10.0/24 new-connection-mark=EBT_conn passthrough=yes per-connection-classifier=both-addresses:3/1
add action=mark-connection chain=output comment=”" connection-state=new disabled=no dst-address=!10.10.10.0/24 new-connection-mark=OI_conn passthrough=yes per-connection-classifier=both-addresses:3/2
Essas 3 regras só se aplicam se você tiver na mesma maquina o PCC e o Web-Proxy ativado, é ai que a mágica começa, a opção “per-connection-classifier” é o PCC, no qual você deve subdividir seu link, no meu caso tenho um de 8 Mb e um de 4Mb, ou seja, para não subutilizar o meu link de 8 Mb, devo colocar 2 vezes para o de 8 Mb (EBT_conn) e um para o de 4Mb (OI_conn).
/ip firewall mangleNas duas regras acima, nos asseguramos que os pacotes que entraram pelos links OI e EBT e que foram marcados como OI_conn e EBT_conn saiam pela interface correta, ou seja, a interface que eles entraram, para isso é necessário criar uma tabela de roteamento para cada um dos links, descritos nas regras como OI_traffic e EBT_traffic, logo abaixo adicionaremos as rotas para essas tabelas.
add action=mark-routing chain=output comment=”Retorna as conexoes marcadas no inicio, pelo mesmo link que entraram” connection-mark=EBT_conn disabled=no new-routing-mark=EBT_traffic passthrough=yes
add action=mark-routing chain=output comment=”" connection-mark=OI_conn disabled=no new-routing-mark=OI_traffic passthrough=yes
/ip firewall mangleEssas 3 regras fazem o Load Balance das conexões que estão passando pelo mikrotik (FORWARD), funcionam da mesma forma que as regras para o balanceamento do proxy, a diferença é o “chain”, pois as 3 primeiras que são do proxy, especificamos como “OUTPUT” e neste caso pega o resto que nao se encaixam na primeira (FORWARD), lembrando que para nao subutilizar um dos links, por causa da diferença de velocidade, coloquei 2 vezes o link EBT por ter o dobro da velocidade do link OI.
add action=mark-connection chain=prerouting comment=”Load Balance (PCC), para os dois links (OI e EBT) sendo um peso maior o link da EBT por causa da velocidade maior” disabled=no dst-address-type=!local in-interface=ether1 new-connection-mark=EBT_conn passthrough=yes per-connection-classifier=both-addresses:3/0
add action=mark-connection chain=prerouting comment=”" disabled=no dst-address-type=!local in-interface=ether1 new-connection-mark=EBT_conn passthrough=yes per-connection-classifier=both-addresses:3/1
add action=mark-connection chain=prerouting comment=”" disabled=no dst-address-type=!local in-interface=ether1 new-connection-mark=OI_conn passthrough=yes per-connection-classifier=both-addresses:3/2
/ip firewall mangleEssas duas últimas regras encaminham o tráfego que foi marcado(balanceado) nas regras acima para suas tabelas de roteamento correspondentes.
add action=mark-routing chain=prerouting comment=”Aponta as conexoes do load balance para as novas tabelas de roteamento, possibilitando o Load Balance(PCC)” connection-mark=EBT_conn disabled=no in-interface=ether1 new-routing-mark=EBT_traffic passthrough=yes
add action=mark-routing chain=prerouting comment=”____________FIM Load Balance (PCC)” connection-mark=OI_conn disabled=no in-interface=ether1 new-routing-mark=OI_traffic passthrough=yes
/ip routeAs regras acima criam as tabelas de roteamento necessárias para o funcionamento do PCC Load Balance, as duas primeiras são rotas estáticas para os ips que não irão utilizar o PCC, as duas seguintes dizem que os pacotes marcados como OI_traffic e EBT_traffic devem sair pelo gateway do qual entraram para não ter perda de conexão. A ultima é a rota para a rede interna.
add comment=”Rota Saida Principal EBT sem Load Balance” disabled=no distance=2 dst-address=0.0.0.0/0 gateway=222.222.222.222 scope=30 target-scope=10
add comment=”Rota saida OI sem Load Balance” disabled=no distance=3 dst-address=0.0.0.0/0 gateway=200.200.200.200 scope=30 target-scope=10
add comment=”Rota saida OI para Load Balance” disabled=no distance=1 dst-address=0.0.0.0/0 gateway= 200.200.200.200 routing-mark=OI_traffic scope=30 target-scope=10
add comment=”Rota Saida EBT para Load Balance” disabled=no distance=1 dst-address=0.0.0.0/0 gateway= 222.222.222.222 routing-mark=EBT_traffic scope=30 target-scope=10
add comment=”Rota para Rede interna” disabled=no distance=1 dst-address=10.10.10.0/24 gateway=10.10.10.1 scope=30 target-scope=10
add action=masquerade chain=srcnat comment=”Mascaramento Link EBT” disabled=no out-interface=ether3
add action=masquerade chain=srcnat comment=”Mascaramento Link OI” disabled=no out-interface=ether4
Essas regras são necessárioas para fazer o mascaramento para poder saira para internet.
Bom, espero com este artigo, ajudar as pessoas interessadas em implementar um bom balanceamento de carga no mikrotik. Este artigo ainda não está completo, existem informações importantes que quero colocar aqui, como o funcionamento do PCC e algumas dicas, mas ficará para outra hora.
Espero ter ajudado,
[]’s
Luiz Maia
Lcm