Introdução
Seguindo a sequência dos artigos sobre balanceamento e redundância, segue o script atualizado e modificado para uso de três links de internet.
Referência: Últimas modificações:
Funcionamento: 1. Se cair um link, ele continua fazendo o balanceamento entre 2 links. 2. Caso caiam 2 links, a rede continua funcionando em 1 link. 3. *Soma dos links, é feita da seguinte maneira: 1ª conexão estabilizada pelo link 1, 2ª conexão estabilizada pelo link 2, 3ª conexão estabilizada pelo link 3; estamos usando peso 1:1:1. 4. Os serviços podem ser divididos e remanejados para determinados links usando regras de marcação. 5. Este método de balanceamento e redundância só serve como saída para a Internet. * Use um programa do tipo download manager que possa dividir o arquivo em partes para testar. |
|
Modificando as tabelas e rotas
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 192.168.2.0/24 dev eth2 src 192.168.2.10 table brt ip route add 192.168.3.0/24 dev eth3 src 192.168.3.10 table net ip rule add from 192.168.1.10 table gvt #Esta regra abaixo é responsável pelo balanceamento, vamos dividir a saída com peso 2:1:1, vamos supor que a gvt é 2x 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 ip route flush cache #Limpa as rotas no cache Dicas1. 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: 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: 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: # nohup > /dev/null /etc/link/gwping & |
|
Script gwping.sh
#!/bin/bash -x
IPTABLES=/sbin/iptables # Convencionalmente ” 0 ” indica sucesso neste script. # Tempo entre verificações em segundos # Endereço IP ou nome de domínio para o ping. O roteiro baseia-se no domínio a ser pingável e sempre disponível. # Ping Timeout em segundos. # Interfaces externas. # Endereço IP de interfaces externas. Este não é o endereço do gateway. # Gateway endereços IP. Este é o primeiro (hop) gateway, poderia ser o seu router IP endereço, se tiver sido configurado como o gateway. # Pesos relativos de rotas. Guarde este para um baixo valor inteiro. Estou usando 1 para GVT porque é 3 vezes mais rápida. # Nome dos Provedores; utilizar os seus próprios nomes aqui. # N º de repetições de sucesso ou fracasso antes de mudar status de conexão. ## Não mudar nada abaixo desta linha. # Última link status indica que a macro estado da ligação é determinada. # Última ping estado. Não alterar estes valores. # Ping atual estatuto. Não alterar estes valores. # Mudança link status indica que a ligação tem de ser mudado. Não alterar estes valores. # Conde de repetidos até estatuto ou para baixo estatuto. Não alterar estes valores. while : ; do if [ $RETVAL -ne 0 ]; then if [ $LPS1 -ne $CPS1 ]; then if [[ $COUNT1 -ge $SUCCESSREPEATCOUNT || ($LLS1 -eq 0 && $COUNT1 -ge $FAILUREREPEATCOUNT) ]]; then LPS1=$CPS1 ping -W $TIMEOUT -I $IP2 -c 1 $TESTIP > /dev/null 2>&1 if [ $RETVAL -ne 0 ]; then if [ $LPS2 -ne $CPS2 ]; then if [[ $COUNT2 -ge $SUCCESSREPEATCOUNT || ($LLS2 -eq 0 && $COUNT2 -ge $FAILUREREPEATCOUNT) ]]; then LPS2=$CPS2 ping -W $TIMEOUT -I $IP3 -c 1 $TESTIP > /dev/null 2>&1 if [ $RETVAL -ne 0 ]; then if [ $LPS3 -ne $CPS3 ]; then if [[ $COUNT3 -ge $SUCCESSREPEATCOUNT || ($LLS3 -eq 0 && $COUNT3 -ge $FAILUREREPEATCOUNT) ]]; then LPS3=$CPS3 if [[ $CLS1 -eq 0 || $CLS2 -eq 0 || $CLS3 -eq 0 ]]; then if [[ $LLS1 -eq 1 && $LLS2 -eq 0 && $LLS3 -eq 0 ]]; then elif [[ $LLS2 -eq 1 && $LLS1 -eq 0 && $LLS3 -eq 0 ]]; then elif [[ $LLS1 -eq 0 && $LLS2 -eq 0 && $LLS3 -eq 1 ]]; then elif [[ $LLS2 -eq 0 && $LLS3 -eq 1 && $LLS1 -eq 1 ]]; then elif [[ $LLS3 -eq 0 && $LLS2 -eq 1 && $LLS1 -eq 1 ]]; then elif [[ $LLS1 -eq 0 && $LLS2 -eq 1 && $LLS3 -eq 1 ]]; then elif [[ $LLS1 -eq 0 && $LLS2 -eq 0 && $LLS3 -eq 0 ]]; then |