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.
Primeiramente vamos definir as tabelas de roteamento no arquivo /etc/iproute2/rt_tables:
#
# reserved values
#
255 local
254 main
253 default
0 unspec
#
# local
#
#1 inr.ruhep
252 operadora0
251 operadora1
As chamaremos de operadora0 e operadora1, afinal o VOL não ganha um tostão delas para fazer propaganda! Rsssss.
Agora vamos acrescentar as rotas na tabela de roteamento:
Primeiro, limpar qualquer rota existente no cache:
# ip route flush cache; ip route flush cached
Finalmente acrescentar as rotas, para operadora0:
# ip route add default via xxx.xxx.xxx.xxx dev bond0 table operadora0 # ip route add xxx.xxx.xxx.xxA via xxx.xxx.xxx.xxx table operadora0 # ip rule add from xxx.xxx.xxx.xxA table operadora0
Para operadora1:
# ip route add default via yyy.yyy.yyy.yyy dev bond0 table operadora1 # ip route add yyy.yyy.yyy.yyA via xxx.xxx.xxx.xxx table operadora1 # ip rule add from yyy.yyy.yyy.yyA table operadora1
E finalmente vamos definir as rotas default:
# ip route add default scope global nexthop via xxx.xxx.xxx.xxx dev bond0 weight 67 nexthop via yyy.yyy.yyy.yyy dev bond0 weight 33
Onde xxx.xxx.xxx.xxx e yyy.yyy.yyy.yyy são os endereços dos roteadores e xxx.xxx.xxx.xxA e yyy.yyy.yyy.yyA são os endereços do host.
Os pesos:
Notaram os parâmetros weight 67 e weight 33 acima? Pois é! Ocorre o seguinte:
Temos dois links de velocidades diferentes o primeiro de 2Mbit/s e segundo de 4Mbit/s logicamente a soma de ambos dá 6Mbit/s, então fazemos a seguinte conta, 2 + 4 = 6
(4 / 6)*100 = 66,66% aredondamos para 67, 100 - 67 = 33.
Resumindo o link de 2Mbit/s corresponde a 33% da soma de ambos e o de 4Mbit/s é 67% da soma de ambos. Se ambos fossem da mesma velocidade bastaríamos especificar o peso de cada um como igual a 1.
E agora limparemos o cache de rotas novamente!
# ip route flush cache; ip route flush cached
Para a redundância funcionar corretamente o bonding requer que todas as interfaces agregadas e os roteadores das operadoras estejam conectados em um mesmo switch.
[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.