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

Responder a