Balanceamento orientado por conexao, ECMP no Mikrotik
Introdução:
Já vi vários posts na internet mostrando como fazer o balanceamento de carga em dois ou mais links no mikrotik, mas todos os que eu vi ou deixam um dos links sem utilização somente como failover ou você tem que dividir as saídas por certos ips da sua rede interna.
Nenhum dos casos me agradou, à seguir vou mostrar como fazer um balanceamento de carga de uma forma eficaz sem subutilizar um dos links ou dividir sua rede, o mesmo é orientado à conexão, ou seja, sem problemas com msn..., “ECMP load balance” no mikrotik.
Cenário:
LAN: 192.168.0.1/24
WAN1: 172.16.10.10/32 – Link Embratel 2Mb
WAN2: 172.16.20.10/32 – Link OI 2Mb
IPS Mikrotik:
LAN: 192.168.0.1
WAN1:172.16.10.1
WAN2:172.16.20.1
IPS Routers:
WAN1: 172.16.10.10
WAN2:172.16.20.10
Regras para os impacientes:
/ip address
add address=192.168.0.1/24 broadcast=192.168.0.255 comment="LAN" disabled=no \
interface=ether2 network=192.168.0.0
add address=172.16.10.1/24 broadcast=172.16.10.255 comment="WAN1" disabled=no \
interface=ether3 network=172.16.10.0
add address=172.16.20.1/24 broadcast=172.16.20.255 comment="WAN2" disabled=no \
interface=ether1 network=172.16.20.0
/ ip route
add dst-address=0.0.0.0/0 gateway=172.16.10.10,172.16.20.10 check-gateway=ping
/ ip firewall nat
add chain=srcnat out-interface=WAN1 action=masquerade
add chain=srcnat out-interface=WAN2 action=masquerade
/ ip firewall mangle
add chain=input in-interface=WAN1 action=mark-connection new-connection-mark=wan1_conn
add chain=input in-interface=WAN2 action=mark-connection new-connection-mark=wan2_conn
add chain=output connection-mark=wan1_conn action=mark-routing new-routing-mark=to_wan1
add chain=output connection-mark=wan2_conn action=mark-routing new-routing-mark=to_wan2
/ ip route
add dst-address=0.0.0.0/0 gateway=172,16.10.10 routing-mark=to_wan1
add dst-address=0.0.0.0/0 gateway=172.16.20.10 routing-mark=to_wan2
Explicação:
-IP Address:
/ip address
add address=192.168.0.1/24 broadcast=192.168.0.255 comment="LAN" disabled=no \
interface=ether2 network=192.168.0.0
add address=172.16.10.10/24 broadcast=172.16.10.255 comment="WAN1" disabled=no \
interface=ether3 network=172.16.10.0
add address=172.16.20.10/24 broadcast=172.16.20.255 comment="WAN2" disabled=no \
interface=ether1 network=172.16.20.0
Neste trecho definimos os ips da interface local LAN (192.168.0.1/24) e os ips das interfaces externas WAN(172.16.10.1/24 e 172.16.20.1/24), claro, ips inválidos, adeque a sua necessidade!
-Routing:
/ ip route
add dst-address=0.0.0.0/0 gateway=172.16.10.10,172.16.20.10 check-gateway=ping
Aqui criamos uma rota tipica de ECMP (Equal Cost Multi-Path), com check-gateway. Por definição o ECMP é persistente por conexão, ou seja, se um cliente estabelece conexão pelo gateway 172.16.10.10, ele irá utilizar somente este gateway durante ESTA conexão. Assim que um dos links cair o check-gateway irá remove-lo da lista de gateway, com isso você terá um efeito failover de brinde :D .
você pode utilizar também links assimétricos, por exemplo, digamos que o link da OI seja de 4Mb e o da Embratel de 8Mb, sendo o da Embratel o dobro do link da OI, você pode fazer a rota da seguinte forma para não subutilizar um dos links:
/ ip route
add dst-address=0.0.0.0/0 gateway=172.16.20.10,172.16.10.10,172.16.10.10 check-gateway=ping
-NAT:
/ ip firewall nat
add chain=srcnat out-interface=wan1 action=masquerade
add chain=srcnat out-interface=wan2 action=masquerade
Como as rotas já foram decididas, só precisamos das regras para corrigir o src-address para os pacotes de saída, Se o pacote sair pela WAN1 será “NATeado” para 172.16.10.10/24, caso contrário será para 172.16.20.10/24.
-Conexões Entrantes:
/ ip firewall mangle
add chain=input in-interface=WAN1 action=mark-connection new-connection-mark=wan1_conn
add chain=input in-interface=wlan2 action=mark-connection new-connection-mark=wan2_conn
add chain=output connection-mark=wan1_conn action=mark-routing new-routing-mark=to_wan1
add chain=output connection-mark=wan1_conn action=mark-routing new-routing-mark=to_wan2
/ ip route
add dst-address=0.0.0.0/0 gateway=172.16.10.10 routing-mark=to_wan1
add dst-address=0.0.0.0/0 gateway=172.16.20.10 routing-mark=to_wan2
Imagine um pacote INPUT vindo pelo link da Oi e retornando pelo link da Embratel, com ip diferente não vai dar, para evitar isso, vamos avisar ao mikrotik que o pacote que for recebido pelo link1 deve ser retornado pelo mesmo link.
Conclusão:
O ECMP é uma boa forma de balancear múltiplos links no mikrotik, com a utilização dele não subutilizamos os links e conseguimos um failover caso um dos links caiam, ele bem configurado dificilmente dará problemas.
Existem alguns boatos que que o tempo de conexão do ECMP é de 10 min, até o momento não tive problemas com o msn nesta configuração, ja passei de 10 min! :D, pode ser sorte de sair pelo mesmo link, mas o certo e que o balanceamento está funcionando 100%, postarei mais impressões sobre esta implementação.
Se alguem tiver algo para adicionar, be my guest!
Fonte: Load Balance no Mikrotik usando ECMP e failover
Re: Balanceamento orientado por conexao, ECMP no Mikrotik
Amigos estou usando em um cliente o ECMP e até o momento esta balanceando tudo corretamente, porem só consigo acessar a porta 8291 por um link, olhem meu NAT:
Código :
/ip firewall nat
add action=masquerade chain=srcnat comment=MASCARAMENTO disabled=no out-interface=ether1
add action=masquerade chain=srcnat comment="" disabled=no out-interface=ether2
add action=masquerade chain=srcnat comment="" disabled=no src-address=10.0.0.0/8
add action=accept chain=dstnat comment="LIBERA ACESSO WINBOX" disabled=no dst-address=\
yyy.yyy.yyy.yyy dst-port=8291 protocol=tcp
add action=accept chain=dstnat comment="" disabled=no dst-address=xxx.xxx.xxx.xxx \
dst-port=8291 protocol=tcp
add action=dst-nat chain=dstnat comment=DMZ disabled=no dst-address=yyy.yyy.yyy.yyy \
protocol=tcp src-port=0-65535 to-addresses=10.1.1.2 to-ports=0-65535
add action=dst-nat chain=dstnat comment="" disabled=no dst-address=yyy.yyy.yyy.yyy \
protocol=udp src-port=0-65535 to-addresses=10.1.1.2 to-ports=0-65535
add action=dst-nat chain=dstnat comment="" disabled=no dst-address=xxx.xxx.xxx.xxx \
protocol=tcp src-port=0-65535 to-addresses=10.1.1.2 to-ports=0-65535
add action=dst-nat chain=dstnat comment="" disabled=no dst-address=xxx.xxx.xxx.xxx \
protocol=udp src-port=0-65535 to-addresses=10.1.1.2 to-ports=0-65535
Detalhe que primeiro fiz o mascaramento, depois aceitei a porta 8291 nos 2 IPs validos, e logo depois fiz a DMZ para o servidor Linux.
Eu acesso pelo ip yyy.yyy.yyy.yyy, mas pelo ip xxx.xxxx.xxx.xxx não vai....
Alguma ideia ??
Re: Balanceamento orientado por conexao, ECMP no Mikrotik
libera a porta do winbox no filter e nao no nat, ve se funciona!
Re: Balanceamento orientado por conexao, ECMP no Mikrotik
/ip firewall nat
add action=masquerade chain=srcnat comment=MASCARAMENTO disabled=no out-interface=ether1
add action=masquerade chain=srcnat comment="" disabled=no out-interface=ether2
add action=masquerade chain=srcnat comment="" disabled=no src-address=10.0.0.0/8
essas dua regras aqui em baixo, descarta ela
add action=accept chain=dstnat comment="LIBERA ACESSO WINBOX" disabled=no dst-address=\
yyy.yyy.yyy.yyy dst-port=8291 protocol=tcp
add action=accept chain=dstnat comment="" disabled=no dst-address=xxx.xxx.xxx.xxx \
dst-port=8291 protocol=tcp
tens uma dmz, logo estás redirecionado todas asportas para esse ip, inclusive a do mikrotik.
alem disso tens a mesma regras duas vezes.
add action=dst-nat chain=dstnat comment=DMZ disabled=no dst-address=yyy.yyy.yyy.yyy \
protocol=tcp src-port=0-65535 to-addresses=10.1.1.2 to-ports=0-65535
add action=dst-nat chain=dstnat comment="" disabled=no dst-address=yyy.yyy.yyy.yyy \
protocol=udp src-port=0-65535 to-addresses=10.1.1.2 to-ports=0-65535
add action=dst-nat chain=dstnat comment="" disabled=no dst-address=xxx.xxx.xxx.xxx \
protocol=tcp src-port=0-65535 to-addresses=10.1.1.2 to-ports=0-65535
add action=dst-nat chain=dstnat comment="" disabled=no dst-address=xxx.xxx.xxx.xxx \
protocol=udp src-port=0-65535 to-addresses=10.1.1.2 to-ports=0-65535
tente fazer a regra assim:
/ip firewall nat
add action=dst-nat chain=dstnat comment=DMZ disabled=no dst-address=yyy.yyy.yyy.yyy \
protocol=tcp src-port=!8291 to-addresses=10.1.1.2 to-ports=!8291
add action=dst-nat chain=dstnat comment=DMZ disabled=no dst-address=xxx.xxx.xxx.xxx \
protocol=tcp src-port=!8291 to-addresses=10.1.1.2 to-ports=!8291
clica na estrelinha pra agradecer
Re: Balanceamento orientado por conexao, ECMP no Mikrotik
Senhores, bom dia.. sei que o topico é meio antigo... porem me foi muito util...
Lendo a teoria e as informações sobre os varios tipos de balance, cheguei a conclusão que realmente o ECMP é o mais inteligente (opinião minha, quase um leigo), porem o flush da tabela realmente deixa qualquer um louco.... heheheh derruba msn, downloads, etc, etc, etc.... Alguem sabe se existe uma maneira de parametrizar isso? tipo aumentar o tempo? e se tiver, qual o problema que isso pode gerar?
Amplexos.
Re: Balanceamento orientado por conexao, ECMP no Mikrotik
Olá rfmedeiros,
na época dei uma boa pesquisada no assunto e descobri que é uma limitação do kernel *nix, podes tentar recompilar o kernel de um distro open e ver se funciona.
MAS, recomendo usares o PCC, ele bem configurado, não necessita de regras individuais para bancos e msn, realmente o PCC é show de bola!
Re: Balanceamento orientado por conexao, ECMP no Mikrotik
Rapaz! Coloquei aqui suas regras no meu servidor, esta funcionando filé, gostei.
Re: Balanceamento orientado por conexao, ECMP no Mikrotik
Citação:
Postado originalmente por
thiagotgc
Amigos estou usando em um cliente o ECMP e até o momento esta balanceando tudo corretamente, porem só consigo acessar a porta 8291 por um link, olhem meu NAT:
Código :
/ip firewall nat
add action=masquerade chain=srcnat comment=MASCARAMENTO disabled=no out-interface=ether1
add action=masquerade chain=srcnat comment="" disabled=no out-interface=ether2
add action=masquerade chain=srcnat comment="" disabled=no src-address=10.0.0.0/8
add action=accept chain=dstnat comment="LIBERA ACESSO WINBOX" disabled=no dst-address=\
yyy.yyy.yyy.yyy dst-port=8291 protocol=tcp
add action=accept chain=dstnat comment="" disabled=no dst-address=xxx.xxx.xxx.xxx \
dst-port=8291 protocol=tcp
add action=dst-nat chain=dstnat comment=DMZ disabled=no dst-address=yyy.yyy.yyy.yyy \
protocol=tcp src-port=0-65535 to-addresses=10.1.1.2 to-ports=0-65535
add action=dst-nat chain=dstnat comment="" disabled=no dst-address=yyy.yyy.yyy.yyy \
protocol=udp src-port=0-65535 to-addresses=10.1.1.2 to-ports=0-65535
add action=dst-nat chain=dstnat comment="" disabled=no dst-address=xxx.xxx.xxx.xxx \
protocol=tcp src-port=0-65535 to-addresses=10.1.1.2 to-ports=0-65535
add action=dst-nat chain=dstnat comment="" disabled=no dst-address=xxx.xxx.xxx.xxx \
protocol=udp src-port=0-65535 to-addresses=10.1.1.2 to-ports=0-65535
Detalhe que primeiro fiz o mascaramento, depois aceitei a porta 8291 nos 2 IPs validos, e logo depois fiz a DMZ para o servidor Linux.
Eu acesso pelo ip yyy.yyy.yyy.yyy, mas pelo ip xxx.xxxx.xxx.xxx não vai....
Alguma ideia ??
tambem estou com esse problema alguem sabe como resolver? pode me dar uma dica @lcmm84
Re: Balanceamento orientado por conexao, ECMP no Mikrotik
Amigos, não esqueçam, para quem usa modem roteado, deve ser feita a DMZ do modem para o MK, e só mente após isso, deve criar no MK a liberação para o 8291