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!