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 le protocole CARP (”Common address redundancy protocol”). Pour cela, nous allons nous baser sur le réseau suivant afin d’illustrer notre article:
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.
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
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.
Sur firewall-1:
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″cloned_interfaces=”carp1 carp2 carp3″
ifconfig_carp1=”vhid 1 carpdev eth1 pass monmotdepasse 192.168.254.254/254″
ifconfig_carp2=”vhid 2 carpdev eth2 pass monmotdepasse 192.168.1.254/254″
ifconfig_carp3=”vhid 3 carpdev eth3 pass monmotdepasse 192.168.100.254/254″
et sur firewall-2:
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″cloned_interfaces=”carp1 carp2 carp3″
ifconfig_carp1=”vhid 1 carpdev eth1 advskew 100 pass monmotdepasse 192.168.254.254/254″
ifconfig_carp2=”vhid 2 caprdev eth2 advskew 100 pass monmotdepasse 192.168.1.254/254″
ifconfig_carp3=”vhid 3 carpdev eth3 advskew 100 pass monmotdepasse 192.168.100.254/254″
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:
ipfw add allow carp from any to any
Comment tester CARP
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…).