Discuta este tópico no fórum

Se este conteúdo te ajudou, deixe um presente!

sexta-feira, 5 de dezembro de 2014

OpenWRT: Balanceamento e redundância da sua conexão internet com mwan3

No passado, já escrevi sobre como fazer o balanceamento no OpenWRT utilizando o pacote multiwan. Porém, na nova versão BB foi disponibilizado uma nova solução, o mwan3, que permite um melhor gerenciamento de suas conexões, além de resolver alguns problemas da solução anterior como a impossibilidade de encaminhamento de portas.

Múltiplas conexões com a internet servem para duas funções. A primeira é manter o acesso com a internet mesmo que um dos provedores tenha algum problema (claro, opte por provedores independentes). Fora a redundância da sua conexão internet, você pode balancear o uso da internet entre as duas conexões, praticamente somando a velocidade disponibilizada.

Hoje, contratar uma nova conexão é barato, ficar sem internet é caro. A disponibilidade de mais de uma conexão com internet é fundamental para um negócio que dependa da internet. Além disto, mesmo em residências, estamos cada vez mais dispondo de múltiplas conexões com a internet. Provavelmente você tem um celular com 3G que pode compartilhar a internet, talvez um modem 3G ou mesmo utilizar a internet do vizinho (sempre pedindo autorização).

Existem soluções prontas no mercado para realizar esta tarefa. Contudo, neste post vamos utilizar um roteador com OpenWRT para realizar esta tarefa (e creio que com mais versatilidade do que qualquer outra solução).

O primeiro passo é instalar as suas múltiplas conexões internet no seu roteador. Você pode utilizar VLAN e transformar uma porta LAN em uma WAN2, conectar um 3G, ou acessar uma outra rede WIFI, seja ela do seu vizinho ou a internet compartilhada do seu celular. Claro, teste se ela está funcionando utilizando cada conexão com a internet isoladamente.

E se eu conectar as duas ao mesmo tempo? O roteador vai se perder? Não, existe um campo na configuração da interface, em avançado, onde você especifica a métrica da sua conexão. A métrica é o custo de usar a conexão. Desta forma, a conexão que estiver com a menor métrica será usada. Por padrão, este valor não está definido. Se for o mesmo valor ou não definido, ainda assim o roteador ainda vai escolher uma delas. Contudo, a definição da métrica é necessária para fazer o mwan3 funcionar.

Então só definir a métrica e terei redundância (mas não balanceamento)? Não é tão fácil assim. A conexão com a menor métrica será usada enquanto a interface relacionada a esta estiver levantada. Porém, a sua conexão internet pode cair sem que a sua interface seja derrubada. Ela só cairá sozinha se o cabo da WAN for desconectado ou o equipamento em que a conexão WAN estiver for desligado. Normalmente não é o que acontece. O mais comum é que seu equipamento está ligado e você não tem conectividade. Para gerenciar isto entra o mwan3.

O mwan3 monitora as suas conexões com a internet através de PING para verificar se esta está operando. Caso falhe, ela será desativada e os novos pedidos de conexões não irão mais utilizá-la. Enquanto estiver desativada, o mwan3 verifica repetidamente se ela voltou a operar. Caso detecte que está tudo bem, a sua conexão volta a operar junto com as demais.

Para balancear a carga, cada novo pedido de conexão pode ser atendido por uma das conexões WAN disponíveis. A escolha é aleatória (não é um Round-Robin), podendo utilizar um peso para aumentar a probabilidade de utilizar uma das conexões. Quanto mais clientes (pedidos de conexão) forem gerenciadas, maior a probabilidade do número de pedidos de conexão de cada WAN se aproximar do configurado e maior a probabilidade dos canais estarem distribuídos.

Instalação do mwan3


O pacote do mwan3 pode ser instalado tanto pelo modo texto como pela interface Luci. Você também pode instalar o módulo do Luci para configurar o mwan3 sem precisar do modo texto. Instale:

* mwan3
* luci-app-mwan3 (somente se for usar via interface Luci)

Configuração do mwan3


O mwan3 permite configurações muito mais avançadas do que o multiwan. Para permitir esta gama maior de cenários, o mwan3 utiliza algumas abstrações:

Interfaces


São mapeamentos 1 para 1 das interfaces WAN do OpenWRT (que já são abstrações das interfaces físicas). A interface do mwan3 serve apenas para adicionar mais campos à interface do OpenWRT, como as informações referentes a checagem da sua conexão internet.

Para adicionar uma nova interface, você pode ir no Luci em "Network/Load balancing/Configuration/Interfaces" e adicionar no campo ao final da página. O nome deve ser o mesmo utilizado na interface do OpenWRT (lembre-se, é um mapeamento). Além disto, a interface já deve ter alguma métrica definida (ainda em "Network/Interfaces" e não no mwan3) e possuir rota padrão (definida na configuração estaticamente ou via DHCP).

Ao adicionar a interface wman3, você deve escolher qual endereço na internet será utilizado para verificar que a sua conexão está funcionando. O normal é usar os DNS do Google (8.8.8.8, 8.8.4.4) mas recomendo adicionar no mínimo mais uns dois extra pois o Google aprontou ano passado. O resto é configuração de ajuste, como o "Tracking reliability", que define quantos dos endereço listados devem responder ao PING para considerar que a conexão está funcionando.

Adicione uma interface para cada interface WAN que você deseja balancear. Ex: tenho duas interfaces WAN: wan e wan3g. Elas devem estar funcionado e com uma métrica definida antes mesmo de iniciar a configuração do mwan3. Eu devo criar duas interfaces com exatamente o mesmo nome no mwan3: wan e wan3g. Em cada uma destas, devo configurar um ou mais endereços para verificar a conectividade.

Se preferir editar o arquivo de configuração diretamente, pode fazê-lo pelo modo texto (SSH, em /etc/config/mwan3) ou mesmo pelo Luci em "Network/Load balancing/Advanced/MWAN Config":

config interface 'wan'
   option enabled '1'
   list track_ip '8.8.4.4'
   list track_ip '8.8.8.8'
   option reliability '1'
   option count '1'
   option timeout '2'
   option interval '5'
   option down '3'
   option up '8'

config interface 'wan3g'
   option enabled '1'
   list track_ip '8.8.4.4'
   list track_ip '8.8.8.8'
   option reliability '1'
   option count '1'
   option timeout '2'
   option interval '5'
   option down '3'

   option up '8'

Members (Membros)


Membros são um segundo mapeamento das interfaces do mwan3 para adicionar duas novas informações: métrica e peso. Diferente do caso do item anterior onde uma interface OpenWRT mapeava uma interface MWAN3, este é um mapeamento de 1 (interface MWAN3) para 1 ou mais (membro) pois assim podemos ter valores distintos para uma mesma interface em situações distintas.

Para adicionar uma nova interface, você pode ir no Luci em "Network/Load balancing/Configuration/Members". Os nomes são livres mas devem ser diferentes das interfaces. A sugestão é utilizar o formato: <interface>_m<métrica> _w<peso>. Ex:

  • wan_m1_w3
  • wan_m2_w3
  • wan_m1_w4
  • wan_m2_w4
  • wan3g_m1_w3
  • wan3g_m2_w3
  • wan3g_m1_w4
  • wan3g_m2_w4

Desta forma, já pelo nome, é possível identificar o que foi configurado no membro (interface, métrica e peso). Ao criar o membro, selecione a interface mwan3 desejada, a métrica e o peso.

A métrica no membro representa uma informação similar ao que representa a métrica da interface do OpenWRT. Caso esteja disponível mais de um membro para a mesma situação, ele selecionará a interface do membro que tem a menor métrica. Porém, existe uma diferença em relação a métrica da interface. No membro, caso a métrica seja a mesma, o mwan3 vai fazer o balanceamento e não escolher apenas uma das interfaces.

E o peso? Na situação onde o mwan3 está fazendo o balanceamento (existe mais de um membro operacional com a mesma métrica e esta é a menor do conjunto), ele dividirá as conexões em função do peso. Se um membro usar o peso 3 e outro o peso 2 enquanto estiverem balanceando as conexões, 3/5 serão antedidas pelo primeiro membro e 2/5 pelo segundo (5 da soma de 3 e 2). Se for igual, será dividido de forma igual. Com isto você pode ajustar o uso das conexões em função da capacidade de cada conexão. Ex:
  • wan_m1_w3
  • wan3g_m1_w3
Balanceará entre as duas conexões wan e wan3g de maneira uniforme.
  • wan_m1_w3
  • wan3g_m1_w1
Balanceará entre as duas conexões wan e wan3g, sendo que 3/4 das conexões utilizarão wan e 1/4 a wan3g.
  • wan_m1_w3
  • wan3g_m2_w2
Utilizará a wan enquanto estiver no ar. Quando esta estiver indisponível, a wan3g será utilizada. O peso não influencia.

Se preferir editar diretamente o arquivo, é no mesmo local da interface:

config member 'wan_m1_w3'
   option interface 'wan'
   option metric '1'
   option weight '3'

config member 'wan_m2_w3'
   option interface 'wan'
   option metric '2'
   option weight '3' 

config member 'wan3g_m1_w3'
   option interface 'wan3g'
   option metric '1'
   option weight '3'

config member 'wan3g_m2_w3'
   option interface 'wan3g'
   option metric '2'
   option weight '3'

Policies (Políticas)


As políticas são agrupamentos de membros. Seria o mais próximo de uma tabela de roteamento. Dentro das políticas, as métricas e pesos dos membros serão utilizados para definir por qual interface a conexão irá utilizar. Normalmente é criada uma política para cada uma das situações:

  • Usar exclusivamente cada interface;
  • Usar uma interface preferencialmente e outra caso a primeira falhe;
  • Balancear a carga entre as interfaces.

Novamente, os nomes não devem colidir com os nomes das interfaces e dos membros. Ex:

  • somente_wan           (política)
    • wan_m1_w3    (membro)
  • somente_wan3g
    • wan3g_m1_w3
  • wan_wan3g
    • wan_m1_w3
    • wan3g_m2_w3
  • wan3g_wan
    • wan_m2_w3
    • wan3g_m1_w3
  • balanceado
    • wan_m1_w3
    • wan3g_m1_w3

A ordem dos membros não importa. O que importa é a métrica definida no membro e, onde esta for igual, o seu peso relativo.

Para adicionar uma política pela interface Luci, vá em "Network/Load balancing/Configuration/Policies". Após adicionar uma nova política, você deve adicionar os membros desejados. Também é dado a opção de selecionar qual o comportamento em último caso (quando todas as interfaces dos membros desta política estiverem inoperantes). Pode-se optar rejeitar a conexão (reject - o usuário tem resposta imediata), descartar (drop - a conexão do usuário falhará por estouro de tempo) ou usar a rota padrão do sistema. Se não for especificado, o comportamento será o reject.

Para configurar as políticas diretamente no arquivo, é o mesmo das demais configurações:

config policy 'balanceado'
   list use_member 'wan_m1_w3'
   list use_member 'wan3g_m1_w3'
   option last_resort 'unreachable'

config policy 'wan3g_wan'
   list use_member 'wan_m2_w3'
   list use_member 'wan3g_m1_w3'
   option last_resort 'unreachable'

config policy 'wan_wan3g'
   list use_member 'wan_m1_w3'
   list use_member 'wan3g_m2_w3'
   option last_resort 'unreachable'

config policy 'somente_wan'
   list use_member 'wan_m1_w3'
   option last_resort 'unreachable'

config policy 'somente_wan3g'
   list use_member 'wan3g_m1_w3'
   option last_resort 'unreachable'

Rules (Regras)


Enfim, o último passo. As políticas definidas anteriormente devem ser chamadas segundo alguma regra, que pode ser baseada nos endereços e portas de origem e destino ou mesmo no protocolo (que você normalmente vai se limitar em TCP ou UDP).

As regras podem ser definidas pela interface Luci, vá em "Network/Load balancing/Configuration/Rules". Você deve definir um nome único (não utilizado por outros objetos), os critérios para selecionar o tráfego e qual política será aplicada a este tráfego. O mais comum é utilizar o balanceamento para tudo exceto o que deve manter o IP durante a sessão. Um exemplo onde deve-se preservar o IP externo são páginas de bancos. Como boa prática, deve-se preservar o endereço externo para todo tráfego HTTPS. Para estes casos, pode-se utilizar o endereço do cliente para balancear as conexões. Uma boa dica para balancear entre duas conexões é usar o último bit do endereço IP, que dividirá os clientes entre os com endereço IP terminando em par ou ímpar.

Diferentemente dos demais itens de configuração, as regras possuem ordem. Caso o tráfego case com uma delas, ele não será validado pela próxima. Assim, deve-se colocar as regras mais específicas antes da mais genéricas e uma global, que case com todo o tráfego, ao final. Ex:

  • cliente_par_https
    • origem 0.0.0.0/0.0.0.1
    • protocolo tcp
    • porta 443,8443
    • política wan_wan3g
  • cliente_impar_https
    • origem 0.0.0.1/0.0.0.1
    • protocolo tcp
    • porta 443,8443
    • política wan3g_wan
  • padrao
    • origem 0.0.0.0/0.0.0.0
    • política balanceado

Para configurar as políticas diretamente no arquivo, é o mesmo das demais configurações:

config rule 'cliente_par_https'
  option src_ip '0.0.0.0/0.0.0.1'
  option proto 'tcp'
  option use_policy 'wan_wan3g'
  option dest_port '443,8443'

config rule 'cliente_impar_https'
  option src_ip '0.0.0.1/0.0.0.1'
  option proto 'tcp'
  option use_policy 'wan_wan3g'
  option dest_port '443,8443'

config rule 'padrao'
  option dest_ip '0.0.0.0/0'
  option use_policy 'balanceado'

Caso tenha necessidade que algum cliente ou destino específico saia somente por um endereço (ex: uma aplicação remota liberara apenas para o seu endereço da internet), basta adicionar uma regra acima das demais. Também fixar a saída em apenas uma conexão pode ser uma estratégia interessante para isolar possíveis problemas de uma aplicação quando se suspeita que a causa seja o balanceamento.





A solução mwan3 possibilita ajustar o balanceamento a quase qualquer situação, inclusive melhor do que outros produtos de mercado. Além disto, ao utilizar um equipamento de uso geral, o custo também deve ser inferior as soluções dedicadas. De fato, mesmo as soluções dedicadas não utilizam um hardware muito diferente de um roteador geral. Em muitos casos, é apenas um software diferente.

Já estou usando o mwan3 sem problemas faz algum tempo. Mas podem aparecer algumas questões como "Meu download não duplicou, ficou no mesmo". Sim, qualquer solução baseada em NAT faz o balanceamento por conexão. Um download único não vai conseguir utilizar mais do que uma das WAN. Para utilizar as duas, você precisaria fazer dois downloads em paralelo (ou usar um gerenciador de download que baixe o arquivo por múltiplas conexões - alguém lembrou do GetRight?). Mesmo assim, a escolha da WAN é aleatória e pode ser que você tenha o "azar" de sair nas duas conexões pelo mesmo canal. Se estiver baixando de um HTTPS (cada vez mais comum) e você seguiu as configurações sugeridas aqui, você sempre vai sair pela mesma conexão a partir do mesmo computador e, sim, não vai utilizar mais do que uma WAN em um download, neste caso mesmo que use um gerenciador de download. E torrent? Vai funcionar perfeitamente! Seu download provavelmente se aproximará da soma das duas WAN pois o torrent utiliza diversas conexões em paralelo.

Alguma solução para não usar NAT? IPv6. Mas as Telecoms no Brasil estão meio atrasadas. Era para todos terem IPv6 em janeiro de 2014. Quem sabe em um futuro, quando todos estiverem com IPv6 e terem uma faixa de endereços própria (que nem é previsto), podemos buscar uma solução melhor.

Para finalizar, se você é daqueles que desmontava o relógio para saber como ele funcionava, o mwan3 é bem interessante. Olhe em:

  • iptables -t mangle -L
  • ip rule show
  • ip route show table 1
  • ip route show table 2
  • ip route show table 3
  • ...
  • ip route show table N (até que retorne uma tabela em branco)

O mwan3 usa as interfaces ativas e as métricas para construir as regras do iptables e as tabelas no ip route. A tabela mangle do iptables é utilizada para marcar os pacotes (onde são usados as regras e pesos). Cada marca representa uma interface de saída. Esta marcação é usada nas regras do "ip rule", que escolhe uma tabela de roteamento para cada marca. Tudo é ajustado caso alguma interface com menor métrica se torne operante ou deixe de funcionar.

Até a próxima.