Balanceamento com 2 links ADSL
Olá comunidade Underlinux! Estou com o seguinte problema na qual irei descrever com bastante detalhe para que talvez alguem possa me ajudar, mas antes tenho algumas perguntas.
1 - Alguem aqui desse fórum já conseguiu fazer um balanceamento de carga entre 2 links ADSL? Já vi muitos por aí que dizem ter feito mas já estou a 1 mês tentando diversas soluções e nenhuma foi bem sucedida.
2 - Quais as ferramentas? Utilizei iproute2 com marcação de pacotes pelo iptables e tb não tive sucesso.
3 - É necessário alguma ferramenta extra ou algum patch no kernel alem do que já vem com o slackware 10.0? Algum protocolo de roteamento diferente?
O problema que estou tendo é óbvio, o 2º link não funciona, somente o default. E necessário apagar as rotas na tabela default? E mesmo quando rodo o script as rotas se perdem e todo o trafego na rede se perde.
Em fim segue abaixo uma descrição dos procedimentos que efetuei para que analizem.
tabelas criadas no rt_tables:
Código :
10 link1
11 link2
30 interna
Script usado:
Código :
#!/bin/bash
######################################
# Script de Configuração para #
# Balanceamento de Carga entre #
# 2 links ADSL #
######################################
# Definindo variaveis
IP1=192.168.0.2 # ip da interface ligada ao link 1
GW1=192.168.0.1 # ip do link 1
NET1=192.168.0.0/24 # rede 1
IF1=eth0 # placa de rede do link 1
IP2=192.168.157.1 # ip da interface ligada ao link 2
GW2=192.168.157.100 # ip do link 2
NET2=192.168.157.0/24 # rede 2
IF2=eth2 # placa de rede do link 2
RI=10.10.1.0/24 # ip da rede interna
# Carregando os modulos basicos:
echo -n "Carregando os modulos..."
modprobe ip_tables
modprobe iptable_filter
modprobe ip_conntrack
modprobe ip_conntrack_ftp
modprobe iptable_nat
modprobe ip_nat_ftp
modprobe ipt_LOG
modprobe ipt_state
modprobe ipt_MASQUERADE
echo " [OK]"
# Resetando o Firewall:
echo -n "Resetando o firewall..."
iptables -F
iptables -Z
iptables -X
iptables -t nat -F
#iptables -P INPUT DROP
#iptables -P FORWARD DROP
#iptables -P OUTPUT ACCEPT
echo " [OK]"
# Habilitando o roteamento de pacotes:
echo -n "Habilitando o roteamento..."
echo "1" > /proc/sys/net/ipv4/ip_forward
echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
echo " [OK]"
# Liberando a chain INPUT para o localhost:
echo -n "Liberando acesso do localhost..."
iptables -A INPUT -p ALL -s 127.0.0.1 -i lo -j ACCEPT
iptables -A INPUT -p ALL -s $RI -i lo -j ACCEPT
iptables -A INPUT -p ALL -s $IP1 -i lo -j ACCEPT
iptables -A INPUT -p ALL -s $IP2 -i lo -j ACCEPT
echo " [OK]"
# Otimizando o firewall:
echo -n "Otimizando o roteamento..."
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
echo " [OK]"
# Liberando resposta dos servidores DNS:
echo -n "Liberando servidores DNS..."
#iptables -A INPUT -p udp -s $RI --sport 53 -d $DNS1 -j ACCEPT
#iptables -A INPUT -p udp -s $RI --sport 53 -d $DNS2 -j ACCEPT
echo " [OK]"
# Descartar pacotes fragmentados:
echo -n "Bloqueando pacotes fragmentados..."
iptables -A INPUT -i $IF1 -f -j LOG --log-prefix "Pacote fragmentado: "
iptables -A INPUT -i $IF1 -f -j DROP
iptables -A INPUT -i $IF2 -f -j LOG --log-prefix "Pacote Fragmentado: "
iptables -A INPUT -i $IF2 -f -j DROP
echo " [OK]"
# Liberando alguns acessos por ping:
echo -n "Liberando acesso por ping..."
iptables -A INPUT -p icmp --icmp-type 8 -i $IF1 -j ACCEPT
iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT
iptables -A INPUT -p icmp -s $NET1 -d 0/0 -j ACCEPT
echo " [OK]"
# Regra para SSH: (opcional)
echo -n "Liberando acesso ao SSH..."
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
echo " [OK]"
# Regras do FORWARD
# Descarta pacotes invalidos:
echo -n "Descartando pacotes invalidos para reenvio..."
iptables -A FORWARD -m state --state INVALID -j DROP
echo " [OK]"
# Mantendo conexoes ativas:
echo -n "Manutencao de conexoes ativas..."
iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
echo " [OK]"
# Liberando acesso de dentro para fora
echo -n "Liberando FORWARDING"
iptables -A FORWARD -s $RI -j ACCEPT
#iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 80 -j REDIRECT --to-port 3128
echo " [OK]"
# Fazendo mascaramento de enderecos IP (NAO NAT):
echo -n "Habilitando o mascaramento..."
iptables -t nat -A POSTROUTING -j MASQUERADE
iptables -t nat -A POSTROUTING -o $IF1 -j MASQUERADE
iptables -t nat -A POSTROUTING -o $IF2 -j MASQUERADE
echo " [OK]"
# Marcando pacotes
echo -n "Marcando pacotes..."
iptables -A PREROUTING -t mangle -s $RI -d 0/0 -j MARK --set-mark 3
echo " [OK]"
# Desabilitando o filtro de pacotes do martian source
echo -n "Desligando rp_filter..."
for eee in /proc/sys/net/ipv4/conf/*/rp_filter; do
echo 0 > $eee
done
echo " [OK]"
# Definindo regras de balanceamento de Link:
echo -n "Balanceando links ADSL..."
# Link 1
ip route add $NET1 dev $IF1 src $IP1 table link1
ip route add default via $GW1 table link1
# Link 2
ip route add $NET2 dev $IF2 src $IP2 table link2
ip route add default via $GW2 table link2
# Colocando os links na tabela principal de roteamento
ip route add $NET1 dev $IF1 src $IP1
ip route add $NET2 dev $IF2 src $IP2
# setando a rota preferencial
ip route add default via $GW1
# regras das tabelas
ip rule add from $IP1 table link1
ip rule add from $IP2 table link2
# balanceamento de link
ip rule add fwmark 3 lookup interna prio 3
ip route add default table interna nexthop via $GW1 dev $IF1 \
weight 1 nexthop via $GW2 dev $IF2 weight 1
# flush no roteamento
ip route flush cache
echo " [OK]"
sleep 3
Espero que possamos discutir bem esse assunto, ou até mesmo montar-mos um tutorial para que os usuários fiquem mais esclarecidos a respeito desse assunto visto que é muito interessante alem de ser uma solução barata.
Agradeço a juda que puderem dar!
Balanceamento com 2 links ADSL
Maverick, eu sei que o Windows NT oferece este tipo de conexão, já vi isso a muito tempo atras, mas só funciona se o sistema do outro lado (Provedor, router,etc) disponibilizar esse tipo de conexão também. Infelizmente é tudo que sei sobre o assunto.
Balanceamento com 2 links ADSL
Cara te digo, ja tentei de tudo, não da, o unico jeito que da se não me engano eh se tiver mtos ips ae a provedora faz o balanceamento, usando AS se não me engano.
falows
Balanceamento com 2 links ADSL
Non pirem... balaceamento de link é uma coisa, agregacao de link é outra.
agregacao é onda as pontas precisam "chegar em um acordo", balanceamento nao, ou entao voce ta me dizendo que um pacote sai por um link e nao pode retornar por outro? se voce pensar que as rotas tem que ser obrigatoriamente simetrica voce esta enganado.
eu jah fiz isso faz um certo tempo com links ADSLs, _aparentemente_ seu script parece ok e tudo mais, mas na realidade voce so precisa dessa linha de fato:
ip route add default nexthop via ip.addr \
weight 1 nexthop via ip.addr weight 1
nao precisa ficar criando tabela, etc, etc, etc nem marcando pacote, voce esta somente balanceando os links de saidas, voce precisa _sim_ marcar o pacote quando voce quer fazer um QoS da vida ou marcar um pacote para sair sempre por um link, coisas nesse estilo, mas simplesmente para balancear o link, basta criar uma rota default com 2 nexthops (coisa que o route nao faz, so faz para uma)
bom jah falei muito, tente da maneira simples e veja se voce consegue, sem muitas regras de firewall nem nada... se conseguir, veja onde esta errando... ah.. nao espere que voce conseguia baixar usando somente um "download" uma taxa de 1Mbit, supondo q voce tem 2 links de 512k. Ai realmente nao vai funcionar legal.
Vou te dar uma dica onde voce deve ler, eu jah respondi essa pergunta nesse forum uma vez, pode pesquisar depois se quiser mas leia o seguinte: Adv-Routing-Howto (advanced routing howto), voce pode encontrar ele na tldp (www.tldp.org), ele cobre tanto load balance, quanto outros quesitos de roteamento avancado no linux, basta seguir passo a passo o howto que funciona legal.