Tem muita coisa sobre o assunto mas tanto o Bonding Driver quanto o Iproute 2 se mostram um tanto incompletos para a tarefa, então juntei ambos em uma solução muito simples e eficaz como reza o preceito da Escola Russa.
O balanceamento de links com o Iproute 2 tem alguns inconvenientes, quando a coisa entra no campo da alta disponibilidade dado ao fato que o cache de rotas é vinculado a cada uma das interfaces de rede lógicas, então faz-se necessário o emprego de scripts para testar o estado das conexões, excluir rotas inoperantes, limpar o cache e conforme o caso alterar marcas de pacotes, o resultado além de ser uma gambiara muito deselegante é pouco eficiente.
O Bonding Driver por sua vez é excelente no balanceamento e redundância, porém não é usado para manipular rotas, visto que trabalha unicamente na camada 2, semelhante as bridges, na verdade foi desenvolvido para aumentar a largura de banda de conexões de controle em Clusters Beowulf e o seu criador não pensava em aplica-lo para a finalidade que proponho.
A Necessidade
Durante um bom tempo empreguei o balanceamento de carga com Iproute 2 e marca de pacotes, desviando o tráfego por cada rota de acordo com a conveniência de cada cliente, mas de uns anos para cá o perfil de utilização da internet mudou muito.
A alguns anos eu atribuía uma marca para o tráfego podre (P2P, etc. Na verdade tudo) com uma exceção para o tráfego nobre (http, https e DNS), para que saísse pela rota default, a coisa as vezes mudava um pouco dependendo de número de links e tipos de serviço mas basicamente era a mesma coisa.
Mas o perfil de uso da internet mudou, e o que era nobre acabou apodrecendo, principalmente por conta do conteúdo dinâmico de sites como o Youtube que quase tornaram o bom e velho Squid obsoleto, sendo necessário o emprego de soluções de url rewriter que trabalham em conjunto com o Squid, tais como o Thundercache e o InComum (este último é excelente e muito fácil de implementar, venho usando ele a mais de 1 ano com muita satisfação! Recomendo! http://incomum.sourceforge.net).
Recentemente tive que rever a política de balanceamento de carga de um de meus clientes e deparei-me com os problemas que mencionei acima então resolvi contorná-lo com o emprego do iproute2 usando uma única interface de rede, o resultado foi sofrível.
Embora conceitualmente correto, e até funcionou muito bem em testes com máquinas virtuais, as causas não tive tempo nem recursos para avaliar. Até suspeito de alguma implementação em um de seus roteadores algo como um rp_filter ou algum mecanismo anti-spoof, mas não foi possível constatar visto que seus roteadores estão sob regime de comodato e não tenho acesso a eles.
Então parti para uma bridge agregando as interfaces de rede de saída, funcionou relativamente bem, entretanto a rede apresentava latência alta e alguma instabilidade quando o tráfego aumentava e a redundância não funcionou.
Foi aí que me ocorreu ao invés de empregar uma bridge empregar o Bonding Driver nativo do Kernel, afinal ele foi feito para isso! Para alegria de todos os resultados foram excelentes tanto para o balanceamento quanto para a redundância!
[3] Comentário enviado por m4sk4r4 em 19/07/2011 - 10:46h
Carlos,
Gostei muito do seu artigo.
Hoje eu tenho um ambiente com o iproute2, onde tenho dois links de operadoras de diferentes, em um eu deixo o acesso a internet e serviço de hospedagem e outro eu deixo só pra sair email, faço as marcações via iptables e uso iproute2 para direcionar a saída. Só que quando um dois links cai, para não ficar sem os serviços utilizados por aquele link que caiu eu tenho que rodar um script para direcionar todos os serviços parao outro link que esta ativo, ou seja, existe um processo mecânico, e o que me parece que eu possa melhorar o meu ambiente através desse seu artigo, onde ficaria transparente o estado down de cada link.
É pergunta é, o bonding + iproute2 consegui verificar a disponibilidade do link, caso algum venha a falhar, ele pare de enviar pacotes para aquele link até que o mesmo seja restaurado?
[4] Comentário enviado por capitainkurn em 19/07/2011 - 12:51h
m4sk4r4! Se você simplesmente desconectar um cabo de rede o próprio bonding se encarega de desviar o tráfego pela interface remanescente em poucos segundos, mas se o problema for por exemplo no gateway da operadora, a recuperação é mais demorada visto que o iproute 2 enviará um pacote por um link, na ausência de resposta ele o reenviará pelo link seguinte. Ele terá também que reescrever o cache de rotas com novas entradas. No geral basta que os clientes abram novas sessões de seus programas clientes para reestabelecer o funcionamento normal.
[6] Comentário enviado por tosko em 20/07/2011 - 23:26h
cara muito bem bolado esta solução sua, caiu na hora certa pra mim aqui no vol pois preciso implementar 3 servidores aqui na cidade e ambos tem 2 links.
atualmente eu faço assim, marco os pacotes e direciono 80 443 para um link (de preferencia o maior) e o resto para o outro link, aqui no server onde trabalho que é um servidor de arquivos muito acessado pelo pessoal da produção artistica eu fiz um bonding em duas placas de rede gigabit para a rede local, ou seja, dois clientes conseguem copiar simultaneament a 1gbp/s cada, totalizando os 2 gigabits.
lendo seu artigo me surgiu algumas duvidas:
1 - com este modelo vc não tera problemas com sites https? pois teoricamente os pacotes sairam aleatoriamente um por um link e outro por outro né?
2 - eu consigo fazer isto com links adsl's de mesma operadora normalmente? ou tem que ser links dedicados?
3 - porque vc preferiu adotar este padrão de juntar os links e entercalar os pacotes ao inves de separar por tipo de pacote?
4 - nesta implementação vc utilizou algum sistema de controle de banda? teve algum problema devido o gateway ser uma interface bond?
[10] Comentário enviado por capitainkurn em 01/08/2011 - 01:02h
respondendo ao Tosko:
1 - Não o https funciona sem problema algum, o único problema que pode ocorrer independentemente do balanceamento de links são aplicativos semelhantes ao conectividade social da Caixa Econômica, ou de biometria do Detran-RJ que tem o costume de empregar https em portas fora de padrão ( não 443 ) mas isso é por causa do proxy e não do balanceamento.
2 - Sim, no entanto os modems devem estar roteados cada um em uma rede diferente é claro. O bonding não manipula pppoe corretamente eu tentei fazer algo nesse sentido mas não tive resultados satisfatórios.
3 - Mencionei isso no artigo. Mas dependendo do perfil dos usuários da rede isso até pode ser empregado. Aliás eu sempre adotei esta técnica.
4 - Sim, no caso específico que escreví o artigo CBQ mas os controles de banda para download são aplicados na interface de rede que dá para a rede interna. Se for um controle de banda de upload pode ser empregado no bonding sem problemas.
[12] Comentário enviado por giliardbf em 10/08/2011 - 09:20h
Parabéns pelo artigo!
Uma dúvida: Porque o bonding não funcionaria corretamente se as interfaces agregadas estivessem conectadas diretamente aos roteadores das operadoras? eth1 no roteador da operadora1 e eth2 no roteador da operadora2.
[13] Comentário enviado por capitainkurn em 14/08/2011 - 09:43h
Para ser sincero não mergulhei nestas possibilidades, me atei somente a documentação do Bonding driver. Em princípio nem mesmo cojitei o seu uso minha idéia era de usar uma única interface de rede visto que slots PCI nas atuais motherboards de custo mais baixo são cada vez mais raros. Mas os resultados não foram satisfatórios, não sei determinar se foi por causa do driver da interface de rede que era uma 3com 3C905 ou mesmo seu hardware ou ainda alguma restrição em um dos roteadores. Sugiro que faça seus próprios ensaios e escreva um artigo ou dica relatando suas experiências.
[14] Comentário enviado por leandruco em 14/12/2011 - 10:09h
Muito bom o artigo porem tive um problema
Assim que desliguei um roteador, a conexão parou deixei dando um ping e depois de alguns erros ela voltou.
Porem a maquina que está como cliente ou seja utilizando o fw para sair para internet não consegue navegar.
Mesmo o fw navegando normalmente.
Quando liguei o outro roteador ele voltar a navegar, mas saindo com o ip da outra operado que eu não tinha desligado.
Muito estranho ou estou vacilando em alguma coisa?
[15] Comentário enviado por trsantana em 27/12/2011 - 02:24h
capitainkurn,
gostaria de saber como usar o seu artigo para a seguinte implementação:
Tenho três máquinas virtualizadas no VmWare Esxi onde são um iptables e dois squids. A minha intenção é usar o iptables como balanceamento de carga e alta disponibilidade para os dois squids.
Mas como fazer isto, pois na hora de colocar o MAC para as interfaces, e elas em modo promisculo e tambem agregação das interfaces ao bonding visto que cada maquina so tem uma interface de rede!!
Ficarei muito agradecido se você capitainkun ou algum colega que esteja lendo este topico pudesse me ajudar a solucionar este desafio.
Desde já obrigado.
[16] Comentário enviado por capitainkurn em 15/03/2012 - 13:34h
Se entendí sua pergunta você tem uma máquina hospedeira com apenas duas interfaces (uma para a rede interna e outra para o roteadores) e essa hospedeira roda duas máquinas virtuais empregando squid. Eu tenho isso em produção uma com Slackware 31.1 rodando o MyAuth Gateway do Patrick e uma entre ela e os roteadores. Mas nesse caso não empreguei o bonding fiz o balanceamento através apenas do iproute2 o que aliais foi minha primeira opção antes de empregar o método descrito no artigo.
[18] Comentário enviado por weltonpba em 02/07/2012 - 09:49h
Capitainkurn
Belíssimo artigo, estou tentando implantar Bonding Driver aqui na empresa, pois estou com 2 links de internet, a pergunta pode ser idiota mas fiquei com uma duvida, Você usou quantas placas de rede no servidor? 2 ou 3? uma para cada link e mais 1 para bond0? ou bond0 e virtual e so usa 2 placas?
[21] Comentário enviado por Birulis em 15/06/2016 - 13:35h
Po muito show o artigo. Oba por compartilhar.
Duvida: Segue o meu cenário.
Concentro meus links em um HUB. Deste HUB tenho um cabo de rede vindo direto ate o meu linux que seria meu ip publico. Para a utilização do link segundaria foi configurado uma interface virtual. Logo então, quando preciso virar o link preciso fazer o processo mecânico, derrubando a rota para para link primário e adicionando a rota do meu link secundário.
Como utilizo a mesma interface, é possível a utilização do Boding Driiver?
[22] Comentário enviado por Krusth em 02/12/2016 - 14:08h
Exatamente oque eu estava procurando, configurei o bonding pra pega dhcp, pega ip certinho, aparece os registros no log, ele mudando as interfaces, mas quando muda de interface fico sem conexão, ai se reinicio os serviços de rede volta, ou ifdown bond0; ifup bond0
ai pega ip da outra interface e consigo navegar.