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 verifique se o Bonding Driver está compilado como módulo em seu sistema, com o comando:
# modprobe -l | grep bonding
A saída deverá ser:
kernel/drivers/net/bonding/bonding.ko
Caso o módulo não esteja presente será preciso recompilar o Kernel e marcando-o como módulo, pois isso facilita e muito a passagem de parâmetros ao módulo durante seu carregamento, se compila-lo como built-in, isso precisará ser feito via sysfs. Não mencionarei detalhes acerca de compilação do Kernel por fugir ao objetivo do artigo.
Onde xxx.xxx.xxx.xxx,yyy.yyy.yyy.yyy são os endereços IP dos roteadores. O parâmetro miimon é especificado em milisegundos e verifica o estado dos links com requisições ARP e o parâmetro mode define qual será o modo de operação do bonding, em nosso caso empreguei o round-robin.
Mais detalhes sobre estes tópicos e outros podem ser verificados na documentação do Bonding Driver nos fontes do Kernel, o path é /usr/src/linux/Documentation/networking/bonding.txt. Neste mesmo diretório encontramos o fonte do ifenslave o utilitário que manipula o bond que deverá ser compilado com o seguinte comando:
Agora vamos especificar o endereço MAC do bonding:
# ifconfig bond0 hw ether 00:12:ab:30:ae:9b
Como eu tive problemas com os roteadores do cliente, conforme mencionado acima, fiz diferente. Especifiquei primeiramente o MAC das interfaces de rede físicas pois o bonding pegara o endereço da primeira interface a ser adicionada. Podem estranhar eu haver atribuído o mesmo MAC para ambas as interfaces mas isso tem um propósito, como os roteadores apresentavam restrições ARP, se no futuro eu precisar trocar ou inverter a ordem das interfaces de rede simplifica e muito a tarefa:
Agora vamos levantar as interfaces de rede e o bonding. Atentem que a ordem é importante, o bond0 deve ser levantado primeiro e depois disso as interfaces físicas, que devem estar em modo promíscuo mas apenas elas e não o bonding.
# ifconfig bond0 up # ifconfig eth2 up promisc # ifconfig eth1 up promisc
Agregamos as interfaces ao bonding:
# ifenslave bond0 eth1 eth2
Atribuiremos os endereços IPs de ambas as operadoras ao bonding:
# ip addr add xxx.xxx.xxx.xxA/30 brd + dev bond0 # ip addr add yyy.yyy.yyy.yyyA/28 brd + dev bond0
Pronto! Agora temos um bonding totalmente funcional, falta agora apenas implementar o roteamento avançado onde inclusive dimensionaremos o peso de cada um dos links visto que são de velocidades diferentes.
[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.