Balanceamento e Roteamento Avançado com dois Links
Prezados colegas,
Primeiramente saudações pinguianas a todos.
Sei que já tem um certo tempo que não posto nada, mas esses dias eu passei por uma dificuldade que me motivou a escrever esse artigo.
Recebi a missão de implementar um servidor Gateway com dois links de internet, balanceamento de carga e FailOver. Como quebrei a cabeça para fazer as tabelas do balanceamento funcionar, resolvi escrever esse artigo para que fique tudo documentado e para ajudar as pessoas que venham a precisar da mesma solução.
Vejamos o cenário:
O que precisamos?
Primeiramente precisamos criar as tabelas no linux!
Edite o arquivo “/etc/iproute2/rt_table”:
vim /etc/iproute2/rt_table
Deixe-o assim:
Agora vamos criar o script para adicionar as tabelas!
Vamos criar o seguinte arquivo:
vim /usr/local/bin/balanceamento
Deixe com o seguinte conteúdo:
#!/bin/bash ####################################################### #################### A T E N C A O #################### ### ### Colocar tabelas no arquivo /etc/iproute2/rt_tables ### para o balanceamento funcionar ### ### EXemplo: ### ### 24 link1 ### 25 link2 ####################################################### ## Variaveis de Comandos RULE="/sbin/ip rule" ROUTE="/sbin/ip route" ## Rede Local IF_PADRAO="eth0" RD_PADRAO="10.0.0.0/255.255.248.0" ## LINK1 IF_LINK1="eth1" IP_LINK1="201.143.112.163" GW_LINK1="201.143.112.162" RD_LINK1="201.143.112.161/255.255.255.248" ## LINK2 IF_LINK2="eth2" IP_LINK2="177.149.109.105" GW_LINK2="177.149.109.104" RD_LINK2="177.149.109.103/255.255.255.248" case $1 in add) echo "Adicionando Regras e Tabelas..." ## Configuracoes para o LINK1 $ROUTE $1 $RD_LINK1 dev $IF_LINK1 src $IP_LINK1 table link1 $ROUTE $1 default via $GW_LINK1 table link1 $RULE $1 from $IP_LINK1 table link1 $ROUTE $1 127.0.0.0/8 dev lo table link1 $ROUTE $1 $RD_PADRAO dev $IF_PADRAO table link1 $RULE $1 fwmark 1 table link1 ## Configuracoes para o LINK2 $ROUTE $1 $RD_LINK2 dev $IF_LINK2 src $IP_LINK2 table link2 $ROUTE $1 default via $GW_LINK2 table link2 $RULE $1 from $IP_LINK2 table link2 $ROUTE $1 127.0.0.0/8 dev lo table link2 $ROUTE $1 $RD_PADRAO dev $IF_PADRAO table link2 $RULE $1 fwmark 2 table link2 $ROUTE flush cache echo "[OK]" ;; del) echo "Removendo Regras e Tabelas.." ## Limpando Tabelas $ROUTE flush table link1 $ROUTE flush table link2 ## Limpando Regras $RULE $1 from $IP_LINK1 table link1 $RULE $1 from $IP_LINK2 table link2 # Limpando Marcacoes $RULE $1 fwmark 1 table link1 $RULE $1 fwmark 2 table link2 echo "[OK]" ;; *) echo "Use add ou del" ;; esac
Agora, para ativar o balanceamento, precisamos rodar o scrip! Faça o comando abaixo:
/usr/local/bin/balanceamento add
Feito isso, você já terá as tabelas criadas e ativas! Agora você pode acessar seu servidor tanto pelo link1 (201.143.112.163) quanto pelo link2 (177.149.109.105).
Agora, precisamos configurar o script para criar as tabelas sempre que o servidor liga! Para isso edite o arquivo “/etc/rc.local” com o comando abaixo:
vim /etc/rc.local
Deixe-o assim:
Depois disso, sempre que o servidor reiniciar, ele já estará acessível pelos dois links. Agora que já está tudo configurado e funcionando, vamos brincar um pouco com o balanceamento! Vou descrever aqui uns exemplos.
Vamos supor que você queira que a máquina 10.0.0.5 utilize o link2 para navegar na internet. Basta inserir uma regra no Firewall indicando isso:
iptables -t mangle -A PREROUTING -s 10.0.0.5 -j MARK --set-mark 2
Vamos supor que você queira que o seu servidor utilize o link2 para mandar e-mails para fora! Façamos então a seguinte regra:
iptables -t mangle -A OUTPUT -p tcp -m multiport --dport 25,587 -j MARK --set-mark 2
Isso foi alguns exemplos simples. Agora, basta usar a sua imaginação.
UMA COISA MUITO IMPORTANTE A SER MENCIONADA, é que se você tiver uma VPN interligando todas as filiais (como nesse artigo), você precisa adicionar as rotas paras as redes das VPNs nas tabelas. Para isso, substitua os scripts “/etc/openvpn/rotas/up.sh” e “/etc/openvpn/rotas/down.sh” desse artigo por esses:
Script “/etc/openvpn/rotas/up.sh“:
#!/bin/sh ## Comandos ROUTE="/sbin/ip route" ## VPN IF_VPN="tap0" ## IPS VPNs IP_VPN_FILIAL1="5.0.0.5" IP_VPN_FILIAL2="5.0.0.15" ## Redes VPN RD_FILIAL1="192.168.0.0/255.255.255.0" RD_FILIAL2="172.4.96.0/255.255.255.0" $ROUTE add $RD_FILIAL1 via $IP_VPN_FILIAL1 $ROUTE add $RD_FILIAL1 via $IP_VPN_FILIAL1 dev $IF_VPN table link1 $ROUTE add $RD_FILIAL1 via $IP_VPN_FILIAL1 dev $IF_VPN table link2 $ROUTE add $RD_FILIAL2 via $IP_VPN_FILIAL2 $ROUTE add $RD_FILIAL2 via $IP_VPN_FILIAL2 dev $IF_VPN table link1 $ROUTE add $RD_FILIAL2 via $IP_VPN_FILIAL2 dev $IF_VPN table link2
Script “/etc/openvpn/rotas/down.sh“:
#!/bin/sh ## Comandos ROUTE="/sbin/ip route" ## VPN IF_VPN="tap0" ## IPS VPNs IP_VPN_FILIAL1="5.0.0.5" IP_VPN_FILIAL2="5.0.0.15" ## Redes VPN RD_FILIAL1="192.168.0.0/255.255.255.0" RD_FILIAL2="172.4.96.0/255.255.255.0" $ROUTE del $RD_FILIAL1 via $IP_VPN_FILIAL1 $ROUTE del $RD_FILIAL1 via $IP_VPN_FILIAL1 dev $IF_VPN table link1 $ROUTE del $RD_FILIAL1 via $IP_VPN_FILIAL1 dev $IF_VPN table link2 $ROUTE del $RD_FILIAL2 via $IP_VPN_FILIAL2 $ROUTE del $RD_FILIAL2 via $IP_VPN_FILIAL2 dev $IF_VPN table link1 $ROUTE del $RD_FILIAL2 via $IP_VPN_FILIAL2 dev $IF_VPN table link2
Bom galera, fico por aqui!
No próximo artigo ensinarei como fazer um FAILOVER com os dois links.
Espero ter colaborado!
Esse artigo foi útil? Colabore com o nosso site para podermos continuar dando mais dicas como essa!
Formas de doação:
- Boleto / Cartão de crédito: https//bit.ly/AprendendoLinux
- Pix: [email protected]
- PicPay: @henrique_fagundes
- PayPal: [email protected]
- Bitcoin: bc1qtnn5z058htzy799dslwrpjcdpm0vuta3vrj28l
Favorecido: Luiz Henrique Marques Fagundes