Modificando as tabelas e rotas, mudanças em negrito.
1. Acrescente no arquivo rt_tables:
1 gvt
2 brt 3 net
2. Acrescente a nova rota para os três links, abaixo incluo a regra no arquivo rc.local:
ip route flush table gvt #Limpa as rotas no cache da tabela gvt
ip route flush table brt #Limpa as rotas no cache da tabela brt
ip route flush table net #Limpa as rotas no cache da tabela net
ip route add 192.168.1.0/24 dev eth1 src 192.168.1.10 table gvt
ip route add default via 192.168.1.1 table gvt
ip route add 192.168.2.0/24 dev eth2 src 192.168.2.10 table brt
ip route add default via 192.168.2.1 table brt
ip route add 192.168.3.0/24 dev eth3 src 192.168.3.10 table net
ip route add default via 192.168.3.1 table net
ip rule add from 192.168.1.10 table gvt
ip rule add from 192.168.2.10 table brt ip rule add from 192.168.3.10 table net
#Esta regra abaixo é responsável pelo balanceamento, vamos dividir a saída com peso 2:1:1, vamos supor que a gvt é 2x mais rápida com link de 3 mega, link da brt com 1 mega, e link da net com 1 mega.
ip route add default scope global nexthop via 192.168.1.1 dev eth1 weight 2 nexthop via 192.168.2.1 dev eth2 weight 1 nexthop via 192.168.3.1 dev eth3 weight 1
ip route flush cache #Limpa as rotas no cache
Dicas
1. Caso queira trabalhar somente com dois links balanceados e três links redundantes, é necessário remover a regra de balanceamento "nexthop via 192.168.3.1 dev eth3 weight 1" dos arquivos "rc.local" e "gwping.sh", nesse caso os três links ficarão fora do balanceamento.
2. Posso utilizar os três links que ficaram de fora do balanceamento usando a marcação de pacotes, neste caso os três links trabalharão especificamente para um serviço ou um destino, veja exemplo:
#A regra abaixo determina que toda rede interna balanceada irá acessar o Bradesco pelo 3 link:
iptables -I PREROUTING -t mangle -i eth0 -s 192.168.0.0/24 -d bradesco.com.br -j MARK --set-mark 0x30
#A regra abaixo determina que toda rede interna balanceada irá acessar as portas 110(pop) e 25(smtp) pelo 3 link:
iptables -I PREROUTING -t mangle -i eth0 -s 192.168.0.0/24 -d 0/0 -p tcp -m multiport --dports 110,25 -j MARK --set-mark 0x30
3. Cuidado ao trabalhar com regras de marcação, como trabalhamos com redundância se algum link cair e não deletar a marcação feita para ele, o serviço ficará indisponível até o link voltar... para corrigir esse problema adicionei ao arquivo "gwping.sh" a regra para deletar a marcação do link que caiu... é necessário limpar a tabela mangle e adicionar as novas regras de marcação para quando o link voltar.
#Deleta marcação da tabela de roteamento:
ip rule del fwmark 0x30 lookup net prio 3
#Deleta as regras da tabela mangle:
iptables -F -t mangle
iptables -X -t mangle
Obs.: Não esqueça de desativar o balanceamento dos três links se for utilizá-los com marcação de pacotes, caso contrário não funcionará.
4. Na explicação anterior, para a chamada do script no arquivo rc.local, o comando nohup cria um arquivo "nohup.out" e isso gera um grande acúmulo de dados ocupando espaço desnecessário no HD, se esse log não for necessário para você, é possível desativá-lo acrescentando a opção > /dev/null o que jogará todo esse lixo para o buraco negro. Veja como ficaria a linha de comando:
[1] Comentário enviado por gustavoisouza em 09/06/2009 - 07:50h
Primeiramente parabéns pelo artigo.
Já implementei algumas vezes balanceamento, parando nesse problema de sites de banco que interrompem a conexão quando identificam a troca do IP proveniente.
Não tive a chance de testar se poderíamos colocar, em vez do nome de todos os bancos no IPTABLES, colocar --dport 443 para sair por 1 link só resolveria esse problema.
[2] Comentário enviado por info24hs em 09/06/2009 - 08:20h
Amigo,
Veja esse exemplo abaixo, essa regra uso atualmente para me conectar com o Banrisul. Entenda a regra, tudo que vier pela interface da rede interna com origem da minha rede interna e com destino ao ip do banco usando protocolo tcp e as portas 80 e 443 são marcadas para sair pelo link 1. Coloque o ip do banco ai invés do nome para evitar resolução de nomes ou alguma falha com o dns.
[3] Comentário enviado por gustavoisouza em 09/06/2009 - 08:31h
Entendi.....
Meu intuito era reduzir o número de linhas e trabalho para pegar todos os IP`s de banco ou outros sites que usam esse tipo de restrição de segurança na unha..... Mas perfeito.
[4] Comentário enviado por rafaelturazzi em 10/06/2009 - 08:26h
Parabéns pelo artigo!
Apenas uma pergunta: Como você trabalha com 3 links, você usa no linux as 3 rotas (uma de cada link) ou somente a do link com maior banda? Pergunto isso para saber como devemos proceder para sar um suporte remoto, entro por qual link?
Abraços,
Rafael
[5] Comentário enviado por info24hs em 10/06/2009 - 09:36h
Rafael,
Como tu pode ter visto no esquema acima é necessário configurar as 3 rotas.. uma para cada link, a seguir o comando que irá fazer o balanceamento configura a primeira rota como padrão do sistema, ou seja a segunda rota e a terceira na respectiva ordem. Veja exemplo:
# 1º rota ip x.x.1.1, 2º rota ip x.x.2.1, 3º rota ip x.x.3.1, nesse exemplo a rota padrao será o link 1 porque ele esta na frente de todos. A primeira conexão estabelecida sempre é feita pelo link da rota padrão do sistema, no caso abaixo o 3º será o último link a ser utilizado.
ip route add default scope global nexthop via 192.168.1.1 dev eth1 weight 2 nexthop via 192.168.2.1 dev eth2 weight 1
nexthop via 192.168.3.1 dev eth3 weight 1
# Veja abaixo a regra para acesso remoto configurada e marcada para ser usado pelo link 2, lembrando que o link 1 é a minha rota padrão.
[8] Comentário enviado por fell em 19/11/2009 - 10:04h
Uma duvida como este script faz a chacagem dos links,pois estou vendo que ele checa quando se executa o script,mas depois de carregando o script como que é feito esta checagem dos links.
[10] Comentário enviado por faosfbi em 16/11/2010 - 14:44h
Olá, primeiramente parabenizo pelo excelente artigo, de grande utilidade.
Apenas tenho uma dúvida.
Quando faço um teste de velocidade de uma estação de trabalho que está dentro desta infraestrutura o mesmo me retorna a velocidade de um link e não a somatória de todos os links. É assim mesmo ou o resultado teria de ser a soma de todos os links?