FPI - Fórum para Provedores de Internet
Gostaria de reagir a esta mensagem? Crie uma conta em poucos cliques ou inicie sessão para continuar.
FPI - Fórum para Provedores de Internet


Você não está conectado. Conecte-se ou registre-se

Tutorial Load Balance em Linux

3 participantes

Ir para baixo  Mensagem [Página 1 de 1]

1Tutorial Load Balance em Linux Empty Tutorial Load Balance em Linux Sex 8 Fev - 14:32

Felipe Marques

Felipe Marques
Especialista
Especialista

    Obs.: Antes de tudo, usei o Debian Squezee 6.0 para criar esse tutorial, mas eu tenho Debian Lenny atualmente em uso em alguns servidores.

Você já ouviu falar de Balanceamento de Internet?

Eu já, e venho para falar dessa excelente ferramenta. Tudo que precisa ter em mente é que o balanceamento nada mais é que a divisão das internets de forma dinâmica. Sei também que muitos já ouviram falar que é possível usando o IPtables, através de divisão de pacotes, ex: tudo que sair para a placa eth1 irá para a rede 192.168.0, e que tudo que sair para a ppp0 irá para a rede 192.168.1.

Mas digo-lhe, usar o IPtables está aos poucos caindo em desuso, já que o balanceamento pode ser feito de forma muito mais dinâmica. Imaginem uma solução como a destes dois exemplos:

  • Digamos que você entre no site do www.google.com.br do ip 192.168.0.150 em sua rede, ele irá para a placa de internet eth1, e digamos que você entre no mesmo site da www.google.com.br no ip 192.168.0.120 na mesma rede e ele irá para a placa de internet ppp0, vejam que é a mesma rede, o mesmo site e computadores diferentes.

    Ele é capaz de balancear até no mesmo computador, digamos que você entre no site www.hardware.com.br no ip 192.168.0.100, ele irá para a placa eth1, e você também entre no site www.debian.org no mesmo ip, 192.168.0.100 e ele irá para a placa ppp0. O balanceamento é capaz de redirecionar os acessos tanto para a placa eth1 e a ppp0. Dinâmico não?


Tutorial Load Balance em Linux Image1.png.500x265.auto

Na figura acima apenas ilustrarei que a conexão vem em duas internets diferentes e são redirecionadas para uma rede.

A maior pergunta agora é: Como eu faço isso no Linux? E a resposta é simples (teoricamente né), vocês irão usar o iproute2 que é um modulo no Linux capaz de criar roteamentos mais dinâmicos no Linux, mas tem um porém (sempre tem um porém d;) ) é necessário recompilar o Kernel e implementar um path para que corrija problemas de roteamento.

Pacotes necessários

Agora que já falei o que é internet balanceada iremos começar com a instalação. Para isso iniciaremos recompilando o Kernel e instalando o path de correção das tabelas de roteamento.

Vou falar o motivo de instalar o path de correção e por que ele é tão essencial assim. No nosso proxy, toda a vez que vamos fazer um acesso a uma página ou fazer um download, o Kernel juntamente com as tabelas de roteamento redirecionam o trafego no proxy usando informações importantes como, o ip de origem, ip de destino, qual a internet de saída. É aqui que o path entra, caso o script do balanceamento esteja rodando, pela tabela de roteamento atual no Linux a comunicação é perdida, e simplesmente downloads grandes, sites ou programas que necessitam estar sempre enviando arquivos para a internet são desconectados, causando queda e a necessidade de recomeçar o envio novamente. Não seria bom perder aquele download que já estava em 90%

Para usarmos o patch iremos instalar os seguintes pacotes, recomendo entrar como root, lembrando que se você precisar balancear duas conexões de internet com certeza já é um usuário experiente no sistema. Também não vou entrar em muitos detalhes aqui na recompilação do Kernel, no final do tutorial irei postar os links para os mais interessados.

Código:
# apt-get update
# apt-get install kernel-package gcc libncurses5-dev
# apt-get install linux-source-2.6.xx

... substituindo "xx" pela versão atual do seu Kernel. Se você não souber qual é a versão atual, você pode consultar com o comando, ‘uname –r’ e o comando ‘apt-cache search linux-source’

Código:
# apt-get install linux-headers-$(uname -r)

Feito isto, vá até a pasta onde está o ‘source’:

Código:
# cd /usr/src

E descompacte-o com o comando a seguir:

Código:
# tar -vxjpf linux-source-2.6.xx.tar.bz2 -C /usr/src

Aqui vamos baixar e começar a instalar o path de correção das tabelas de roteamento.

Entre no site: http://kerneltrap.org/mailarchive/linux-netdev/2008/1/29/633354/thread

    Obs.: O patch foi escrito por Julian Anastasov, a quem devo todos os agradecimentos pelas correções, sem elas ficaria inviável o balanceamento.


  • Aqui dentro você encontra o link com o patch para atualização do Kernel.

  • Dentro do site, procure por: Linux kernel patches e logo abaixo você encontra Older routes-2.6.* versions

  • E baixe o patch correspondente ao seu Kernel


Exemplo:

Lembre-se de está na pasta /usr/src/

Rodei o comando "# uname –r" e descobri que meu Kernel é o "2.6.32-5-686"

Então eu vou baixar o patch:

Código:
# wget -c http://www.ssi.bg/~ja/routes-2.6.32-16.diff

Acesse o diretório linux-source-2.6.xx que foi criado. Todos os comandos a seguir são executados dentro dele.

Código:
# cd /usr/src/linux-source-2.6 [pressione TAB]
# patch -p1 < ../ routes-2.6 [pressione TAB]

Tome muito cuidado aqui, verifique se deu algum erro, caso dê, repita todos os passos acima, veja abaixo o que deve aparecer:

    patching file include/linux/rtnetlink.h
    patching file include/net/flow.h
    patching file include/net/ip_fib.h
    patching file include/net/netfilter/nf_nat.h
    patching file include/net/route.h
    patching file net/bridge/br_netfilter.c
    patching file net/ipv4/fib_frontend.c
    Hunk #5 succeeded at 274 (offset 2 lines).
    Hunk #6 succeeded at 925 (offset 2 lines).
    Hunk #7 succeeded at 961 (offset 2 lines).
    patching file net/ipv4/fib_hash.c
    patching file net/ipv4/fib_lookup.h
    patching file net/ipv4/fib_rules.c
    patching file net/ipv4/fib_semantics.c
    patching file net/ipv4/fib_trie.c
    patching file net/ipv4/netfilter/ipt_MASQUERADE.c
    patching file net/ipv4/netfilter/nf_nat_core.c
    Hunk #1 succeeded at 710 (offset -1 lines).
    patching file net/ipv4/netfilter/nf_nat_standalone.c
    patching file net/ipv4/route.c
    Hunk #1 succeeded at 696 (offset 1 line).
    Hunk #2 succeeded at 1427 (offset 1 line).
    Hunk #3 succeeded at 1876 (offset 1 line).
    Hunk #4 succeeded at 1887 (offset 1 line).
    Hunk #5 succeeded at 1952 (offset 1 line).
    Hunk #6 succeeded at 1986 (offset 1 line).
    Hunk #7 succeeded at 2020 (offset 1 line).
    Hunk #8 succeeded at 2028 (offset 1 line).
    Hunk #9 succeeded at 2049 (offset 1 line).
    Hunk #10 succeeded at 2086 (offset 1 line).
    Hunk #11 succeeded at 2134 (offset 1 line).
    Hunk #12 succeeded at 2149 (offset 1 line).
    Hunk #13 succeeded at 2175 (offset 1 line).
    Hunk #14 succeeded at 2185 (offset 1 line).
    Hunk #15 succeeded at 2228 (offset 1 line).
    Hunk #16 succeeded at 2279 (offset 1 line).
    Hunk #17 succeeded at 2302 (offset 1 line).
    Hunk #18 succeeded at 2351 (offset 1 line).
    Hunk #19 succeeded at 2435 (offset 1 line).
    Hunk #20 succeeded at 2517 (offset 1 line).
    Hunk #21 succeeded at 2629 (offset 1 line).
    Hunk #22 succeeded at 2637 (offset 1 line).
    Hunk #23 succeeded at 2677 (offset 1 line).
    Hunk #24 succeeded at 2685 (offset 1 line).
    Hunk #25 succeeded at 2731 (offset 1 line).
    Hunk #26 succeeded at 3513 (offset 6 lines).


Copiando as configurações do seu Kernel atual para o novo Kernel que está prestes a compilar, faça o seguinte:

Código:
# cp /boot/config-2 [pressione TAB] .config
# make oldconfig
# make-kpkg --append-to-version "-nome-personalizado" --initrd kernel_image

No meu caso eu troquei o "-nome-personalizado" por "-balanc". Isso demora cerca de 25 minutos, dependendo da velocidade do seu computador.

    Obs: caso dê o erro abaixo (isso aconteceu sempre comigo no Debian Lenny e Squezee):


Código:
lguest.c:37:18: error: zlib.h: Arquivo ou diretório não encontrado

instale o:

Código:
 # apt-get install zlib1g-dev

faça novamente:

Código:
# make-kpkg --append-to-version "-nome-personalizado" --initrd kernel_image

Não se preocupe, ele não irá recomeçar do zero, apenas irá continuar da onde parou.

Tutorial Load Balance em Linux Image2.png.500x281.auto

Ao terminar, saia do diretório atual:

Código:
# cd ..

Debian Lenny:

Agora iremos reconfigurar o grub para que ele possa iniciar com o novo Kernel.

Código:
# nano /boot/grub/menu.lst

Recorte e cole toda a referência do seu novo Kernel para acima das versões anteriores e salve.

Debian Squezee:

No Squezee é diferente a modificação no grub, já que ele possui o grub2.

Código:
# nano /etc/default/grub

Modifique a linha GRUB_DEFAULT colocando o número em que seu Kernel modificado aparece na lista.

Exemplo:

    GRUB_DEFAULT=2


Reinicie o computador e veja se o Kernel foi instalado, rode o comando "# uname –r" e olhe o novo nome do Kernel.

Tutorial Load Balance em Linux Image3.png.500x281.auto

Tutorial Load Balance em Linux Image4.png.500x281.auto

Veja acima que o Kernel recompilado aparece em meu sistema: 2.6.32-balanc

Se tudo ocorreu bem, vamos passar para a parte de criar as regras.

Criando as regras para fazer o balanceamento

Crie um arquivo de script ".sh" e digite o código abaixo:

Código:
# nano /etc/script/balanceamento.sh

    #!/bin/bash
    # aqui apenas criamos as variáveis com todas as informações da sua rede

    # como ip, mascara de sub-rede e gateway.
    IF0=eth0
    P0_NET="`ip route | grep -v default | grep src | grep $IF0 | awk '{print $1}'`"
    IF1=eth1
    P1_NET="`ip route | grep -v default | grep src | grep $IF1 | awk '{print $1}'`"
    P1="`ip route | grep -v default | grep src | grep $IF1 | awk -F. '{print $1"."$2"."$3".1"}'`"
    IP1=`ip addr show dev $IF1 | grep "inet " | awk '{print $2}' | awk -F/ '{print $1}'`
    IF2=ppp0
    P2_NET="`ip route | grep -v default | grep src | grep $IF2 | awk '{print $1}'`"
    P2="`ip route | grep -v default | grep src | grep $IF2 | awk -F. '{print $1"."$2"."$3".1"}'`"

    IP2=`ip addr show dev $IF2 | grep "inet " | awk '{print $2}' | awk -F/ '{print $1}'`

    # você esta preenchendo as tabelas de roteamento com as variáveis.

    # assim, tudo que vier da rede eth1 irá para a tabela link1
    ip route add $P1_NET dev $IF1 src $IP1 table link1
    ip route add default via $P1 table link1

    # tudo que vier da rede ppp0 irá para a tabela link2
    ip route add $P2_NET dev $IF2 src $IP2 table link2
    ip route add default via $P2 table link2

    # na tabela link1 também deverá conter os endereços da eth0 (rede local)

    # ppp0 (a outra internet) e o seu computador localhost
    ip route add $P0_NET dev $IF0 table link1
    ip route add $P2_NET dev $IF2 table link1
    ip route add 127.0.0.0/8 dev lo table link1

    # na tabela link2 também deverá conter os endereços da eth0 (rede local)

    # eth1 (a outra internet) e o seu computador localhost
    ip route add $P0_NET dev $IF0 table link2
    ip route add $P1_NET dev $IF1 table link2
    ip route add 127.0.0.0/8 dev lo table link2

    # estamos indicando qual a tabela certa para fazer o roteamento

    # indicando o IP de origem e a tabela
    ip rule add from $IP1 table link1
    ip rule add from $IP2 table link2

    # aqui é a parte importante em que ele divide a conexão ao meio usando o 'weight 1'

    # significa que seu link1 e link2 são da mesma velocidade
    ip route change default scope global nexthop via $P1 dev $IF1 weight 1 nexthop via $P2 dev $IF2 weight 1


Transforme o seu '.sh' em executável:

Código:
# chmod +x /etc/script/balanceamento.sh

Salve o arquivo e crie um atalho para que ele execute automaticamente ao iniciar o PC, geralmente eu sempre uso o rc.local para que meus scripts iniciem.

Código:
# nano /etc/rc.local

#[adicione no final do arquivo:]
/etc/script/balanceamento.sh

Adicionando as tabelas de roteamento:
Edite também o arquivo onde contem as tabelas, só assim o link1 e o link2 serão referenciados.

    # /etc/iproute2/rt_tables


E adicione o que estiver o link1 e link2, siga o exemplo abaixo, digite apenas o que estiver em negrito.

    #
    # reserved values
    #

    255 local
    254 main
    253 default
    0 unspec

    #
    # local
    #

    #1 inr.ruhep

    1 link1
    2 link2


Executando e testando a conexão

Rode o seu script para testar, verifique se não aparece nenhuma mensagem de erro.

Código:
# /etc/script/balanceamento.sh

1.Teste usando iptraf

Teste a sua conexão, caso o iptraf não esteja instalado, use "# apt-get install iptraf" e depois "# iptra", assim em um ambiente agradável é possível ver os pacotes passando na interface de internet eth1 e ppp0.

Tutorial Load Balance em Linux Image5.png.500x276.auto

2.Teste usando ip route

Entre no servidor e digite:

Código:
# ip route
200.217.90.48 dev ppp0 scope link src 201.79.158.110
192.168.0.0/24 dev eth0 proto kernel scope link src 192.168.0.1
187.20.48.0/21 dev eth1 scope link src 187.20.52.160
default
nexthop via 187.20.52.1 dev eth1 weight 1
nexthop via 201.79.158.1 dev ppp0 weight 1

Neste momento observe que existem dois links default, isso significa que as internets estão balanceadas.

Também é possível usar o comando:

Código:
# ip route ls table cache 192.168.0.4
192.168.0.4 from 213.189.169.145 dev eth0 src 201.68.88.227
cache mtu 1500 advmss 1460 hoplimit 64 iif ppp0
192.168.0.4 from 74.135.224.315 dev eth0 src 201.68.88.227
cache mtu 1500 advmss 1460 hoplimit 64 iif ppp0
192.168.0.4 from 205.251.223.33 dev eth0 src 187.30.59.12
cache mtu 1500 advmss 1460 hoplimit 64 iif eth1
192.168.0.4 from 157.55.130.154 dev eth0 src 187.30.59.12
cache mtu 1500 advmss 1460 hoplimit 64 iif eth1
192.168.0.4 from 74.125.224.57 dev eth0 src 187.30.59.12
cache mtu 1500 advmss 1460 hoplimit 64 iif eth1
192.168.0.4 from 74.125.234.34 dev eth0 src 187.30.59.12
cache mtu 1500 advmss 1460 hoplimit 64 iif eth1
192.168.0.4 from 157.55.120.147 dev eth0 src 201.68.88.227
cache mtu 1500 advmss 1460 hoplimit 64 iif ppp0

Observem que apenas pedi ao ‘ip route’ para me mostrar tudo que esta em cache do ip 192.168.0.4, sendo que os sites passam por eth1 e ppp0.

Dicas finais

BIND9

Você terá que instalar o BIND9 em seu servidor, já realizei vários testes e sem ele o roteamento se torna menos confiável, e alguns sites podem demorar a responder.

Crie assim um script para que o resolv.conf de seu servidor não seja alterado, caso um dos links venha a cair e se reconectar.

Código:
# crontab -e
0-59/1 * * * * echo “nameserver 192.168.0.1” > /etc/resolv.conf

Acima eu simplesmente peço ao crontab para adicionar novamente o ip 192.168.0.1 a cada 1 minuto no resolv.conf.

Não irei abordar a instalação do BIND9 e sua configuração, pois existe material de sobra na internet para esse fim.

SQUID3

Caso esteja usando o squid é sempre bom apontar o DNS padrão para que utilize o seu servidor como default.

Edite o: /etc/squid3/squid.conf e adicione nas primeiras linhas os comandos abaixo.

    dns_timeout 1 minutes
    dns_retransmit_interval 5 seconds
    dns_defnames off
    dns_nameservers 192.168.0.1


IPTABLES

Aqueles que usam o NAT apenas em algumas portas ou em alguns hosts é necessário realizar a função nas duas interfaces.

Digamos que você use o MASQUERADE na porta 22:

# NAT apenas para a porta ssh (22)

Código:
iptables -t nat -A POSTROUTING -o $IF1 -d 0/0 -p tcp --dport ssh -j MASQUERADE
iptables -t nat -A POSTROUTING -o $IF2 -d 0/0 -p tcp --dport ssh -j MASQUERADE

Agora para o host 192.168.0.100

# NAT apenas para o computador do Gerente

Código:
iptables -t nat -A POSTROUTING -s 192.168.0.100/32 -o $IF1 -j MASQUERADE
iptables -t nat -A POSTROUTING -s 192.168.0.100/32 -o $IF2 -j MASQUERADE

Roteamento de Prevenção

As vezes, digamos, a conexão cai por falta de sinal ou você se depara com algum erro que faz com que a rota padrão não inicie, ou ainda tenha que que configurar novamente uma das interfaces de internet.

Dai o problema: você não pode simplesmente reiniciar o servidor esperando que a conexão volte, ainda mais em ambiente de produção. O que irei demonstrar agora é como rotear a conexão para que volte pelo ao menos um dos links, deixando os maiores desafios para quando 'a galera' estiver no almoço ou fora do expediente normal.

Entre no seu servidor e digite:

Código:
# ip route
200.217.90.48 dev ppp0 proto kernel scope link src 201.79.158.110
187.20.48.10 dev eth1 proto kernel scope link src 187.20.52.160
192.168.0.0/24 dev eth0 proto kernel scope link src 192.168.0.1

Observe que a conexão acima esta normal entre as placas de internet eth1 e ppp0. Mais não é só isso que faz o sistema funcionar, sem a rota 'default' nada irá ter acesso à internet.

Roteando a conexão ppp0 como default

Código:
# ip route add default dev ppp0

Ou roteando a eth1 como default

Código:
# ip route add default dev eth1

Digite novamente "# ip route" e veja.

    200.217.90.48 dev ppp0 proto kernel scope link src 201.79.158.110
    187.20.48.10 dev eth1 proto kernel scope link src 187.20.52.160
    192.168.0.0/24 dev eth0 proto kernel scope link src 192.168.0.1

    default dev ppp0 scope link


significa que a rota ppp0 foi criada.

Caso queira apagar uma rota padrão.

Código:
# ip route del default dev eth1

Conclusão

Com o uso do iproute2 você poderá criar vários tipos de tabelas para várias situações interessantes, como passar a internet de um host apenas por um link. O uso do iproute2 é na verdade a união de vários comandos como ifconfig, route, arp etc. Eu recomendo a todos que leiam um pouco sobre o uso da ferramenta iproute2, e aos que já usaram o antigo comando route possam migrar com segurança.

Espero que todos tenham gostado do meu tutorial e logo estarei escrevendo sobre outras funções desse ótimo sistema que é o Linux.

Obrigado a todos.

Por : Linderval Alves

Fonte : http://www.hardware.com.br/tutoriais/balanceamento-internet/

demattos

demattos
MODERADOR
MODERADOR

amo linux, o mikrotik so veio para facilitar os que querem algo grafico, ,as tudo pode ser feito com linux


abracos amigo


team demattos

http://www.criciumanet.com.br

Francisco Souza


Iniciante
Iniciante

Bom dia a todos,

Excelente tutorial, bem didatico, utilizei um semelhante durante anos com ótimos resultados.

Só acrescentado, seria interessante criar um script que ficasse agendado no cron, com execução continua para monitorar o estatus dos links, e em caso de queda de um deles automaticamente fizesse a correção das rotas padroes ou ativação e desativação dos mesmo. Também pode-se adicionar os pacotes MRTG o CACIT, para efeito de gerar graficos de consumo e tudo mais.

estou aqui para contribuir

Francisco Souza

Conteúdo patrocinado



Ir para o topo  Mensagem [Página 1 de 1]

Permissões neste sub-fórum
Não podes responder a tópicos