Balanceamento e Redundância utilizando 2 Links Speedy (ip fixo)

Publicado por Marcelo Ferreira 25/06/2009

[ Hits: 16.306 ]

Download balanceamento_e_redundancia.sh




O script tem a função de realizar o balanceamento e redundância através de 2 Links Speedy
(ip fixo). A idéia é deixar agendado a execução do script, por exemplo, a cada 30 minutos,
verificando se os links estão ativos.

Quando os dois links estiverem funcionando será realizado o balanceamento do acesso a
internet. Em caso de queda dos links será desativado o balanceamento, passando o acesso ao
link ativo.

  



Esconder código-fonte

# Criado em 11/07/2008 por Marcelo Ferreira(Ten Ferreira)-marceferreira@hotmail.com
# Alterado em 24/06/2009 por Marcelo Ferreira(Ten Ferreira)-marceferreira@hotmail.com
#
#!/bin/bash

###################
# Balanceamento e Redundancia com 2 Links de internet SPEEDY

######################
echo "Carregando modulos"
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
modprobe ipt_mark
modprobe ipt_MARK
#
echo "Habilitar FORWARD"
echo "1" > /proc/sys/net/ipv4/ip_forward
#
echo "Habilitar roteamento com 2 links"
echo "0" > /proc/sys/net/ipv4/conf/default/rp_filter
#
echo "Protecao Contra IP Spoofing"
for i in /proc/sys/net/ipv4/conf/*/rp_filter; do
    echo 1 >$i
done

###################
echo "Definicao de variaveis"
GWSPEEDY1="200.204.157.1"
GWSPEEDY2="200.171.248.1"
GWLOCAL="192.168.10.2"
#
IPSPEEDY1="200.204.157.192"
IPSPEEDY2="200.171.248.36"
#
REDESPEEDY1="200.204.157.0/24"
REDESPEEDY2="200.171.248.0/24"
#
PLACASPEEDY1="eth2"
PLACASPEEDY2="eth1"
#
ROTADEL="route del default gw"
ROTAADD="ip route add"
TABLEFLUSH="ip route flush table"
#
APAGAROTAS=`
# GWSPEEDY2
route del -net 200.171.248.0 netmask 255.255.255.0 dev eth1
route add -net 200.171.248.0 netmask 255.255.255.0 gw 200.171.248.36 dev eth1
# GWSPEEDY1
route del -net 200.204.157.0 netmask 255.255.255.0 dev eth2
route add -net 200.204.157.0 netmask 255.255.255.0 gw 200.204.157.192 dev eth2
# REDELOCAL
route del -net 192.168.10.0 netmask 255.255.255.0 dev eth5
route add -net 192.168.10.0 netmask 255.255.255.0 gw 192.168.10.1 dev eth5
`
#
ROTAS2LINKS=`
# Removendo_rotas
$ROTADEL $GWSPEEDY1
$ROTADEL $GWSPEEDY2
# Limpando Rotas das tabelas definidas em /etc/iproute2/rt_tables
$TABLEFLUSH speedy1
$TABLEFLUSH speedy2
# Adicionando Rotas
$ROTAADD $REDESPEEDY1 dev $PLACASPEEDY1 src $IPSPEEDY1 table speedy1
$ROTAADD default via $GWSPEEDY1 dev $PLACASPEEDY1 table speedy1
$ROTAADD $REDESPEEDY2 dev $PLACASPEEDY2 src $IPSPEEDY2 table speedy2
$ROTAADD default via $GWSPEEDY2 dev $PLACASPEEDY2 table speedy2
# Limpando e adicionando rules as tabelas definidas em /etc/iproute2/rt_tables
ip rule del lookup speedy1
ip rule del lookup speedy2
ip rule add from $IPSPEEDY1 table speedy1
ip rule add from $IPSPEEDY2 table speedy2`

###################
echo "substituindo rotas"
$APAGAROTAS

###################
#A regra abaixo é responsável pelo balanceamento com os 2 links (GWSPEEDY1 e GWSPEEDY2)
$ROTAS2LINKS
echo "Adicionando Rota Default para balanceamento entre os links $GWSPEEDY1 e $GWSPEEDY2 ($PLACASPEEDY1+$PLACASPEEDY2)" > /tmp/rotas.log
$ROTAADD default scope global nexthop via $GWSPEEDY1 dev $PLACASPEEDY1 nexthop via $GWSPEEDY2 dev $PLACASPEEDY2
ip route flush cache #Limpa as rotas no cache

###################
# $?=0 link estah up ou $?=1 link estah down
echo "Teste de conexao aos links de internet"
ping 4.2.2.2 -c 2 -I $PLACASPEEDY1 ; TESTESPEEDY1=$?
ping 4.2.2.2 -c 2 -I $PLACASPEEDY2 ; TESTESPEEDY2=$?

###################
#A regra abaixo informa que nao ha conexao ou link
if [[ $TESTESPEEDY1 -eq 1 && $TESTESPEEDY2 -eq 1 ]]; then
echo "!!!!!!!!!Atencao nao ha conexao com a internet!!!!!!!!!" > /tmp/rotas.log

###################
#A regra abaixo é responsável pelo balanceamento soh com o link GWSPEEDY1
elif [[ $TESTESPEEDY1 -eq 0 && $TESTESPEEDY2 -eq 1 ]]; then
echo "Adicionando Rota Default para balanceamento soh com o link $GWSPEEDY1 ($PLACASPEEDY1)" > /tmp/rotas.log
$ROTADEL $GWSPEEDY1
$ROTADEL $GWSPEEDY2
$TABLEFLUSH speedy2
$ROTAADD default scope global via $GWSPEEDY1 dev $PLACASPEEDY1
ip route flush cache #Limpa as rotas no cache

###################
#A regra abaixo é responsável pelo balanceamento soh com o link GWSPEEDY2
elif [[ $TESTESPEEDY1 -eq 1 && $TESTESPEEDY2 -eq 0 ]]; then
echo "Adicionando Rota Default para balanceamento soh com o link $GWSPEEDY2 ($PLACASPEEDY2)" > /tmp/rotas.log
$ROTADEL $GWSPEEDY1
$ROTADEL $GWSPEEDY2
$TABLEFLUSH speedy1
$ROTAADD default scope global via $GWSPEEDY2 dev $PLACASPEEDY2
ip route flush cache #Limpa as rotas no cache
fi

Scripts recomendados

Compilação automática do kernel Linux-libre 3.14.16

tagman - Editor de tags

Desligar o servidor quando todas as estações estiverem desligadas

The Universal Argument Parser (with long options)

LIMPEZA DE SISTEMA


  

Comentários
[1] Comentário enviado por nox6000 em 30/08/2009 - 17:19h

Ola Marcelo Ferreira,

Eu sou um usuário de nivel basico para intermetiario do linux
já faço algumas coisas leguais no linux, mas não to conseguindo realizar o balanceamento entre dois links de internet

Minha situação:

Tenho um modem do velox 1MB de IP: 192.168.254.254
Tenho outro modem do velox 1MB de IP: 192.168.1.1

onde:

O primeiro modem é ligado na placa eth0 de ip: 192.168.254.1
O segundo modem é ligado na placa eth1 de ip: 192.168.254.2
e a terceira placa eth2 deve liberar o sinal de internet para a rede ela tm o ip 192.168.254.3

Bem o que eu desejo e receber os dois linkes em suas repectivas placas de rede e libera-lo pela eth2 de ip 192.168.254.3
Só Lembrando:
Não tenho ip fixos, tipo doda hora que estabelece a conecxão o modem ganha um ip diferente.

Utilizo o ubuntu desktop 9.04 tem como me passar o que devo fazer ou um artigo que me informe como fazer isso?

Desde já muito Obrigado!

[2] Comentário enviado por marceferreira em 01/09/2009 - 10:53h

Bom dia,
no seu caso como não há ip fixo substitua as variáveis do script conforme segue abaixo:

DE:
GWSPEEDY1="200.204.157.1"
GWSPEEDY2="200.171.248.1"

PARA:
GWSPEEDY1=echo `ifconfig eth0 | grep end.: | cut -d ":" -f 2 | tr -d a-z,A-Z,-`
GWSPEEDY2=echo `ifconfig eth1 | grep end.: | cut -d ":" -f 2 | tr -d a-z,A-Z,-`

Viva a Liberdade

[3] Comentário enviado por marceferreira em 07/09/2009 - 19:49h

como não há ip fixo substitua as variáveis do script conforme segue abaixo:

DE:
GWSPEEDY1="200.204.157.1"
GWSPEEDY2="200.171.248.1"

PARA:
GWSPEEDY1=ifconfig eth0 | grep end.: | awk '{print $3}'
GWSPEEDY2=ifconfig eth1 | grep end.: | awk '{print $3}'

Viva a liberdade

[4] Comentário enviado por ahdeerre em 28/10/2010 - 14:55h

Boa tarde amigo, obrigado pela dica, consegui fazer funcionar estou tento apenas um problema: não consigo distribuir para a rede interna.
Minhas configurações estão da seguinte maneira:

eth0= rede local
eth1= link 1
eth2= link 2
Tenho no arquivo de firewall.sh uma regra de cadeia de reenvio, porém essa regra me permite transmitir para a rede interna apenas um dos links (eth1 ou eth2). Se deixar configurado a eth1 nessa regra quando o link da eth2 assumir a rede interna não terá mais acesso a internet.
Poderia me dar uma ajuda de como fazer com que meu firewall passe para a rede interna tanto a eth1 quanto a eth2?

Obrigado.

[5] Comentário enviado por juvaraide em 09/05/2012 - 13:30h

Boa tarde, marceferreira.

Possuo 3 interfaces:
- eth0 - link 1
- eth1 - link 2
- eth2 - Rede interna.

Tenho 2 adsl(bridge), quero fazer redundância da seguinte forma:

- Link 1 = principal
- Link 2 = secundário

Onde, se o link 1 cair, o link 2 irá assumir sem que os usuários percebam, e quando o link 1 voltar, ele assuma automaticamente deixando o link 2 de backup novamente.

Não quero fazer balanceamento dos links, apenas redundância.

Estou tentando usar seu script mas, da erro.

Carregando modulos
Habilitar roteamento com 2 links
Protecao Contra IP Spoofing
Definicao de variaveis
/etc/init.d/redundancia: line 23: eth0: command not found - coloquei GWSPEEDY1=ifconfig eth0 | grep end.: | awk '{print $3}'
/etc/init.d/redundancia: line 24: eth1: command not found - coloquei GWSPEEDY2=ifconfig eth1 | grep end.: | awk '{print $3}'
SIOCDELRT: No such process
SIOCADDRT: No such process
Usage: inet_route [-vF] del {-host|-net} Target[/prefix] [gw Gw] [metric M] [[dev] If]
inet_route [-vF] add {-host|-net} Target[/prefix] [gw Gw] [metric M]
[netmask N] [mss Mss] [window W] [irtt I]
[mod] [dyn] [reinstate] [[dev] If]
inet_route [-vF] add {-host|-net} Target[/prefix] [metric M] reject
inet_route [-FC] flush NOT supported
Usage: inet_route [-vF] del {-host|-net} Target[/prefix] [gw Gw] [metric M] [[dev] If]
inet_route [-vF] add {-host|-net} Target[/prefix] [gw Gw] [metric M]
[netmask N] [mss Mss] [window W] [irtt I]
[mod] [dyn] [reinstate] [[dev] If]
inet_route [-vF] add {-host|-net} Target[/prefix] [metric M] reject
inet_route [-FC] flush NOT supported
Error: an inet address is expected rather than "dev".
RTNETLINK answers: Invalid argument
Error: an inet address is expected rather than "dev".
substituindo rotas
Error: an IP address is expected rather than "dev"
Teste de conexao aos links de internet
PING 4.2.2.2 (4.2.2.2) from 192.168.1.2 eth0: 56(84) bytes of data.
From 192.168.1.2 icmp_seq=1 Destination Host Unreachable
From 192.168.1.2 icmp_seq=2 Destination Host Unreachable

--- 4.2.2.2 ping statistics ---
2 packets transmitted, 0 received, +2 errors, 100% packet loss, time 1007ms
pipe 2
PING 4.2.2.2 (4.2.2.2) from 192.168.0.254 eth1: 56(84) bytes of data.
From 192.168.0.254 icmp_seq=1 Destination Host Unreachable
From 192.168.0.254 icmp_seq=2 Destination Host Unreachable

--- 4.2.2.2 ping statistics ---
2 packets transmitted, 0 received, +2 errors, 100% packet loss, time 1008ms
pipe 2

[6] Comentário enviado por pauloh_lopes em 17/12/2012 - 21:01h

cara, tenho 1 speedy de 4mb e 1 speedy de 8mb, fazendo esse script, quando um terminal meu fazer um download, ele vai fazer download mais rapido? vai unir os 2 speedys? obrigado


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts