Postado originalmente por
PEdroArthurJEdi
Como muitos tem dúvidas de como balancear o acesso a Internet por diversos links, resolvi escrever esse mini-howto para evitar a necessidade de novos post no fórum.
Vamos ao problema. Imaginemos um roteador rodando kernel GNU/Linux com as opções de roteamento avançado ativado. Este computador está conectado a N links dedicados. Desejamos balancear a carga das requisições entre esses N links. Sejam LIP0, LIP1, ... , LIPN os endereços IP atribuidos aos links, LIF0, LIF1, ... , LIFN as interfaces de rede, LNTW, LNTW1, ... , LNTWN as redes e LGW0, LGW1, ... , LGWN os gateways de cada link.
Primeiramente devemos criar N tabelas de roteamento, onde N é o número total de links que o gateway possui:
echo 10 tb0 >> /etc/iproute2/rt_tables
echo 11 tb1 >> /etc/iproute2/rt_tables
...
echo XX tbN >> /etc/iproute2/rt_tables
Feito isso, devemos atribuir as redes dos links as suas respectivas tabelas de roteamento:
ip route add LNTW0 dev LIF0 src LIP0 table tb0
ip route add to 0/0 via LGW0 table tb0
ip route add LNTW1 dev LIF1 src LIP1 table tb1
ip route add to 0/0 via LGW1 table tb1
...
ip route add LNTWN dev LIFN src LIPN table tbN
ip route add to 0/0 via LGWN table tbN
deve-se, também, incluir informações sobre a rede local:
ip route add LOCALNET dev IFLOCALNET table tb0
ip route add LOCALNET dev IFLOCALNET table tb1
...
ip route add LOCALNET dev IFLOCALNET table tbN
obs: todas as redes locais devem estar presentes em todas as tabelas!!!
Agora, devemos definir as rotas das redes através da tabela padrão:
ip route add LNTW0 dev LIF0 src LIP0
ip route add LNTW1 dev LIF1 src LIP1
...
ip route add LNTWN dev LIFN src LIPN
obs: se você está com seus link configurados através dos arquivos de configuração das distribuiçoes, a etapa anterior pode ser omitida. Basicamente se ao tentar inserir uma rota na tabela padrão, e a mesma já existir você receberá a seguinte mensagem:
RTNETLINK answers: File exists
Agora você adiciona regras que decidem por onde os pacotes de vem passar:
ip rule add from LIP0 table tb0
ip rule add from LIP1 table tb1
...
ip rule add from LIPN table tbN
Por ultimo, porém o não menos importante, na verdade escencial pois até agora não fizemos nada... Devemos definir o balanceamento de carga:
ip route add to 0/0 nexthop via LGW0 dev LIF0 weight 1 nexthop via LGW1 dev LIF1 weight 1 ... nexthop via LGWN dev LIFN weight 1
Note que o parâmetro weight pode ser explorado para atribuir maior prioridade de envio por um provedor. E você também pode (deve) atribuir um link padrão:
ip route add to 0/0 via LGWP
Bem, pronto... Agora apenas algumas considerações...
O kernel mantém tabelas de roteamento estátcas, portanto, se N pessoas tentarem acessar o site
Google por exemplo, todas as tentativas de conexão sairão pelo mesmo link.
Existem alguns patchs disponíveis para melhorar o mecanismo de roteamento. Procurem, informem-se e vejam se são adequados as suas realidades.
Com o uso de regras de roteamento (ip rule) você pode definir qual link padrão para a saída de pacotes de uma determinada rede. Ex:
ip rule add from 10.1.0.0/24 table tb0
ip rule add from 10.2.0.0/24 table tb1
Pode-se. também, dividir por seviços. ex:
iptables -t mangle -A PREROUTING -i LOCALNET -p tcp --dport 21 -j MARK --set-mark 0x60
ip rule add fwmark 0x60 table tbN
Só isso... fiz este post com o intuíto dele se tornar permanente... espero que os moderadores aceitem...