quinta-feira, 21 de janeiro de 2016

Balanceamento de 2 Links

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”:
1
# vim /etc/iproute2/rt_table
Deixe-o assim:
Agora vamos criar o script para adicionar as tabelas!
Vamos criar o seguinte arquivo:
1
# vim /usr/local/bin/balanceamento
Deixe com o seguinte conteúdo:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
#!/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:
1
# /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:
1
# 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:
1
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:
1
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“:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#!/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“:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#!/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.
Fonte e Autor:
http://www.aprendendolinux.com/balanceamento-e-roteamento-avancado-com-dois-links/