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

Publicado por Marcelo Ferreira 25/06/2009

[ Hits: 16.289 ]

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

space2sep (Trocar arquivos com espaço "\ ")

Relógio psicodélico em modo texto

Verificando quais hosts estão ativos na rede

chwall.sh

Script para formatação de disquetes em modo texto


  

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