A Aldeia Numaboa ancestral ainda está disponível para visitação. É a versão mais antiga da Aldeia que eu não quis simplesmente descartar depois de mais de 10 milhões de pageviews. Como diz a Sirley, nossa cozinheira e filósofa de plantão: "Misericórdia, ai que dó!"

Se você tiver curiosidade, o endereço é numaboa.net.br.

Leia mais...

Informática Numaboa - Linux

Roteamento em redes Linux

Qui

12

Abr

2007


22:39

(10 votos, média 4.80 de 5) 


Roteando para múltiplos uplinks/provedores

Uma configuração muito comum é a mostrada na Fig.1, na qual há dois provedores que conectam uma rede local (ou até mesmo uma única máquina) com a Internet.

Roteador

Geralmente existem dois pontos importantes nesta configuração: fracionamento de acesso e balanço de carga.

  • Fracionamento de acesso

A primeira tarefa é garantir que as respostas a pacotes vindos de um determinado provedor sejam roteadas para este mesmo provedor. Para isto vamos começar criando alguns nomes simbólicos. A primeira interface será chamada de $IF1 (if1 da figura acima) e a segunda de $IF2. O endereço IP da primeira interface será $IP1 e, o da segunda, $IP2. O endereço do gateway no Provedor 1 será $P1; o do segundo será $P2. Finalmente, $P1_NET será o nome da rede IP onde está $P1 e $P2_NET o nome da rede IP onde está $P2.

Bão... agora está na hora de criar duas tabelas de roteamento adicionais, a T1 e a T2. Estas tabelas devem ser adicionadas ao arquivo /etc/iproute2/rt_tables. Depois é só adicionar rotas nestas tabelas com o seguinte:

ip route add $P1_NET dev $IF1 src $IP1 table T1
ip route add default via $P1 table T1
ip route add $P2_NET dev $IF2 src $IP2 table T2
ip route add default via $P2 table T2

Até aqui, nada de excepcional. Criamos uma rota para o gateway e uma rota default que passa através deste gateway, mas as rotas devem ser colocadas em tabelas separadas, uma para cada provedor. Note que basta uma rota de rede porque ela permite encontrar qualquer host nesta rede, o que inclui o gateway (como especificado acima).

Depois é só caprichar na tabela de roteamento principal. Uma boa idéia é rotear coisas para o vizinho mais próximo através da interface conectada a este vizinho. Os argumentos "src" garantem que o endereço IP de saída seja selecionado.

ip route add $P1_NET dev $IF1 src $IP1
ip route add $P2_NET dev $IF2 src $IP2

Depois, vamos indicar a preferência para a rota default:

ip route add default via $P1

As regras de roteamento vêm a seguir. Estas regras determinam a tabela que deve ser usada para fazer o roteamento. Aqui é preciso indicar a interface de saída correta, de acordo com o endereço de origem. O conjunto de comandos a seguir garante que todas as respostas ao tráfego que chega através de uma determinada interface sejam despachadas pela mesma interface:

ip rule add from $IP1 table T1
ip rule add from $IP2 table T2

atencao Se $P0_NET for a rede local e $IF0 for sua interface, é aconselhável fazer as seguintes entradas adicionais:

ip route add $P0_NET     dev $IF0 table T1
ip route add $P2_NET     dev $IF2 table T1
ip route add 127.0.0.0/8 dev lo   table T1
ip route add $P0_NET     dev $IF0 table T2
ip route add $P1_NET     dev $IF1 table T2
ip route add 127.0.0.0/8 dev lo   table T2

Este exemplo é de uma configuração bem básica. Vai funcionar para todos os processos que estejam rodando no roteador, como também para a rede local se ela tiver uma máscara. Se não, então existe um espaço IP dos dois provedores ou há uma máscara para um dos provedores. Em ambos os casos é preciso adicionar regras que selecionem o provedor que fará o roteamento de saída de acordo com o endereço IP da máquina da rede local.

  • Balanceamento de carga

O segundo ponto importante é equilibrar o tráfego de saída dos dois provedores. Esta não é uma tarefa difícil se o fracionamento de acesso já estiver configurado.

Ao invés de escolher um dos provedores como rota default, podemos configurar a rota default como uma rota multi-caminho. No kernel padrão isto fará com que as rotas sejam balanceadas, isto é, sejam divididas entre os dois provedores de forma equilibrada. Continuando com o exemplo do fracionamento de acesso, a coisa fica assim:

ip route add default scope global nexthop via $P1 dev $IF1 weight 1 \
  nexthop via $P2 dev $IF2 weight 1

Isto vai dividir e equilibrar as rotas entre os dois provedores. Os parâmetros weight podem ser alterados para favorecer (ou penalizar smile ) um dos provedores.

Na prática este equilíbrio não é perfeito porque é baseado em rotas e as rotas vão para o cache. Como resultado, as rotas para os sites mais solicitados acabam passando sempre pelo mesmo provedor.

info Se você está pensando em botar o fracionamento de acesso e o balanço de carga para funcionar, talvez seja bom dar uma olhada na página de patches do Julian Anastasov's em http://www.ssi.bg/~ja/#routes. São patches ótimos que já facilitaram a vida de muita gente.

Informações adicionais