Redondance de firewall sous FreeBSD

Date: 16/07/2008 | Catégories: Open-source,Reseau | Tags: ,,,,

Dans une infrastructure réseau, le firewall est souvent le point central par lequel l'ensemble des flux transite. C'est donc un SPOF ("single point of failure" ou "point individuel de défaillance") de votre système d'information. En effet, en cas de problème sur ce noeud, l'ensemble de votre réseau devient in-opérationnel (ce qui est impensable pour un administrateur réseau;)).

Ce billet fait suite à un autre: Installation d'un Firewall sous FreeBSD. Nous allons donc voir comment redonder notre cher Firewall en utilisant les protocoles CARP ("Common address redundancy protocol") et PFSYNC (pour le synchronisation des règles PF). Pour cela, nous allons nous baser sur le réseau suivant afin d'illustrer notre article:

Architecture CARP.png

Comme on peut le voir, il faut donc deux machines pour effectuer cette redondance. La première (firewall-1) est celle utilisée par défaut. La seconde (firewall-2) prendra le relais en cas de problème sur la première. Il faut bien sûr mettre en place un système automatique de synchronisation des configurations entre les deux serveurs (sujet non abordé dans ce billet).

CARP ? c'est quoi ?

C'est un protocole sécurisé et libre permettant la redondance d'adresse IP sur un réseau. Il permet de partager une adresse IP entre plusieurs machines. Dans notre cas, nous allons mettre en place ce protocole entre les deux serveurs Firewall. Ils partageront ainsi une liste d'adresses IP (une par interface physique).

Pour les GNU/Linuxiens, une implémentation de CARP existe: UCARP. Dans mon cas je me focaliserai sur l'implémentation pour FreeBSD, inclus dans le noyau depuis la version 5.3.

Et PFSYNC... ?

C'est bien beau d'utiliser CARP pour la redondance mais si une des deux machines tombent, il faut que l'autre est un connaissance des tables d'état du Firewall PF (régles de Firewall, NAT, PAT, connexions ...). C'est là qu'entre en jeu PFSYNC qui permet une synchronisation dynamique de ces tables entre les deux machines.

Par défaut, les messages échangés par PFSYNC utilise un couche de transport multicast. Si vous mettez en place une architecture avec une redondance sur deux machine, je vous conseille de forcer le mode unicast en utilisant l'option syncpeer.

Installation de CARP sous FreeBSD

Il faut commencer par ajouter une ligne dans le fichier de configuration de votre noyau (/usr/src/sys/i386/conf/MONNOYAU):

...
device carp
...

Puis recompiler le noyau en suivant cette procédure.

Ensuite on active le module en modifiant le fichier /etc/sysctl.conf et en y ajoutant les deux lignes suivantes:

...
net.inet.carp.allow=1
net.inet.carp.preempt=1
...

La première option permet de charger le module CARP, la seconde permet de dire à CARP de mettre DOWN toutes les interfaces d'un serveur quand une d'elles est DOWN (basculement de la totalité du Firewall).

Vous pouvez activer ces options sans avoir à redémarrer le serveur en tapant les commandes suivantes:

sysctl net.inet.carp.allow=1
sysctl net.inet.carp.preempt=1

Configuration de CARP et de PFSYNC

Adresses IP de notre schéma réseau:

Firewall1 / (local) eth0: 192.168.0.1/24
Firewall1 / (wan) eth1: 192.168.254.1/24
Firewall1 / (lan) eth2: 192.168.1.1/24
Firewall1 / (dmz) eth3: 192.168.100.1/24

Firewall2 / (local) eth0: 192.168.0.2/24
Firewall2 / (wan) eth1: 192.168.254.2/24
Firewall2 / (lan) eth2: 192.168.1.2/24
Firewall2 / (dmz) eth3: 192.168.100.2/24

Adresse IP partagée CARP (wan) carp1: 192.168.254.254/24
Adresse IP partagée CARP (lan) carp2: 192.168.1.254/24
Adresse IP partagée CARP (dmz) carp3: 192.168.100.254/24

Votre Firewall redondé sera donc connu de votre réseau par les adresses 192.168.254.254 sur votre réseau WAN, 192.168.1.254 sur votre réseau LAN et 192.168.100.254 sur votre réseau DMZ.

La première chose à faire pour configurer CARP est de créer, sur chacun des serveurs (firewall-1 et firewall-2) une interface virtuelle par réseau:

ifconfig carp1 create
ifconfig carp2 create
ifconfig carp3 create

Puis on modifie le fichier /etc/rc.conf en fonction de la machine. C'est là que l'on configure PFSYNC qui se présente sous la forme d'une interface virtuelle attaché à une interface physique. Je vous conseille, si possible de dédier une interface pour la synchronisation PFSYNC en mettant un câble croisé entre les deux machine (eth0 dans mon exemple).

Sur firewall-1:

# Interfaces physiques
ifconfig_eth0="inet 192.168.0.1 netmask 255.255.255.0"
ifconfig_eth1="inet 192.168.254.1 netmask 255.255.255.0"
ifconfig_eth2="inet 192.168.1.1 netmask 255.255.255.0"
ifconfig_eth3="inet 192.168.100.1 netmask 255.255.255.0"

# CARP
cloned_interfaces="carp1 carp2 carp3"
ifconfig_carp1="vhid 1 pass monmotdepasse 192.168.254.254 netmask 255.255.255.0"
ifconfig_carp2="vhid 2 pass monmotdepasse 192.168.1.254 netmask 255.255.255.0"
ifconfig_carp3="vhid 3 pass monmotdepasse 192.168.100.254 netmask 255.255.255.0"

# PFSYNC
pfsync_enable="YES"
pfsync_syncdev="eth0"
pfsync_syncpeer="192.168.0.2"

et sur firewall-2:

# Interface physiques
ifconfig_eth0="inet 192.168.0.2 netmask 255.255.255.0"
ifconfig_eth1="inet 192.168.254.2 netmask 255.255.255.0"
ifconfig_eth2="inet 192.168.1.2 netmask 255.255.255.0"
ifconfig_eth3="inet 192.168.100.2 netmask 255.255.255.0"

# CARP
cloned_interfaces="carp1 carp2 carp3"
ifconfig_carp1="vhid 1 advskew 100 pass monmotdepasse 192.168.254.254 netmask 255.255.255.0"
ifconfig_carp2="vhid 2 advskew 100 pass monmotdepasse 192.168.1.254 netmask 255.255.255.0"
ifconfig_carp3="vhid 3 advskew 100 pass monmotdepasse 192.168.100.254 netmask 255.255.255.0"

# PFSYNC
pfsync_enable="YES"
pfsync_syncdev="eth0"
pfsync_syncpeer="192.168.0.1"

Par défaut, l'intervalle entre deux annonces CARP (message multicast avec protocole IP/112) est d'une seconde. Il est possible de changer cette valeur en jouant sur les paramètres advbase et advskew de la commande ifconfig.

Dans la configuration donnée en exemple ci-dessus, les valeurs advbase sont laissées par défaut (1 seconde) et advskew mis à 100 pour le second serveur (0, par défaut sur le premier). Ainsi, firewall1 aura de plus grande chance d'être choisi comme serveur maître en cas de bon fonctionnement des deux serveurs.

Une dernière chose à faire est d'autoriser le protocole CARP entre les deux firewall avec une règles du type:

pass quick on { eth0 } proto pfsync keep state (no-sync)
pass on { eth0 } proto carp keep state

Comment tester le couple CARP/PFSYNC

Le plus simple est de débrancher un câble réseau (ou l'alimentation ;)) du firewall-1. Le trafic devrait basuler dans la seconde vers le deuxième firewall.

Une autre solution, qui peut être pratique lors de la maintenance d'un serveur est de forcer le basculement de manière soft. Il suffit pour cela de saisir sur firewall-1 la commande suivante:

ifconfig carp1 down

Nous venons donc de voir une solution "simple" pour faire de la redondance de Firewall. Cette technique est également applicable sur d'autres serveurs critiques (serveur Web par exemple...).

Quelques ressources utilisées pour rédiger cet article: