Balanceamento de link + redundância

Há algum tempo peguei um servidor para fazer e em minhas pesquisas identifiquei a falta de material específico sobre esse assunto, então depois de conseguir configurar o servidor de balanceamento, resolvi postar aqui um passo a passo. Espero que gostem e que seja de grande utilidade.

[ Hits: 78.670 ]

Por: Perfil removido em 12/09/2009


Criando o script



Vamos começar a configurar o script de balanceamento.

Crie um script dentro de /usr/local/sbin com o nome balanceamento.sh e dê permissão de execução, isso pode ser feito com os seguintes comandos:

# touch /usr/local/bin/balanceamento.sh
# chmod +x /usr/local/bin/balanceamento.sh


Agora abra do arquivo com o comando vim para que possamos começar a criar nosso script de balanceamento.

# vim /usr/local/bin/balanceamento.sh

Com o script já aberto, vamos adicionar as seguintes linhas:

#!/bin/bash

# Aqui vamos adicionar as variáveis para uma melhor
# administração dos comandos no script

clear
echo "Definindo as variáveis..."
IPTABLES=iptables
mod=modprobe

# Aqui estamos adicionando as variáveis para o primeiro link de internet.
# LINK 1
NET_EXT_INT1=eth0 #aqui você coloca a interface de rede que é usada pelo seu primeiro link de internet
NET_EXT_SUB1=24 #aqui o 24 significa a máscara de rede, aconselho a não mexer
NET_EXT_IP1=200.200.200.100 #aqui você coloca o IP do seu primeiro link de internet
NET_EXT_GW1=200.200.200.1 #aqui você coloca o gateway do seu primeiro link de internet

# Aqui estamos adicionando as variáveis para o segundo link de internet.
# LINK 2
NET_EXT_INT2=eth1 #aqui você coloca a interface de rede que é usada pelo seu segundo link de internet
NET_EXT_SUB2=24 #aqui o 24 significa a máscara de rede, aconselho a não mexer
NET_EXT_IP2=80.80.80.100 #aqui você coloca o IP do seu segundo link de internet
NET_EXT_GW2=80.80.80.1 #aqui você coloca o gateway do seu segundo link de internet

# No meu caso estava com 2 redes internas, mas para o caso de quem tem apenas 1 rede interna, basta retirar as configurações de uma rede interna, tanto nas variáveis quanto nas regras dos comandos citados abaixo

# Aqui estaremos adicionando variáveis para a primeira rede interna
# Interface interna 1
NET_INT_INT1=eth2 #aqui você coloca a interface de rede que é usada pela sua primeira rede interna
NET_INT_IP1=10.1.1.1 #aqui você coloca o IP da sua primeira rede interna
NET_INT_SUB1=8 #aqui o 8 significa a máscara de rede, aconselho a não mexer
NET_INT_NET1=10.1.1.0 #aqui você esta configurando a sua rede interna, mesmo que você estipule um outro IP para sua rede interna, deixe sempre o 0 no fim

# Aqui estaremos adicionando variáveis para a segunda rede interna
# Interface interna 2
NET_INT_INT2=eth3 #aqui você coloca a interface de rede que é usada pela sua segunda rede interna
NET_INT_IP2=192.168.1.1 #aqui você coloca o IP da sua segunda rede interna
NET_INT_SUB2=24 #aqui o 24 significa a máscara de rede, aconselho a não mexer
NET_INT_NET2=192.168.1.0 #aqui você está configurando a sua rede interna, mesmo q você estipule um outro IP para sua rede interna, deixe sempre o 0 no fim

# Aqui você vai apenas carregar os módulos que usaremos no iptables
echo "Módulos carregados com sucesso!"
$mod ip_tables
$mod iptable_nat
$mod ip_conntrack
$mod ip_conntrack_ftp
$mod ip_nat_ftp
$mod ipt_LOG
$mod ipt_REJECT
$mod ipt_MASQUERADE

# Aqui apagaremos todas as rotas e comandos adicionados anteriormente, tanto no iproute que instalamos quanto no iptables
echo "limpando as Regras do Firewall..."
iptables -F
iptables -F -t nat
iptables -F -t mangle
iptables -X -t nat
iptables -X -t mangle
iptables -X
ip rule flush 2> /dev/null
ip route del default 2> /dev/null
ip ru add prio 32765 lookup main 2> /dev/null
ip ru add prio 32767 lookup default 2> /dev/null
ip route flush cache 2> /dev/null

# Atenção, nas linhas abaixo estaremos configurando a rede, estipulando IPs, adicionando os servidores DNS etc
echo "Configurando as interfaces de rede..."
ifconfig $NET_EXT_INT1 $NET_EXT_IP1/$NET_EXT_SUB1
ifconfig $NET_EXT_INT2 $NET_EXT_IP2/$NET_EXT_SUB2
ifconfig $NET_INT_INT1 $NET_INT_IP1/$NET_INT_SUB1
ifconfig $NET_INT_INT2 $NET_INT_IP2/$NET_INT_SUB2

echo "nameserver aqui você coloca o ip do seu servidor dns" > /etc/resolv.conf

# Aqui estaremos Liberando o acesso a Internet Para as Maquinas da Rede Local.
echo "Configurando o masquerade..."
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE
iptables -t nat -A POSTROUTING -o eth2 -j MASQUERADE
iptables -t nat -A POSTROUTING -o eth3 -j MASQUERADE

# Essa podemos dizer que é a principal regra do balanceamento, é aqui que é feito o balanceamento e a redundância dos links, se você quiser pode mudar o peso de cada link, isso possibilita a você estipular qual link será mais usado. Se tiver um link maior, opte por ele.
echo "Definindo regras de host..."
ip ro add default scope global equalize nexthop via $NET_EXT_GW1 weight 1 nexthop via $NET_EXT_GW2 weight 1

# Aqui estaremos criando logs de acesso pelo iptables, se quiser salvar os logs do iptables em um Lugar específico, basta configurar o syslog. Faça o seguinte, edite o arquivo que se localiza em /etc/syslog.conf Na linha Kern, mude o local para um de sua escolha
$IPTABLES -A INPUT -p tcp --dport 21 -j LOG --log-prefix "Serviço: FTP"
$IPTABLES -A INPUT -p tcp --dport 2121 -j LOG --log-prefix "Serviço: FTP"
$IPTABLES -A INPUT -p tcp --dport 22 -j LOG --log-prefix "Serviço: SSH"
$IPTABLES -A INPUT -p tcp --dport 110 -j LOG --log-prefix "Serviço: POP "
$IPTABLES -A INPUT -p tcp --dport 80 -j LOG --log-prefix "Serviço: HTTP "
$IPTABLES -A INPUT -p tcp --dport 25 -j LOG --log-prefix "Serviço: SMTP "
$IPTABLES -A INPUT -p tcp --dport 143 -j LOG --log-prefix "Serviço: IMAP "
$IPTABLES -A INPUT -p tcp --dport 1863 -j LOG --log-prefix "Serviço: MSN "
$IPTABLES -A INPUT -p tcp --dport 5190 -j LOG --log-prefix "Serviço: MSN"

# É importante que esse comando seja o último do script, nele você habilitará o roteamento no Kernel
echo "Habilitando roteamento.."
for i in /proc/sys/net/ipv4/conf/*/rp_filter; do
   echo "0" > $i
done
echo "1" > /proc/sys/net/ipv4/ip_forward

Bom pessoal, o script é esse, vamos para o próximo passo.

Página anterior     Próxima página

Páginas do artigo
   1. Preparando o servidor
   2. Criando o script
   3. Checando configurações
Outros artigos deste autor

Sudoers 1.8.12 - Parte I - Manual

Sudoers 1.8.12 - Parte II - Manual

Shell Script 1 - Básico

Configurando suporte Firebird no LAMP (xampp) em Lubuntu

Compilando o kernel no Slackware com pacotes pré-compilados

Leitura recomendada

Integrando Layer7 + IPP2P ao Iptables

Utilizando a ferramenta Iptstate

Servidor seguro com Bridge, Snort e Guardian

Instalando um firewall mínimo em Debian

Instalação do Layer7 no Debian Etch

  
Comentários
[1] Comentário enviado por wellington79 em 12/09/2009 - 13:59h

Muito bom !!! Adorei vou testar.

[2] Comentário enviado por removido em 12/09/2009 - 14:16h

Qualquer Duvida ou problema, meu email é lucas@hexato.com.br, se precisar de algo é só entrar em contato, ficarei feliz em ajudar.

[3] Comentário enviado por guilhermerezende em 12/09/2009 - 15:55h

Amigo, não funciona. Talvez você ainda não percebeu os problemas de irá enfrentar em conexões seguras e sites "balanceados". Esse método que está mostrando até funciona, com ip´s válidos e sem sofrer NAT. Eu estou a 5 anos procurando uma solução que balanceie conexões oriundas de NAT sem nenhum problema. Segue outro exemplo p/ pesquisa que ja tentei e tbm não consegui, enfrentando o mesmo problema citado acima. Da uma pesquisada e qualquer novidade poste aqui.
Abs!!!

# initialise two chains that will put the mark on the packet and keep it in memory
iptables -t mangle -N CONNMARK1
iptables -t mangle -A CONNMARK1 -j MARK --set-mark 1
iptables -t mangle -A CONNMARK1 -j CONNMARK --save-mark

iptables -t mangle -N CONNMARK2
iptables -t mangle -A CONNMARK2 -j MARK --set-mark 2
iptables -t mangle -A CONNMARK2 -j CONNMARK --save-mark

# get the mark on packet that belongs to an existing connection
iptables -t mangle -A PREROUTING -i eth0 -p tcp -m state --state ESTABLISHED,RELATED -j CONNMARK --restore-mark

# if the mark is zero if means the packet does not belongs to any existing connection
iptables -t mangle -A PREROUTING -p tcp -m state --state NEW -m statistic --mode nth --every 2 --packet 0 -j CONNMARK1
iptables -t mangle -A PREROUTING -p tcp -m state --state NEW -m statistic --mode nth --every 2 --packet 1 -j CONNMARK2

[4] Comentário enviado por removido em 12/09/2009 - 17:08h

Ola, não entendi exatamente sua duvida, voce só vai utilizar o MARK, se desejar estipular o link pelo qual cada pacote vai passar, mais poste aqui, ou me mande um email, explicando realmente o seu Problema.

Att
Lucas Ruan

[5] Comentário enviado por alexandre_mpm em 14/09/2009 - 10:39h

Cara parabens pelo seu artigo, gostei muito mesmo. Isso realmente funciona! Porem tem um problema que se vc acessar sites de banco a conexão fica caindo toda hora quase impossível de fazer uma transação bancária para resolver isso, tem que criar uma regra na tabela magle, marcando o pacote e depois indicar por qual interface vai sair. Ficaria mais ou menos assim:


iptables -A PREROUTING -t mangle -p tcp --dport 443 -d 0.0.0.0/0.0.0.0 -j MARK --set-mark 0x4

acredito que seja assim
ip rule fwmark 4 lookup (TABELA DE REGRAS)prio 3 >> /dev/null

[6] Comentário enviado por removido em 14/09/2009 - 10:44h

Ola, cara aqui utilizei desse modo e minha conexão com sites HTTPS continuaram funcionando perfeitamente...
Nessa Regra de MARK que vc sitou a cima, é para marcar os pacotes destinados a sites HTTPS saiam apenas por uma determinada Faixa de IP, no seu caso vc deve utilizar o Balanceamento em apenas uma rede Interna...

No meu caso tive que fazer em duas redes Internas, oq me Impossibilita a usar essa Regra..

Att
Lucas Ruan

[7] Comentário enviado por info24hs em 14/09/2009 - 11:56h

Amigo.. faltou a redundancia.. não encontrei ela.

[8] Comentário enviado por removido em 14/09/2009 - 13:42h

A redundancia em muita distribuições é feita apenas por essa regra :

ip ro add default scope global equalize nexthop via $NET_EXT_GW1 weight 1 nexthop via $NET_EXT_GW2 weight 1

abraçosss


Att

Lucas Ruan

[9] Comentário enviado por info24hs em 14/09/2009 - 14:50h

Amigo.. estas enganado, o comando ip route ... nexthop serve apenas para balancear a saída das conexões.. e quando um link cair como é que fica?

[10] Comentário enviado por removido em 14/09/2009 - 14:53h

Cara vc pode usar a seguinte regra se preferir, essa não esta 100% ainda, mais é só adicionar algumas regras e sera o bastante :


ROTALINK1=`xxx.xxx.xxx.xxx`
ROTALINK2=`yyy.yyy.yyy.yyy`

If ( ping –I eth0 www.terra.com.br –c 2) && ( ping –I eth2 www.terra.com.br –c 2);then
$LINK=`cat /var/log/link`
if [ $LINK == 0 ];then

Limpar rotas
Script_balanceamento_dois_links
echo >/var/log/link

fi

else
if (ping –I eth0 www.terra.com.br –c2 );then
Limpar rotas
route add default gw $ROTALINK1
echo 0 >/var/log/link
else
Limpar rotas
Route add default gw $ROTALINK2
echo 0 >/var/log/link

fi
fi

Acho que isso já da conta do recado…o ping –I pinga direto pela interface...o resto já fala por si só..
Da para melhorar, tipo status para link1, link2 ou dois links... nesse caso acima eu somente usei dois status 0 ou 1, para balanceamento ou algum link fora.



Faz um teste e me avisa.

Att


Lucas Ruan

[11] Comentário enviado por doomk em 25/09/2009 - 12:03h

elaborei um script de failover para redundância com 3 links de internet, no momento está a 6 meses em produção sem nenhum problema.

aki na empresa funciona da seguinte forma:

temos os seguintes links,

4mb - ajato
1mb - transit
12mb - virtua


conexões http,https - saem pelo virtua
conexões ssh - sai pelo transit
conexões ftp,email - saem pelo ajato

como temos uma banda muito boa pra saida de internet, não precisei me preocupar com balanceamento e sim com redundância, precisei elaborar um script que, caso um desses links caiam, automaticamente teria q ser feito um chaveamento, quase que imperceptível.

está rolando na boa, e faz um bom tempo que não ouço mais akela famosa frase: A INTERNET CAIU???? ESTAMOS SEM INTERNET???? CADE O MENININHO DO SUPORTE???? kkkk

quem tiver necessitanto de uma solução semelhante a minha, é só me contactar.


abraço a todos.

[12] Comentário enviado por eeds em 25/09/2011 - 02:30h

Exelente material me ajudou muito, só que o msn fica desconectando se você tiver uma solução eu agradeço muito .

[13] Comentário enviado por removido em 09/03/2012 - 14:50h

Amig LPI,

Lendo seu artigo Balanceamento de link + redundância, fiquei com uma dúvida: a redundância neste artigo é feita de que maneira ?

Se não foi postada como posso fazer essa redundância com base nas informações do artigo, pode me ajudar ?

Grato pela Atenção

Att

Edson de Abreu Oliveira

[14] Comentário enviado por afajalves em 25/04/2012 - 10:24h

Lucas, bom dia

Gostei muito do seu artigo mais tenho algumas duvidas.
teria como vc me passar seu e-mail ou me adicionar no Skype ou msn

Skype: in5_ajunior

msn: afajalves@uol.com.br



desde já agradeço e parabens pelo artigo

[15] Comentário enviado por hribeiro em 30/05/2012 - 08:30h

Parabens, gostei muito, nos meus testes aqui funcionou legal, só não tem redundância mesmo, mas vai um link aki do vol Afajalves

http://www.vivaolinux.com.br/artigo/Balanceamento-de-links-+-redundancia-+-acesso-remoto-+-sites-de-...

Da pra usar o script de redundancia numa boa.

[16] Comentário enviado por ronys00 em 13/12/2012 - 10:08h

Galera bom dia, implementei o esquema de balanceamento conforme o tutorial porem tive o seguinte problema:

O servidor que eu implementei é somente para DNS externo, nele tenho 2 dominios configurados e está tudo ok, como nenhuma maquina está usando esse servidor para as requisições http, pop etc em determinado momento um dos links deixa de responder, ai quando configuro alguma maquiana da rede para navegar por esse server ai o ip volta a responder. minha pergunta é existe algum script que eu possa implementar que por exemplo ping para alguns sites de tempo em tempo para que os 2 ips sempre respondam sem a necessidade das maquinas estarem navegando por esse servidor que implementei o balanceamento ?

Grato
Ronaldo

[17] Comentário enviado por joserf em 13/03/2013 - 16:05h

seguindo suas configurações a risca, qual ip gateway e dns configuro em uma maquina para testar?

[18] Comentário enviado por wellington79 em 13/03/2013 - 20:06h

Existe um script legal vc pode adapta-lo para sua rede procura por "gwping"

[19] Comentário enviado por clovisvellardo em 04/11/2013 - 16:21h

Muito bom o post, eu estou subindo um novo server aqui, mais tive problemas com o comando
ip ro add default scope global equalize nexthop via $NET_EXT_GW1 weight 1 nexthop via $NET_EXT_GW2 weight 1

Error: either "to" is duplicate, or "equalize" is a garbage.

Alguem teve esse mesmo problema e conseguiu solucionar??

Obrigado abraços

[20] Comentário enviado por clovisvellardo em 05/11/2013 - 12:16h

Consegui galera estava errado a numeração do $NET_EXT_GW2 e precisei colocar a dev tambem, ai funcionou numa boa...

[21] Comentário enviado por diegotesch em 16/01/2014 - 11:29h

clovisvellardo, voce poderia ser mais especifico quanto a forma na qual sanou o erro
estou enfrentando o mesmo problema e nao estou conseguindo resolver.
agradeço se puder ajudar desde ja.

[22] Comentário enviado por clovisvellardo em 16/01/2014 - 13:48h

Opa Diego acho que não foi muito esclarecedor meu comentário né...
O comando é:

ip ro add default scope global equalize nexthop via $NET_EXT_GW1 dev $NET_EXT_INT1 weight 1 nexthop via $NET_EXT_GW2 dev NET_EXT_INT2 weight 1

É só colocar a interface que ele para de dar o erro...
Abraços espero ter ajudado...

[23] Comentário enviado por cgonzagaskill em 14/02/2014 - 18:09h

Olá Amigão,

Sou iniciante no linux....

Olá lhe mandei um e-mail e preciso tirar uma duvida.. tenho um servidor com três placas de rede, sendo que uma delas está para rede local, e as demais estão em ambas conectadas em modens em bridge adsl. Pergunto, é possível realizar a redundância mas lembrando que preciso garantir o acesso externo remoto..

Atenciosamente

Carlos Gonzaga

[24] Comentário enviado por doomk em 14/02/2014 - 18:18h

cgonzagaskill, consegue sim!

Eu faço redundância aqui no meu trabalho com 4 links de internet, sendo que 1 link é adsl ip fixo, e o outro cable ip dinâmico....


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts