Balancemento de carga - Introdução
Nesse exemplo temos dois links WAN, mas podemos utilizar a mesma configuração para 3 ou mais, apenas adicionando tabelas e configuração no arquivo final.
Nessa imagem temos dois links de diferente capacidades que terá prioridade diferentes, onde a cada fileira de 4 pacotes 3 passarão pela internet1 quanto que o outro passará pela internet2. Portanto 75% da carga na tabela link1 e os outros 25% da carga para tabela link2.
Infraestrutura
O nosso Gateway possui 3 placas de rede
- eth0 -- 10.0.2.15/24 - gateway 10.0.2.2
- eth1 -- 10.0.3.15/24 - gateway 10.0.3.2
- eth2 -- 192.168.0.1 - Rede local com a qual iremos compartilhar
Nosso Gateway precisa ter aquelas configurações padrões de FORWARD e MASQUARADE:
# echo "iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE" >> /etc/rc.local
# echo 1 > /proc/sys/net/ipv4/ip_forward
# vi /etc/sysctl.conf
net.ipv4.ip_forward=1
Atentando a sempre deixar as configurações como definitiva.
Configuração Tabelas
O que iremos realizar é a criação de duas tabelas de roteamento sendo que cada uma será agregada a uma interface WAN.
Iremos editar o arquivo "/etc/iproute2/rt_tables" no arquivo adicione as duas linhas referente a identificação da tabela e o nome dela:
# vi /etc/iproute2/rt_tables
200 link1
210 link2
Após salvar e sair do arquivo as tabelas já estarão prontas, visualizando com:
# ip route show table link1
# ip route show table link2
Agora utilizaremos um guia para elaboração das tabelas que podemos
Interface eth0, tem endereço 10.0.2.15 e mascara 255.255.255.0 e gateway dessa placa é 10.0.2.2.
Interface eth1, tem endereço 10.0.3.15 e mascara 255.255.255.0 e gateway dessa placa é 10.0.3.2.
Agora iremos configurar as duas tabelas, está é a configuração da link1:
# ip route add 255.255.255.0 dev eth0 src 10.0.2.15 table link1
# ip route add default via 10.0.2.2 table link1
# ip route add 127.0.0.0/8 dev lo table link1
Essa configuração é bem simples, seria uma configuração parecida com a tabela padrão que possuimos.
Está configuração da link2:
# ip route add 255.255.255.0 dev eth1 src 10.0.3.15 table link2
# ip route add default via 10.0.3.2 table link2
# ip route add 127.0.0.0/8 dev lo table link2
Realizamos a mesma configuração na outra tabela, para que os pacotes se guie.
Agora tudo que vier do ip para tabela refente:
# ip rule add from 10.0.2.15 table link1
# ip rule add from 10.0.3.15 table link2
E a cereja do bolo, load balance com o iproute:
OBS: delete a rota padrão já configurada ou desative na interface caso crie um script de utilização.
# ip route del via default
# ip route add default \
nexthop via 10.0.2.15 dev eth0 weight 1 \
nexthop via 10.0.3.15 dev eth1 weight 1
Pessoal agora iremos falar de algo interessante que é o parametro weight, o significado é o peso, que no caso está 50% para ambos. Isso é ainda mais interessante quando temos um link maior do que o outro.
Pensando, tendo dois links de eth0 10M e de eth1 50M, mudar o peso colocando mais carga para 50M.
# ip route add default \
nexthop via 10.0.2.15 dev eth0 weight 1 \
nexthop via 10.0.3.15 dev eth1 weight 3
Então eth0 assumirá 25% das requisições do tráfego e os outros 75% passará para interface eth1, tendo melhor qualidade na utilização dos links, diminuido a subutilização e melhor investimento.
Brincando NetFilter
Gostaria de agregar mais a esse tutorial, esse material realizei na prática em vários cliente e em caso de central telefonica e gateway mantidos por mim onde possuia PABX VoIP e solução de gateway próprio.
Nosso exemplo possuimos eth0 10M e eth1 50M, mas eth0 possuir uma velocidade baixa comparado a eth1, mas possui um link dedicado 10M de upload e 10M de download, excelente para utilização de tráfego de voz onde permite uma melhor qualidade tanto na escuta quanto no fala.
Resumindo oque proponho é que esse PABX VoIP saia por uma interface de melhor qualidade que é a eth0 para que não haja problemas com ligações repicotadas é ai que entra o iptables, vamos lá:
# iptables -t mangle -A PREROUTING -i eth2 -p all -s 192.168.0.21 -j MARK --set-mark 1
Explicação:
eth2 - Interface da rede ligada a rede interna.
-p all - Todos os pacotes.
-s 192.168.0.21 - Host dentro da rede interna que passará por está regra.
-j MARK - Marcando pacote como identificação 1.
Galera agora só criamos a regra no iproute para que jogue todos os pacotes marcado na tabela que escolhermos ( ou link especifico ).
# ip rule add fwmark 1 table link1
Saindo do contexto, podemos redirecionar protocolos e portas para determinados links, vamos realizar um teste:
# iptables -t mangle -A PREROUTING -i eth2 -p tcp -m multiport --dport 80,443 -j MARK --set-mark 2
E na sequencia um rule:
# ip rule add fwmark 2 table link2
Pronto, nossa que fácil, vamos verificar isso no monitoramento na próxima parte.
Comentários
Postar um comentário