segunda-feira, 3 de agosto de 2015

Balanceamento de links - Load balance + Failover + Failback (não foi testado)

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

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

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
   Fonte: http://www.vivaolinux.com.br/artigo/Balanceamento-de-links-Load-balance-Failover-Failback

Nenhum comentário:

Postar um comentário