Cluster de Firewall com carp + pfsync

Introdução
Para quem não conhece o assunto, com carp + pfsync é possível criar um cluster de firewalls de uma forma que elimine um único ponto de falha, e ainda por cima é totalmente transparente, uma máquina pode explodir que a outra irá assumir instantaneamente e você não vai perder se quer um misero pacote de seu download. CARP = Common Address Resolution Protocol, o carp é o principal responsável pelo compartilhamento de IP entre o cluster. É com ele que faremos a redundância das máquinas, se uma cair a outra irá assumir o ip setado no carp. Além do carp iremos utilizar o PFSYNC para fazer a sincronia de estados das conexões entre as máquinas, é por causa dele que se uma máquina cair e o tráfego for redirecionado para a outra a conexão não será cortada.

Requerimentos
Neste exemplo vou criar um cluster apenas entre duas máquinas, então vamos precisar de duas máquinas duh😛, cada uma delas com 3 placas de rede. Porque 3 placas? Simples, uma para a rede válida, outra para a rede privada, e a última como meio de sincronia dos estados das conexões entre as duas máquinas. Além disso iremos precisar de 8 IPs diferentes, 4 para cada máquina, 1 ip válido para cada máquina, 1 ip privado para cada máquina, mais 1 ip privado para cada máquina para sincronia (pfsync) e mais 2 ips virtuais que serão setados em cada carp, um público e outro privado. Não se assustem com a quantidade de ips utilizados, logo tudo isso irá ficar mais claro.

Configurações

CARP
Primeiro vamos criar as interfaces do carp, sim, elas funcionam como uma interface virtual🙂.
Um pequeno resumo dos ips:
fw01:
xl0 – 200.x.x.2
xl1 – 192.168.0.2
rl0 – 10.10.10.1
carp0 – 200.x.x.1
carp1 – 192.168.0.1
fw02:
xl0 – 200.x.x.3
xl1 – 192.168.0.3
rl0 – 10.10.10.2
carp0 – 200.x.x.1
carp1 – 192.168.0.1
Execute isso nas duas máquinas, não se preocupe com os parâmetros, irei explica-los:
# ifconfig carp0 create
# ifconfig carp1 create
Máquina 1:
# ifconfig carp0 vhid 1 pass senha carpdev xl0 advskew 0 200.x.x.1 netmask 255.255.255.0
# ifconfig carp0 vhid 2 pass senha carpdev xl1 advskew 0 192.168.0.1
netmask 255.255.255.0
Máquina 2:
# ifconfig carp0 vhid 1 pass senha carpdev xl0 advskew 128 200.x.x.1 netmask 255.255.255.0
# ifconfig carp0 vhid 2 pass senha carpdev xl1 advskew 128
192.168.0.1 netmask 255.255.255.0

Parâmetros
vhid: O Virtual Host ID. Este é um número único que é usado para identificar o grupo de redundância de outros nós na rede. Valores aceitos são 1 à 255.
pass:É a senha de comunicação entre os nós, evitando que algum engraçadinho entre na rede afim de snifar o tráfego.
carpdev: Aqui é especificado a qual interface o carp está conectado.
advskew: Ele define a prioridade da máquina, quanto menor o valor maior a prioridade, em nosso caso, se as duas máquinas estiverem no ar, a primerira irá funcionar como master.

PFSYNC
Agora vamos configurar o meio de sincronia entre os nós:
Máquina 1:
# ifconfig rl0 10.10.10.1 netmask 255.255.255.252
Máquina 2:
# ifconfig rl0 10.10.10.2 netmask 255.255.255.252
Nas duas máquinas:
# ifconfig pfsync0 syncdev rl0
Como estou utilizando apenas 2 máquinas eu interliguei as 2 através de um cabo cross, com isso eu evito que alguém tente conectar um cabo na rede (caso houvesse).

SYSCTL
Outra coisa importante é ativar o carp com o sysctl, estas são as possíveis entradas:
net.inet.carp.allow: Aceita entrada de pacotes CARP ou não. Padrão é 1 (sim).
net.inet.carp.preempt: Permite hosts dentro de um grupo de redundância ter um melhor advbase e advskew para tomar o lugar (preempt) do master. Adicionalmente, esta opção habilita failing over em todas as interfaces caso uma interface caia (down). Se uma interface física CARP cair, o CARP trocará o advskew para 240 em todas as outras interfaces CARP, em essência o failing termina por si mesmo. Esta opção é 0 (desabilitada) por padrão.
net.inet.carp.log: Loga pacotes CARP. O padrão é 0 (desabilitado).
net.inet.carp.arpbalance: Carrega balanceamento de tráfego entre múltiplos hosts no grupo de redundância. O padrão é 0 (desabilitado). Veja carp(4) para mais informações.
Precisamos ativar o preempt, para isso execute nas duas máquinas:
# sysctl -w net.inet.carp.preempt=1

Salvando as Configurações
Como o carp e o pfsync são tratados como interfaces, o arquivo de configuração a ser criado para eles é quase igual ao de uma placa de rede.
Crie os respectivos arquivos em cada uma das máquinas com os respectivos IPs:
/etc/hostname.carp0:
# inet 200.x.x.2 255.255.255.0 200.x.x.255 vhid 1 advskew 0 carpdev xl0 pass senha
/etc/hostname.carp1:
# inet 192.168.0.2 255.255.255.0 192.168.0.255 vhid 2 advskew 0 carpdev xl0 pass senha
/etc/hostname.rl0:
# inet 10.10.10.1 255.255.255.252 NONE
/etc/hostname.pfsync0:
# up syncdev rl0
E para finalizar habilite o preempt do carp no /etc/sysctl.conf

Testando
Depois de tudo configurado você verá algo do tipo em sua máquina:
[root@firewall01 admin]$ ifconfig
lo0: flags=8049 mtu 33224
groups: lo
inet 127.0.0.1 netmask 0xff000000
xl0: flags=8943 mtu 1500
lladdr 00:50:04:42:f1:c1
groups: egress
media: Ethernet 100baseTX full-duplex
status: active
inet 200.x.x.2 netmask 0xfffffff0 broadcast 200.x.x.255
xl1: flags=8943 mtu 1500
lladdr 00:50:04:42:aa:bb
media: Ethernet 100baseTX full-duplex
status: active
inet 192.168.0.2 netmask 0xffffff80 broadcast 192.168.0.255
rl0: flags=8843 mtu 1500
lladdr 00:15:f2:b0:80:3d
media: Ethernet 100baseTX full-duplex
status: active
inet 10.10.10.1 netmask 0xfffffffc broadcast 10.10.10.3
pflog0: flags=141 mtu 33224
pfsync0: flags=41 mtu 1460
pfsync: syncdev: rl0 syncpeer: 224.0.0.240 maxupd: 128
enc0: flags=0 mtu 1536
carp0: flags=8843 mtu 1500
carp: MASTER carpdev xl0 vhid 1 advbase 1 advskew 0
groups: carp
inet 200.x.x.1 netmask 0xfffffff0 broadcast 200.x.x.255
carp1: flags=8843 mtu 1500
carp: MASTER carpdev xl1 vhid 2 advbase 1 advskew 0
groups: carp
inet 192.168.0.1 netmask 0xffffff80 broadcast 192.168.0.255

Caso você execute ifconfig carp0 down, ou tirar um cabo de rede o carp0 da segunda máquina irá mudar de BACKUP para MASTER.
Existem três estados para uma interface do carp:
MASTER: Acho que dispensa comentários🙂
BACKUP: Esse também😀
INIT: INIT é quando a interface ainda não está no ar, é o que irá acontecer se você executar o ifconfig carpX down.

Firewall
Outra coisa importante a se fazer é liberar o tráfego do carp e pfsync no firewall😀 Sem isso tudo o que foi feito anteriormente é inútil.
Não irei entrar em detalhes sobre o firewall agora, apenas insira isto no inicio de suas regras para garantir que tudo vai funcionar como esperado:
#libera carp entre as maquinas fw
pass quick on { $pfsync_if } proto pfsync
pass quick on { $ext_if $int_if } proto carp keep state
Não se esqueça de criar as variáveis definindo as interfaces para pfsync_if,etc.

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: