Balanceando 2 links no Linux

Posted on jun 22, 2008 under Dicas Linux, Sem categoria, Tutoriais | 6 Comentários

Nesta matéria pretendo mostrar como fazer balanceamento entre links, utilizando uma máquina com o Linux instalado.

A imagem abaixo mostra a topologia de rede, nesta configuração temos uma Linux Box com três
placas de redes eth1 para os clientes, eth0 para o link1 e eth2 para o link2. O link1 é 2 vezes mais rápido que o link2.
balaceamento de links na internet

Existem várias técnicas que podem realizar balanceamento entre links como por exemplo: bonding, roteamento avançado. Irei utilizar roteamento avançado porque com port bonding não descobri como configurar o peso de cada link.

Bonding

Este método permite criar uma uma interface lógica de rede que agrega dois ou mais links físicos conectados a switchs separados. Mais detalhes sobre bonding

Roteamento avançado Linux

Linux possui recursos avançados para roteamento esses recursos estão implementados no kernel, então eles devem estar habilitados. Para saber mais sobre roteamento avançado acesso http://lartc.org/lartc.html

Então vamos colocar a mão na massa.

Pré-requisitos

Kernel

As seguintes opções devem estar habilitadas:

  • CONFIG_IP_ADVANCED_ROUTER (Networking/IP: Advanced Router)
  • CONFIG_IP_MULTIPLE_TABLES (Networking/IP: policy routing)

Estas opções habilitam o roteamento avançado e também possibilitam ter múltiplas tabelas de roteamento.

Para verificar se o seu kernel está compilado com estes recursos rode o seguinte comando:

grep -e CONFIG_IP_ADVANCED_ROUTER -e CONFIG_IP_MULTIPLE_TABLES /usr/src/linux/.config
CONFIG_IP_ADVANCED_ROUTER=y
CONFIG_IP_MULTIPLE_TABLES=y

Se estes recursos não estiverem habilitados será necessário recompilar o kernel habilitando estes recursos. Rode os seguintes comandos para recompilar o kernel com estas opções.

cd /usr/src/linux
make menuconfig

Navegue para Network–>
Network Options –> e modifique as opções
IP: Advanced router para [*] e
IP: policy routing para [*]

Salve e rode make && make modules_install

IPROUTE2

Verifique se o iproute2 está instalado com o comando ip. Caso não esteja instalado neste site possui uma ótima documentação sobre o iproute2.

Definindo a tabela de Rotas

Vamos criar duas tabelas de rotas dentro do arquivo /etc/iproute/rt_tables

echo "1 Link1" >> /etc/iproute/rt_tables
echo "2 Link2" >> /etc/iproute/rt_tables

A partir de agora temos três tabelas de rotas Link1 e Link2.

A próxima etapa é preencher a tabela de rotas.

Rota Link1

/sbin/ip route add 200.xx.yy.0/24 dev eth0 src 200.xx.yy.2 table link1
/sbin/ip route add default via 200.xx.yy.1 table link1
/sbin/ip rule add from  200.xx.yy.2 table link1

Rota Link2

/sbin/ip route add 190.xx.yy.0/24 dev eth0 src 190.xx.yy.2 table link2
/sbin/ip route add default via 190.xx.yy.1 table link2
/sbin/ip rule add from  190.xx.yy.2 table link1

Balanceando

Para balancear o uso dos links devemos atribuir o peso de cada link. O peso é atribuído através do parâmetro weight no nosso exemplo vamos utilizar o peso 2 para o link1 e 1 para o link 2.

/sbin/ip route add default scope global\
         nexthop via 200.xx.yy.1 dev eth0 weight 2\
         nexthop via 190.xx.yy.1 dev eth1 weight 1

Script completo

#!/bin/bash
#
#Script para balanceamento de 2 links de acesso a internet
#Licença=GPL
#Author=Marlon Petry

NETMASK1=200.xx.yy.0/24
DEVICE1=eth0
IPADDRESS1=200.xx.yy.2
GATEWAY1=200.xx.yy.1
TABLE1=Link1

NETMASK2=190.xx.yy.0/24
DEVICE2=eth2
IPADDRESS2=190.xx.yy.2
GATEWAY2=190.xx.yy.1
TABLE2=Link2

#PESO DOS LINKS
W1=2
W2=1

#interface 1
/sbin/ifconfig eth0 down
/sbin/ifconfig eth0 $IPADDRESS1/29  up
/sbin/ip route add $NETMASK1 dev $DEVICE1 src $IPADDRESS1 table $TABLE1
/sbin/ip route add default via $GATEWAY1 table $TABLE1
/sbin/ip rule add from $IPADDRESS1 table $TABLE1

#Interface 2
/sbin/ifconfig eth2 down
/sbin/ifconfig eth2 $IPADDRESS2/29 up
/sbin/ip route add $NETMASK2 dev $DEVICE2 src $IPADDRESS2 table $TABLE2
/sbin/ip route add default via $GATEWAY2 table $TABLE2
/sbin/ip rule add from $IPADDRESS2 table $TABLE2

#Adicionando as rotas e o balanceamento de carga
/sbin/ip route add default scope global\
         nexthop via $GATEWAY1 dev $DEVICE1 weight $W1\
         nexthop via $GATEWAY2 dev $DEVICE2 weight $W2

echo "Balanceamento 2 link petryx.blogrs.com.br"

O balanceamento de links através de roteamento funciona bem, mas segundo o how-to http://lartc.org/lartc.html não é perfeito, pois as rotas são cacheadas. Isto significa que quando um site for acessado através do link1, sempre será acessado através da mesma rota. Este problema pode ser resolvido com a aplicação de um patch disponível no site http://www.ssi.bg/~ja/#routes.

Precisando de Consultoria em Linux entre em contato aqui.

Saiba mais

http://www.linuxhorizon.ro/iproute2.html
http://lartc.org/lartc.html
http://linux-ip.net/html/routing-intro.html
http://www.rnp.br/newsgen/0201/roteamento_linux.html
http://www.linuxjournal.com/article/5826

6 Responses to “Balanceando 2 links no Linux”

  1. Carlos disse:

    Caro amigo.

    Eu fiz a configuração de 2 links aqui na empresa. Funciona muito bem, mas quando eu desconecto o cabo de uma das placas de rede, os dois links deixam de funcionar, quando conecto novamente o cabe de rede, fica sem funcionar.. Você pode me ajudar..???

  2. admin disse:

    Olá Carlos

    Tu deve fazer um script que fique monitorando os links no momento que o link cair você remove a rota referente ao link. Então todo o tráfego será redirecionado para o link que está no ar.

    Espero ter ajudado

  3. ederson disse:

    Ola !!! eu estava querendo usar esse script so que tem um porem…

    na parte do kernel, no primeiro passo, nao consegui fazer ele diz que o diretorio nao existe alguem pode me ajudar ??

    estou usando Debian 4.0

    valeus!!

  4. admin disse:

    Olá Ederson,

    Se você não acha a pasta é sinal que terá que instalar os fontes do kernel e recompilar.

    Encontrei um tutorial
    http://www.guiadohardware.net/dicas/recompilando-kernel-debian.html

  5. Olá amigo,

    esse script que fica monitorando o link e o remove da rota caso saia do ar parece uma solução bastante simples e funcional de fail-over, você onde tem um modelo?

  6. Odell Pereira disse:

    I just needed to say that I found your blog via Goolge and I am glad I did. Keep up the good work and I will make sure to bookmark you for when I have more free time away from the books. Thanks again!

Leave a Reply