Olá pessoal.
Faz tempo que não venho aqui (desde 2003, acho).
Aquela coisa que dizem que o cabra só liga pros amigos quando está precisando
(a friend in need is a friend indeed) é verdadeira.
Desculpem, então, o mau jeito e o "ir direto ao ponto".
Antes de descrever meu problema, quero dizer que já li alguns dos documentos
pertinentes sobre o assunto:
- LARTC: Linux Advanced Routing Howto (www.lartc.org)
- IP-Cref: IP command reference (Alexey Kuznetsov)
- Página do Zago - Route.txt
- Multipath Nano-HOWTO (Christoph Simon)
- Dead Gateway Detection Usage (Julian Anastazov)
- Estudo de cazo XYZ (Elvis Pfutzenreuter)
- Vários howtos e scripts pela aí...
Bom, meu problema é o seguinte:
Estou tentando configurar um roteador multirotas com load balance Linux.
Estou usando Debian Etch (mas já testei com o Sarge), kernel 2.6.17-11
que vem com o Etch e sem nenhum patch aplicado (não apliquei o patch
do Julian Anastazov para Dead Gateway Detection).
Estou usando um script com iproute2 e iptables. O script está
reproduzido abaixo, depois da minha assinatura.
A máquina tem três placas de rede. eth2 está ligada à rede interna
(192.168.0.0), eth1 ligada no Giro, eth0 ligada no BR Turbo. O desenho
abaixo ilustra a situação (se você não conseguir enxergar o desenho,
copie e cole no OpenOffice ou Word e mude a fonte para Bitstream Vera
Sans Mono ou Courier New).
Provedor 1 ________
200.200.200.1 +------------+ /
| | |
+--+ Giro +-------
__ Roteador Linux | | | /
___/ \_ +------+-------+ | +------------+ |
_/ \__ | eth0|--+ /
/ \ | |200.200.200.200 |
| REDE LOCAL -----+ eth2 | | Internet
\_192.168.0.0_/ | |100.100.100.100 |
\__ __/ | eth1|--+ \
\___/ +------+-------+ | +------------+ |
| | | \
+--+ BR Turbo +-------
| | |
100.100.100.254 +------------+ |
Provedor 2 \________
###
As características que eu quero são
- Failover (se uma linha cair a outra assume)
- Load balancing
- Parte do tráfego indo por uma rota exclusiva (fixed route)
- Firewall com Shorewall
###
O que eu já tenho funcionando:
- Shorewall
Configurar esse negócio é moleza.
- Fixed (split) route
Essa é fácil, basta seguir o que está no LARTC
Alguns grupos de máquinas acessam sempre pelo BR Turbo,
outros sempre pelo Giro.
###
O que NÃO está funcionando (O PROBLEMA)
- Failover local
Se eth0 perde o link, o tráfego salta para eth1 (isso está certo)
Se eth1 perde o link, O TRÁFEGO NÃO VAI PARA A eth0
- Failover distante
Se a rota ficar inacessível (mesmo que o link entre eth0/eth1
e o provedor esteja OK) o kernel não tem como detectar a falha.
Isso é esperado porque não apliquei o patch de Julian Anastasov.
- Load balancing
Não funciona de jeito nenhum. O tráfego não é equilibrado entre as
duas bandas.
Deveria funcionar MESMO sem o patch do JA.
###
PERGUNTAS
- O que estou fazendo de errado com relação ao faiover? (veja o script
logo abaixo)
- O que estou fazendo de errado com relação ao load balancing?
- Além de Dead Gateway Detection (DGD), o que mais o patch do JA faz?
- Por que diabos esse patch, antigo pra chuchu (existe desde o kernel 2.2)
ainda não entrou no kernel oficial?
- Segundo algo que li na página do Zago, mais precisamente de Rejaine da JAMEF,
é preciso recompilar o kernel para desativar a opção
CONFIG_IP_ROUTE_MULTIPATH_CACHED.
Confere? Se eu não desativar isso, o que acontece?
Pode ser que seja esse o meu problema.
Segue o script que usei. Ele é uma amálgama de vários scripts
semelhantes, inclusive o mpath.sh do Christoph Simon e o do Julian
Anastasov.
--
Henrique
We've always had him!
http://www.ericblumrich.com/thanks.html
------------INICIO SCRIPT-------------
#!/bin/bash
echo "Configurando Variaveis..."
IPTABLES=iptables
IP=ip
PING=ping
# RUA A
EXTIF1=eth0
EXTIP1=200.200.200.200
EXTM1=24
EXTGW1=200.200.200.1
# RUA B
EXTIF2=eth1
EXTIP2=100.100.100.100
EXTM2=24
EXTGW2=100.100.100.254
${IP} route add default equalize proto static \
nexthop via ${EXTGW1} dev ${EXTIF1} weight 1 \
nexthop via ${EXTGW2} dev ${EXTIF2} weight 1
${IP} route flush cache
echo "Desabilitando filtro de caminho reverso..."
echo 0 > /proc/sys/net/ipv4/conf/$EXTIF1/rp_filter
echo 0 > /proc/sys/net/ipv4/conf/$EXTIF2/rp_filter
echo "Habilitando repasse de IP..."
echo 1 > /proc/sys/net/ipv4/ip_forward
echo "Reduzindo o timeout de conexão do gateway..."
echo 5 > /proc/sys/net/ipv4/route/gc_timeout
echo "Iniciando SOURCE NAT para ambos os provedores..."
$IPTABLES -t nat -A POSTROUTING -o ${EXTIF1} -j SNAT --to ${EXTIP1}
$IPTABLES -t nat -A POSTROUTING -o ${EXTIF2} -j SNAT --to ${EXTIP2}
---------------------------------------------------------------------------
Esta lista é patrocinada pela Conectiva S.A. Visite http://www.conectiva.com.br
Arquivo: http://bazar2.conectiva.com.br/mailman/listinfo/linux-br
Regras de utilização da lista: http://linux-br.conectiva.com.br
FAQ: http://www.zago.eti.br/menu.html