Balanceamento de links - Load balance + Failover + Failback
Após diversos artigos/tutorias seguidos passo a passo e sem resultado, me vi na situação desesperada de não conseguir fazer funcionar:
- Balanceamento de links de internet (load balance).
- Migração de links em caso de queda de um link (failover).
- Restauração do link que voltou a funcionar (failback).
Como minha necessidade era urgente adquiri o Roteador TP-Link TL-R470T, que me permitiu usufruir de todas essas funcionalidades, posso dizer que só tenho elogios ao mesmo. No entanto sempre tive o desejo de fazer funcionar com minhas próprias mãos e utilizando o GNU/Linux. Após muito tempo com inúmeras tentativas conseguir fazer funcionar todas essas funções, neste artigo mostrarei como fazê-las.
Este artigo será dividido em partes, de modo que, seguido todos os passos ou até apenas um, o leitor terá a capacidade de implementá-los. Todos os dados/comandos utilizados neste artigo foram obtidos da internet durante os últimos anos, desta forma existem dezenas de partes adquiridas de fontes diversas e algumas funções desenvolvidas por mim.
Primeiramente trabalharemos com o balanceamento de carga, permitindo que uma rede utilize dois links ou mais ao mesmo tempo. A maioria dos artigos não deixa claro os requisitos e as configurações para o correto funcionamento do balanceamento de carga. Mostraremos aqui todos os detalhes de modo que qualquer pessoa que seguir esse artigo possa implementar todos as funções de forma eficaz.
Requisitos:
- iproute2
- iptables
Configurações:
Criar as tabelas no arquivo rt_tables localizado em /etc/iproute2/rt_tables. Adicionando duas novas tabelas, como exemplo criaremos as duas tabelas abaixo, sabendo que as tabelas deve conter um número de identificação e o nome:
200 nome_tabela_1
201 nome_tabela_2
201 nome_tabela_2
Observação: não defina nenhum gateway na configuração das placas de rede, pois o balanceamento não será reconhecido e o sistema utilizará apenas o gateway default.
Utilizaremos como base uma pasta criada na raiz do sistema com o nome internet, onde ficaram os arquivos para balanceamento de link e migração de link, ficando assim:
- /internet/
BALANCEAMENTO DE LINKS DE INTERNET (LOAD BALANCE)
Para o script de balanceamento de carga, crie um novo arquivo com o nome "balanceamento.sh" na pasta padrão, sendo o arquivo acessado pelo seguinte endereço:- /internet/balanceamento.sh
Conteúdo do arquivo "balanceamento.sh":
# Dados da interfaces de rede conectadas com a internet - Link 1
placa_rede_1=eth0
tabela_1=nome_tabela_1
gateway_1=192.168.0.1
peso_balanceamento_link_1=30
# Dados da interfaces de rede conectadas com a internet - Link 2
placa_rede_2=eth1
tabela_2=nome_tabela_2
gateway_2=192.168.1.1
peso_balanceamento_link_2=70
# Dados da Rede Interna
placa_rede_interna=eth2
rede_interna=10.0.0.0/24
### Fim das Variáveis
#Carregar módulos
modprobe iptable_nat
modprobe ip_nat_ftp
modprobe ipt_MARK
echo 1 > /proc/sys/net/ipv4/tcp_syncookies
echo 1 > /proc/sys/net/ipv4/ip_forward
echo 1 > /proc/sys/net/ipv4/ip_dynaddr
# O uso do rp_filter faz o firewall sempre responder aos pacotes na mesma interface da qual eles foram originados, prevenindo previne ataques diversos tentem tirar proveito da regra que permite conexões na interface de loopback.
# No entanto faz com que o balanceamento seja menor, obrigando os pacotes irem sempre pelas mesmas interfaces
# Zero (0) para desativado e (1) para ativado
echo "1" > /proc/sys/net/ipv4/conf/default/rp_filter
echo "1" > /proc/sys/net/ipv4/conf/all/rp_filter
# Deletar a rota default
ip route del default
# Limpa as regras das tabelas
ip route flush table $tabela_1
ip route flush table $tabela_2
# Define a rota para as tabelas
ip route add default dev $placa_rede_1 via $gateway_1 table $tabela_1
ip route add default dev $placa_rede_2 via $gateway_2 table $tabela_2
# Define as regras para balanceamento dos links
ip route add default scope global nexthop via $gateway_1 dev $placa_rede_1 weight $peso_balanceamento_link_1 nexthop via $gateway_2 dev $placa_rede_2 weight $peso_balanceamento_link_2
# Aplicar as regras
ip route flush cache
# Compartilha a conexão
iptables -t nat -A POSTROUTING -o $placa_rede_1 -j MASQUERADE
iptables -t nat -A POSTROUTING -o $placa_rede_2 -j MASQUERADE
placa_rede_1=eth0
tabela_1=nome_tabela_1
gateway_1=192.168.0.1
peso_balanceamento_link_1=30
# Dados da interfaces de rede conectadas com a internet - Link 2
placa_rede_2=eth1
tabela_2=nome_tabela_2
gateway_2=192.168.1.1
peso_balanceamento_link_2=70
# Dados da Rede Interna
placa_rede_interna=eth2
rede_interna=10.0.0.0/24
### Fim das Variáveis
#Carregar módulos
modprobe iptable_nat
modprobe ip_nat_ftp
modprobe ipt_MARK
echo 1 > /proc/sys/net/ipv4/tcp_syncookies
echo 1 > /proc/sys/net/ipv4/ip_forward
echo 1 > /proc/sys/net/ipv4/ip_dynaddr
# O uso do rp_filter faz o firewall sempre responder aos pacotes na mesma interface da qual eles foram originados, prevenindo previne ataques diversos tentem tirar proveito da regra que permite conexões na interface de loopback.
# No entanto faz com que o balanceamento seja menor, obrigando os pacotes irem sempre pelas mesmas interfaces
# Zero (0) para desativado e (1) para ativado
echo "1" > /proc/sys/net/ipv4/conf/default/rp_filter
echo "1" > /proc/sys/net/ipv4/conf/all/rp_filter
# Deletar a rota default
ip route del default
# Limpa as regras das tabelas
ip route flush table $tabela_1
ip route flush table $tabela_2
# Define a rota para as tabelas
ip route add default dev $placa_rede_1 via $gateway_1 table $tabela_1
ip route add default dev $placa_rede_2 via $gateway_2 table $tabela_2
# Define as regras para balanceamento dos links
ip route add default scope global nexthop via $gateway_1 dev $placa_rede_1 weight $peso_balanceamento_link_1 nexthop via $gateway_2 dev $placa_rede_2 weight $peso_balanceamento_link_2
# Aplicar as regras
ip route flush cache
# Compartilha a conexão
iptables -t nat -A POSTROUTING -o $placa_rede_1 -j MASQUERADE
iptables -t nat -A POSTROUTING -o $placa_rede_2 -j MASQUERADE
MIGRAÇÃO E RESTAURAÇÃO DE LINKS EM CASO DE QUEDAS (FAILOVER + FAILBACK)
Nos dias atuais a redundância de links de internet é fundamental na estabilidade das empresas, onde poucos minutos sem conexão geram prejuízos gigantescos. A cada dia pequenas, médias e grandes empresas investem em tecnologias e redundância, com os links de acesso à internet não é diferente. Uma das dificuldades é como manter tudo funcionando e de forma redundante.Para o script de migração e restauração de links em caso de quedas, crie um novo arquivo com o nome "failover.sh" na pasta padrão, sendo o arquivo acessado pelo seguinte endereço:
- /internet/failover.sh.
#!/bin/bash
# Adicionar no rc.local nohup > /dev/null /internet/failover &
# Tempo esperado para testar a conexão novamente
tempo_espera=30
# Número de pacotes a ser pingados
numero_pacotes=2
# Nome das interfaces de rede conectadas com a internet
placa_rede_1=eth0
placa_rede_2=eth1
# Gateway das interfaces
gateway_1=192.168.0.1
gateway_2=192.168.1.1
# Endereço IP a ser pingado (8.8.8.8 é o DNS do Google)
endereco_ping=8.8.8.8
# Arquivo de balanceamento de links
arquivo=/internet/balanceamento.sh
# Não alterar nada daqui para baixo
# Variáveis destinadas ao controle
i=0
link1=1
link2=1
# Ativação do Balanceamento de Links
sh $arquivo > /dev/null
while [ $i -le 10 ];
do
if [ $link1 = 0 ] || [ $link2 = 0 ]; then
sh $arquivo > /dev/null
fi
if (ping -I $placa_rede_1 -c $numero_pacotes $endereco_ping > /dev/null)
then
link1="1"
else
ip route del default
ip route add default via $gateway_2
ip route flush cache
link1="0"
fi
if (ping -I $placa_rede_2 -c $numero_pacotes $endereco_ping > /dev/null)
then
link2="1"
else
ip route del default
ip route add default via $gateway_1
ip route flush cache
link2="0"
fi
sleep $tempo_espera
done
# Adicionar no rc.local nohup > /dev/null /internet/failover &
# Tempo esperado para testar a conexão novamente
tempo_espera=30
# Número de pacotes a ser pingados
numero_pacotes=2
# Nome das interfaces de rede conectadas com a internet
placa_rede_1=eth0
placa_rede_2=eth1
# Gateway das interfaces
gateway_1=192.168.0.1
gateway_2=192.168.1.1
# Endereço IP a ser pingado (8.8.8.8 é o DNS do Google)
endereco_ping=8.8.8.8
# Arquivo de balanceamento de links
arquivo=/internet/balanceamento.sh
# Não alterar nada daqui para baixo
# Variáveis destinadas ao controle
i=0
link1=1
link2=1
# Ativação do Balanceamento de Links
sh $arquivo > /dev/null
while [ $i -le 10 ];
do
if [ $link1 = 0 ] || [ $link2 = 0 ]; then
sh $arquivo > /dev/null
fi
if (ping -I $placa_rede_1 -c $numero_pacotes $endereco_ping > /dev/null)
then
link1="1"
else
ip route del default
ip route add default via $gateway_2
ip route flush cache
link1="0"
fi
if (ping -I $placa_rede_2 -c $numero_pacotes $endereco_ping > /dev/null)
then
link2="1"
else
ip route del default
ip route add default via $gateway_1
ip route flush cache
link2="0"
fi
sleep $tempo_espera
done
Nenhum comentário:
Postar um comentário