Resumindo, o que vamos fazer é criar mais duas tabelas de roteamento com dois gateways diferentes e configurar o linux para fazer uma espécie de "round-robin" de pacotes entre esses gateways, onde podemos definir peso entre essas rotas default e até implementar um failover.
Precisaremos de pelo menos três placas de rede no servidor, onde uma seria para a rede interna e as outras duas seriam para os links.
LoadBalance
Em primeiro lugar vamos adicionar as duas novas tabelas no arquivo /etc/iproute2/rt_tables
#
# reserved values
#
255 local
254 main
253 default
0 unspec
#
# local
#
#1 inr.ruhep
10 LINK_A # Operadora A
20 LINK_B # Operadora B
Agora vamos ao script comentado:
#!/bin/bash
ip route add [REDE A] dev eth0 src [IP DA PLACA A] table LINK_A
ip route add default [GATEWAY DA REDE A] table LINK_A
ip route add [REDE B] dev eth1 src [IP DA PLACA B] table LINK_B
ip route add default via [GATEWAY DA REDE B] table LINK_B
ip rule add from [IP DA PLACA A] table LINK_A
ip rule add from [IP DA PLACA B] table LINK_B
ip route add default scope global nexthop via [GATEWAY DA REDE A] dev eth0 weight 1 nexthop via [GATEWAY DA REDE B] dev eth1 weight 1
Os comandos acima estão adicionando rotas para as novas tabelas que criamos que no caso foram duas, onde o parâmetro nexthop na ultima linha do script é fundamental para o load balance. É ele que vai fazer a alternação entre os links de internet, além disso tem o parâmetro weight que é responsável por definir o peso de cada rota, quanto maior o peso, mais pacotes vão por ela, observe que coloquei os pesos iguais.
Para facilitar a sua vida, vou repetir o script com alguns exemplos de IP`s:
#!/bin/bash
ip route add 200.232.30.8/29 dev eth0 src 200.232.30.9 table LINK_A
ip route add default 200.232.30.10 table LINK_A
ip route add 189.130.231.8/29 dev eth1 src 189.130.231.9 table LINK_B
ip route add default via 189.130.231.10 table LINK_B
ip rule add from 200.232.30.9 table LINK_A
ip rule add from 189.130.231.9 table LINK_B
ip route add default scope global nexthop via 200.232.30.10 dev eth0 weight 1 nexthop via 189.130.231.10 dev eth1 weight 1
Para testar direcione o ping pelas interfaces que estão no load balance:
[root@Owner scripts]# ping www.google.com.br -I eth0
PING www.l.google.com (64.233.163.104) from 200.232.30.9 eth0: 56(84) bytes of data.
64 bytes from bs-in-f104.1e100.net (64.233.163.104): icmp_seq=1 ttl=53 time=52.9 ms
64 bytes from bs-in-f104.1e100.net (64.233.163.104): icmp_seq=2 ttl=53 time=51.1 ms
e depois:
[root@Owner scripts]# ping www.google.com.br -I eth1
PING www.l.google.com (64.233.163.104) from 189.130.231.9 eth2: 56(84) bytes of data.
64 bytes from bs-in-f104.1e100.net (64.233.163.104): icmp_seq=1 ttl=52 time=73.6 ms
64 bytes from bs-in-f104.1e100.net (64.233.163.104): icmp_seq=2 ttl=54 time=49.3 ms
FailOver
Para implementarmos o failover baixe o script feito por outro blogueiro (Let's share the code) no endereço abaixo:
http://blog.taragana.com/wp-content/upload/gwping
- Mude a permissão do arquivo para virar um executável (chmod 755 gwping) e coloque-o no diretório /usr/bin/
- Altere os seguintes parâmetros:
- Interfaces de rede externas
EXTIF1=eth0
EXTIF2=eth1
- IP`s das interfaces
IP1=200.232.30.9
IP2=189.130.231.9
- Gateways das redes
GW1=200.232.30.10
GW2=189.130.231.10
- Peso das rotas
W1=1
W2=1
- Nome das tabelas de roteamento
NAME1=LINK_A
NAME2=LINK_B
- Quantidade de vezes a testar antes de mudar as rotas
SUCCESSREPEATCOUNT=4
FAILUREREPEATCOUNT=2
Pronto! Basta colocar no final do script esta linha:
nohup /usr/sbin/gwping &
OBS1: Lembre-se de colocar no arquivo rc.local uma menção ao seu script para que ele seja executado todas as vezes que a máquina ligar;
OBS2: Você pode ter problemas com sites HTTPS, para solucionar basta apenas colocar uma rota estática.
Sites relacionados:
FreeBSD
0sem comentários ainda