FUG-BR / Grupo Brasileiro de Usuarios de FreeBSD - Alta Disponibilidade de Link
Alta Disponibilidade de Link
Por Danilo Neves   
22/12/2011

Introdução

Muitas vezes, provedores de internet ou até mesmo empresas, não têm 2 servidores para ter uma alta disponibilidade de link e servidor. E com isso, eles apenas garantem a disponibilidade de link em único servidor, isso garante que o usuário não vá ligar reclamando que não consegue navegar e bla bla bla, caso o link principal venha ficar indisponível.

Para fazer isso, vou usar 2 ferramentas no FreeBSD, uma vai ser o Ifstated para fazer o monitoramento dos link e alterar a rota. E a outra vai ser o Packet Filter, o famoso PF.

Caso o link venha ficar indisponível, o Ifstated vai alterar a rota para o outro link.

Caso o link indisponível venha ficar disponível automaticamente, a rota vai voltar para a rota default, para o link principal.

Já com o PF, vou usar para criar os NAT dos clientes em uma única linha. Ele também pode ser usado como Firewall, redundância de link (round-robin ou source-hash), redirecionamento de portas, e etc.

Vamos ao trabalho. Clique abaixo para continuar lendo o artigo todo.


Preparando o Ambiente

Precisamos compilar o KERNEL para o PF e instalar o Ifstated.

Primeiro vou compilar o Kernel e para isso vou descobrir qual o nome do meu Kernel atual.

#uname -a

/usr/obj/usr/src/sys/GENERIC

Veja que no final temos o nome do Kernel que no meu caso o nome padrão GENERIC. Precisamos agora editar e adicionar algumas opções para que o PF funcione corretamente. Para editar:

# ee /usr/src/sys/i386/conf/GENERIC


Vá até o final do arquivo e adicione as seguintes opções:

device pf
options ALTQ options ALTQ_CBQ options ALTQ_RED options ALTQ_RIO options ALTQ_HFSC options ALTQ_CDNR options ALTQ_PRIQ

Feito isso é só salvar, agora vamos compilar o Kernel modificado.

#cd /usr/src
#make buildkernel KERNCONF=GENERIC

Espere porque isso demora um pouco, assim que termina execute o comando abaixo

# make installkernel KERNCONF=GENERIC

Depois é só reiniciar o servidor.
Agora que já compilamos nosso Kernel para o PF, vamos agora instalar o Ifstated pelo ports.

# cd /usr/ports/net/ifstated/ # make install clean

Finalizamos o ambiente e agora vamos para configuração.

Configurações

No ambiente que estou configurando o servidor tem 3 interfaces, duas interfaces do link e uma dos clientes.
Agora precisamos definir o ip de cada uma delas.
No meu caso a interface do meu link principal é a re1, vou configurar ela na mão e depois configurar no rc.conf para que na hora do boot do servidor já fique configurada.

Ip da interface

#ifconfig re1 187.64.174.186/30

Gateway

#route add default 187.64.174.85

Obs: Devemos configuar o DNS

# ee /etc/resolv.conf

nameserver 8.8.8.8

Feito isso o servidor já deve está disponível para internet e agora devemos configurar o segundo link em uma outra interface, que no meu caso é a bge0.

#ifconfig bge0 186.68.173.182/30

Nesse momento não precisamos colocar o rota default porque já colocamos no passo anterior e no momento não precisamos dessa rota default.

Por fim vamos configurar a interface do gateway do seus clientes, no meu caso a re2.

# ifconfig re2 192.168.1.1/24

Agora todas as interfaces estão com IP, agora vou colocar todas essas configurações no rc.conf, não coloquei antes para fins didático.

Não é preciso fazer as configurações das interfaces que eu fiz acima, basta apenas seguir o exemplo do rc.conf e reiniciar o servidor que o mesmo já vai iniciar com todas as configurações das interfaces.

Meu rc.conf ficou da seguinte forma:

#ee /etc/rc.conf

# CONFIGURACAO DAS INTERFACES

#Link 1
ifconfig_re1="inet 187.64.174.186/30”

#Link 2
ifconfig_bge0="inet 186.68.173.182/30"

#Clientes
ifconfig_re1="inet 192.168.1.1/24"

#GATEWAY DEFAULT
defaultrouter="187.64.174.85"

Pronto, agora estão todas as interfaces configuradas.

Vamos agora configura o PF, para fazer o NAT dos clientes e assim eles poderem sairem para a internet.
Para o PF funcionar é necessário adicionar no rc.conf pf_enable=”YES” e também o gateway_enable=”YES” , pode ser logo abaixo da configuração do gateway.

#ee /etc/rc.conf

pf_enable=”YES”
gateway_enable=”YES”

Feito isso vamos fazer backup do arquivo de configuração do pf.conf e criar um novo.

# mv /etc/pf.conf /etc/pf.conf.old

Vamos criar um novo arquivo com as seguintes configurações.

# ee /etc/pf.conf

nat on re1 from 192.168.1.0/24 to any -> 187.64.174.186 nat on bge0 from 192.168.1.0/24 to any -> 186.68.173.182

Agora só salvar, para carregar o arquivo de configurações devemos digitar

# pfctl -f /etc/pf.conf

# pfctl -e /etc/pf.conf

A primeira regra no arquivo de configuração fazem que os clientes da faixa 192.168.1.0/24 saiam nateado pelo ip 187.64.174.186 que é meu IP do link principal.

A outra regra só vai funcionar caso o primeiro link fique indisponível e assim o segundo link vai assumir e todos os clientes vão sair pelo ip 186.68.173.182.

Neste momento todos seus clientes estão navegando.

Agora vem o Ifstated a parte mais importante desse artigo.
Vamos fazer um backup do arquivo de configuração padrão o ifstated.conf.

#mv /usr/local/etc/ifstated.conf /usr/local/etc/ifstated.conf.old

Vamos criar um novo ifstated.conf com as novas configurações.

#ee /usr/local/etc/ifstated.conf

init-state master if_up="re1.link.up"

net = '( "ping -q -c 1 -t 1 187.64.174.85 > /dev/null" every 5 )'

state master {
if ( $net) {

run "route delete default && route add default 187.64.174.85" }
if ( ! $net) {
run "route delete default && route add default 186.68.173.181" }

}

Veja que o arquivo de configuração não tem segredo nenhum.

Ele faz uma checagem de ping no seu gateway principal 187.64.174.85 a cada 5 segundos e caso nesse tempo o gateway fique indisponível ele vai alterar a rota para o 186.68.173.181. Depois de 5 segundo ele faz um checagem novamente o gateway principal e caso ele volte a ficar disponível, automaticamente vai alterar a rota para o gateway principal.

Você pode escolher para fazer a checagem de ping no gateway do seu roteador e também diminuir ou aumentar o tempo de checagem, isso depende de você.

Feito tudo isso preciso colocar daemon para fazer a checagem, digitando:

#ifstated -f /usr/local/etc/ifstated.conf

Pronto, agora o daemon está rodando e checando seu link a cada 5 segundos e assim temos um alta disponibilidade.

Mas agora você se pergunta, e se o servidor reiniciar o que vai acontecer?
Isso é um problema porque esse daemon não vai ser carregado automaticamente e sendo

Assim você precisa carregar ele manualmente.
Calma que para tudo tem uma solução!
Para isso arrumei um script e com algumas alterações minhas e do meu colega de trabalho Renan Fagundes fizemos um script simples para resolver esse problema.

Dentro do diretório de inicialização edite o seguinte script

#ee /usr/local/etc/rc.d/link.sh

#!/bin/sh #echo -n ' link '

case "$1" in

start)
start=`ls -la /var/run/link.pid 2>&1`
if [ $? -eq 1 ]
then
/usr/local/sbin/ifstated -f /usr/local/etc/ifstated.conf
ps -auxw | grep /usr/local/sbin/ifstated | grep -v grep |awk '{print $2}' -> /var/run/link.pid echo "Iniciando Alta Disponibilidade"

else
echo "Disponivel"

fi

;; stop)

stop=`ls -la /var/run/link.pid 2>&1` if [ $? -eq 0 ]
then
kill -9 `cat /var/run/link.pid`

rm /var/run/link.pid
echo "Desativando Alta Disponibilidade" else
echo "Indisponivel"
fi
;;

echo "Usage: `basename $0` {start|stop}" >&2 exit 64
;;

esac exit

Agora só salvar e alterar permissões do arquivo e permissão de execução:

#chmod 755 /usr/local/etc/rc.d/link.sh

#chmod +x /usr/local/etc/rc.d/link.sh

Agora vou explicar o que o script faz de uma forma rápida e simples.

Todo daemon tem um PID, então eu usei esse PID para poder matar o processo e com esse script posso dar um start ou stop na hora que eu quiser, além de ele carregar automaticamente na hora da inicialização do servidor.

Ao iniciar o script ele gera um arquivo chamado de /var/run/link.pid dentro desse arquivo está o PID do daemon Ifstated.

Quando você quer para o serviço ele vai ler esse arquivo verificar qual o PID que está dentro dele e matar esse PID e excluir o arquivo /var/run/link.pid .

É isso que o script faz, sem segredo nenhum.

Start no serviço

#/usr/local/etc/rc.d/link.sh start

Stop no serviço

#/usr/local/etc/rc.d/link/sh stop

Pronto, agora é só fazer os testes.

Espero que gostem e aceito críticas, sugestões e elogios. :)

Comentrios
Problema no ifstated
Por Leandro em 12/01/2012 13:18:24
Boa tarde,  
 
Copiei e colei suas configuraes do ifstated.conf s alterando a interface de rede e os ips. Mas o programa no inicializa, no da nenhuma mensagem de erro, ele s nao aparece como processo quando eu mando um ps -aux por exemplo. 
 
O que pode ser?
Problema no ifstated
Por Leandro em 12/01/2012 13:32:46
Boa tarde,  
 
Copiei e colei suas configuraes do ifstated.conf s alterando a interface de rede e os ips. Mas o programa no inicializa, no da nenhuma mensagem de erro, ele s nao aparece como processo quando eu mando um ps -aux por exemplo. 
 
O que pode ser?
qcrysxbgxTVQZCDre
Por Kris em 13/01/2012 12:27:21
Not bad at all fleals and gallas. Thanks.
FrEraMlPWqg
Por Jody em 14/01/2012 04:03:36
Reading this makes my decisions easier than tkiang candy from a baby.
mvqVDQxYXbVTgpA
Por Jesus em 02/05/2012 01:14:06
Great post! Keep it up! Personally, I think having the self dicispline to follow through on one's goals and expectations is the single most important thing a person needs to have. Not only in sports but in just about everything you do in your life. You'd be crazy to expect getting well-developed muscles if you are not working out religiously or if you are not following a proper diet. Following-through makes all the difference. A fire will eventually die out if you don't feed fuel to it, but it can grow really big if you fan it and give it more fuel to burn. So, if we're talking about building muscles, following-through means having and executing the right workout program for you, eating a proper diet, taking in supplements, and living a healthy lifestyle. Have a great day!
Muito bom Beto. Sem
Por Loh em 15/09/2013 18:51:33
Muito bom Beto. Sem vocea jamais temaoris estes momentos registrados. Espero que a ABES tenha como armazenar este acervo para no futuro relembramos o nosso passado. As coisas boas que estamos fazendo Uma abrae7o, Vitorio.


Comente!*
Nome:
E-mail
Homepage
Ttulo:
Comentrio:

Cdigo:* Code

ltima Atualizao ( 22/12/2011 )