Pré Requis
– 2 pcs avec plusieurs cartes réseau, ici 3 interfaces dans l’exemple.
– 3 sous-réseaux distincts.
– 4 adresses minimum par sous-réseaux divisées comme ceci : 1 adresse par firewall, 1 adresse virtuelle, 1 adresse pour le serveur ou la station cliente.
– Activation du dépot « Dries RPM Repository »
– Installation de keepalived
– Téléchargement des paquets RPM corrigés de quagga et installation de ceux-ci.
– 1 switch par sous réseau ou un seule switch divisé en 3 par des VLANS.
Chaque firewall doit avoir le même branchement sur les switches.
C’est à dire eth0 de Fw1 et Fw2 sur le switch du LAN1, eth1 de Fw1 et Fw2 sur le switch du LAN3, eth2 de Fw1 et Fw2 sur le switch du LAN d’Interconnexion.
Schéma du réseau détaillé ici
Comment cela fonctionne ?
Ici, on utilise deux services distincts :
– keepalived qui sert à mettre en place un système de tolérance de panne réseau nommé vrrp
– Quagga qui implémente le système de routage dynamique.
Pour chaque firewall on a une adresse ip fixe par interface réseau. Cette adresse est affectée par Quagga.
On définit ensuite une adresse ip virtuelle pour chaque interface des firewalls. Cette adresse sera utilisée comme adresse de passerelle par défaut sur les serveurs ou les stations de travail. Cette adresse est managée par keepalived.
Le routage dynamique est fait par RIP entre les deux firewalls et le routeur CISCO d’interconnexion.
En cas de perte d’un firewall, l’adresse ip virtuelle de chaque interface passe sur le firewall de BACKUP.
Le routage RIP recrée les routes du routeur CISCO pour assurer le fonctionnement du système.
L’arrêt de fonctionnement ne dure que le temps que les routes se refassent entre le firewall de BACKUP et le routeur CISCO.
Le protocole RIP étant le moins performant en terme de mise à jour, l’interconnexion est stoppée 4 minutes et repart dès que les routes sont établies à nouveau.
Pour préparer mon exemple, je crée un petit tableau pour fixer les choses, je vous conseille de faire de même si vous installez ce type de solution, cela permet de s’y retrouver plus facilement par la suite durant, la configuration.
Récapitulatif :
– Lan FW/Serveur sur eth0 en 192.168.1.0/24
– Lan FW/Station sur eth1 en 192.168.2.0/24
– Lan FW/Routeur CISCO sur eth2 en 192.168.3.0/24
Firewall 1 MASTER | Firewall 2 BACKUP | Fail Over |
IP réelle eth0 192.168.1.1 | IP réelle eth0 192.168.1.2 | IP Virtuelle 192.168.1.254 |
IP réelle eth1 192.168.2.1 | IP réelle eth1 192.168.2.2 | IP Virtuelle 192.168.2.254 |
IP réelle eth2 192.168.3.1 | IP réelle eth2 192.168.3.2 | IP Virtuelle 192.168.3.254 |
Mise en uvre
Adresses ips des interfaces réseau :
– Adressage ip du système LINUX :
Comme indiqué dans l’article sur Quagga, c’est le démon de routage qui doit affecter ces adresses. Il ne faut surtout pas que le système Linux affecte les adresses par lui-même.
Corrigez les fichiers /etc/sysconfig/network-scripts/ifcfg-ethx où x est le numéro de l’interface.
Supprimez les variables IPADDR et NETMASK dans chaque fichier.
Assurez-vous que la varaible GATEWAY n’existe pas dans le fichier /etc/sysconfig/network.
– Installation de Quagga :
Je n’utilises pas les paquets fournis avec CEntOS dans cette documentation, à cause de ceci.
Si vous avez une Fedora, les paquets d’origine fonctionnent bien.
Aller dans le dossier où vous avez téléchargé le fichier tar.gz contenant les rpms modifiés de quagga.
Décompactez les fichiers avec la commande tar xvfz rpms_quagga.tar.gz
Installez quagga avec les commandes suivantes :
rpm -ivh quagga-0.99.3-2006012001.i386.rpm
rpm -ivh quagga-devel-0.99.3-2006012001.i386.rpm
– Paramétrage de Quagga :
On s’assure que les services de quagga ne démarreront pas au boot, car on veut que ce soit keepalived qui les démarre.
chkconfig bgpd off
chkconfig isisd off
chkconfig ospf6d off
chkconfig ospfd off
chkconfig ripd off
chkconfig ripngd off
chkconfig zebra off
On crée le fichier de configuration du démon de routage que l’on veut utiliser. Ici j’utilise rip et son fichier de configuration ripd.conf.
cp /etc/quagga/ripd.conf.sample /etc/quagga/ripd.conf
Les fichiers de configuration doivent appartenir à l’utilisateur quagga, or ce n’est pas encore le cas.
Pour corriger çà, on utilise la commande suivante :
chown quagga: /etc/quagga/*
Une fois ces fichiers créées on lance ponctuellement les services, le temps de faire le paramétrage des interfaces.
service zebra start
service ripd start
Quand les services sont lancés on utilise la commande vtysh
pour accéder à l’interface de configuration de quagga.
On obtient ceci :
Hello, this is Quagga (version 0.99.3).
Copyright 1996-2005 Kunihiro Ishiguro, et al.
localhost#
Une fois au prompt de quagga, taper les commandes de configuration comme ceci pour le Firewall 1:
conf t
hostname fw1.mondomaine.fr
interface eth0
description Reseau1
ip address 192.168.1.1/24
exit
interface eth1
description Reseau2
ip address 192.168.2.1/24
exit
interface eth2
description ReseauInterco
ip address 192.168.3.1/24
exit
ip route 0.0.0.0/0 192.168.3.3
router rip
version 1
redistribute connected
redistribute static
network 192.168.3.0/24
exit
exit
wr
exit
Ces commandes décrivent chaque interface, puis le routage RIP.
La ligne network 192.168.3.0/24 indique sur quel réseau il faut faire les annonces RIP. Ici sur eth2 vers le routeur CISCO.
Sur le Firewall 2 on utilisera les commandes suivantes :
conf t
hostname fw2.mondomaine.fr
interface eth0
description Reseau1
ip address 192.168.1.2/24
exit
interface eth1
description Reseau2
ip address 192.168.2.2/24
exit
interface eth2
description ReseauInterco
ip address 192.168.3.2/24
exit
ip route 0.0.0.0/0 192.168.3.3
router rip
version 1
default-metric 2
redistribute connected
redistribute static
network 192.168.3.0/24
exit
exit
wr
exit
La commande « default-metric 2 » sur le Firewall 2 permet de faire pointer la route principale sur le Firewall 1.
Les fichiers de configuration zebra.conf et ripd.conf seront mis à jour lors de la commande wr avant de sortir de vtysh.
Vous pouvez maintenant stopper zebra et rip.
service zebra stop
service ripd stop
Adresses ips virtuelles des interfaces réseau :
– Installation de keepalived :
keepalived est présent dans le dépot « Dries RPM Repository ».
On l’installe simplement avec la commande yum -y install keepalived
– Paramétrage de keepalived :
Le paramétrage de keepalived se fait via le fichier /etc/keepalived/keepalived.conf .
Voici celui du Firewal 1 :
global_defs
notification_email
mon_email@mondomaine.fr
notification_email_from root@fw1.mondomaine.fr
smtp_server smtp.mon_fai.fr
smtp_connect_timeout 30
router_id FIREWALL0
vrrp_sync_group FAILOVER
group
VI_0
VI_1
VI_2
notify_master "/etc/keepalived/fw_master.sh"
notify_backup "/etc/keepalived/fw_backup.sh"
notify_fault "/etc/keepalived/fw_fault.sh"
vrrp_instance VI_0
state MASTER
interface eth0
virtual_router_id 50
priority 100
advert_int 1
authentication
auth_type PASS
auth_pass monpassword
virtual_ipaddress
192.168.1.254
vrrp_instance VI_1
state MASTER
interface eth1
virtual_router_id 51
priority 100
advert_int 1
authentication
auth_type PASS
auth_pass monpassword
virtual_ipaddress
192.168.2.254
vrrp_instance VI_2
state MASTER
interface eth2
virtual_router_id 52
priority 100
advert_int 1
authentication
auth_type PASS
auth_pass monpassword
virtual_ipaddress
192.168.3.254
Voici celui du Firewall 2 :
global_defs
notification_email
mon_email@mondomaine.fr
notification_email_from root@fw1.mondomaine.fr
smtp_server smtp.mon_fai.fr
smtp_connect_timeout 30
router_id FIREWALL0
vrrp_sync_group FAILOVER
group
VI_0
VI_1
VI_2
notify_master "/etc/keepalived/fw_master.sh"
notify_backup "/etc/keepalived/fw_backup.sh"
notify_fault "/etc/keepalived/fw_fault.sh"
vrrp_instance VI_0
state BACKUP
interface eth0
virtual_router_id 50
priority 50
advert_int 1
authentication
auth_type PASS
auth_pass monpassword
virtual_ipaddress
192.168.1.254
vrrp_instance VI_1
state BACKUP
interface eth1
virtual_router_id 51
priority 50
advert_int 1
authentication
auth_type PASS
auth_pass monpassword
virtual_ipaddress
192.168.2.254
vrrp_instance VI_2
state BACKUP
interface eth2
virtual_router_id 52
priority 50
advert_int 1
authentication
auth_type PASS
auth_pass monpassword
virtual_ipaddress
192.168.3.254
Dans chaque bloc vrrp, on peut ajouter le paramètre smtp_alert si on veut que le serveur envoie un mail à l’adresse référencée dans le bloc global_defs.
Firewall 1 est désigné MASTER et Firewall 2 est le serveur de BACKUP.
Chaque Firewall peut avoir 3 états distincts :
– MASTER, c’est l’état dans lequel le serveur annonce l’adresse ip virtuelle.
Lors du passage à l’état MASTER, le script notify_master est exécuté si il est défini.
Ici, « /etc/keepalived/fw_master.sh ».
– BACKUP, l’état dans lequel le serveur attends une défaillance du serveur MASTER.
Lors du passage à l’état BACKUP, le script notify_backup est éxécuté si il est défini.
Ici, « /etc/keepalived/fw_backup.sh ».
– FAULT est l’état dans lequel passe le firewall en cas de problème, comme la perte d’un lien par exemple.
Lors du passage à l’état FAULT, le script notify_fault est éxécuté si il est défini.
Ici, « /etc/keepalived/fw_fault.sh ».
Ces scripts bash sont facultatifs, mais ici, on va les utiliser pour démarrer Quagga et le démon RIP.
Voici le contenu des scripts :
Sur Firewall 1 :
- fichier fw_master.sh
#!/bin/bash
/etc/init.d/zebra start
/etc/init.d/ripd start
- fichier fw_backup.sh
#!/bin/bash
#
# fichier à prioris inutile
# Un MASTER n'a pas à passer
# dans l'état BACKUP
#
/etc/init.d/zebra stop
/etc/init.d/ripd stop
- fichier fw_fault.sh
#!/bin/bash
/etc/init.d/ripd stop
Sur Firewall 2 :
- fichier fw_master.sh
#!/bin/bash
/etc/init.d/zebra start
/etc/init.d/ripd start
- fichier fw_backup.sh
#!/bin/bash
/etc/init.d/zebra start
/etc/init.d/ripd start
- fichier fw_fault.sh
#!/bin/bash
/etc/init.d/ripd stop
– Démarrage de keepalived :
On s’assure que keepalived se lance lors du démarrage, avec la commande chkconfig keepalived on
Tous les services sont maintenant prêts à fonctionner.
Vous pouvez au besoin vous assurer que l’ordre de démarrage ci-dessous est bien conservé. Ce qui est le cas sur le CEntOS.
Il faut démarrer dans l’ordre :
– le réseau ( service network )
– keepalived
– keepalived lance alors zebra, puis ripd via les scripts détaillés plus haut.
Vérifiez le fonctionnement de keepalived et le lancement des démons zebra et ripd dans le fichier /var/log/messages.
Attention !
Pensez qu’en cas de déconnexion d’un câble réseau, keepalived passe en mode FAULT.
Je suis peut être idiot, mais j’ai mis un moment à chercher pourquoi zebra ne se lançait pas lors du boot de mon serveur de test avant de regarder le fichier /var/log/messages qui m’indiquait que keepalived passait en FAULT.
Rebootez les serveurs en démarrant en premier le MASTER pour être sûr d’avoir le bon ordre au départ.
Une fois démarré les services doivent démarrer correctement.
Vérifiez les différentes adresses ips des interfaces avec la commande ip addr list ethx
où x est l’identifiant de l’interface.
Vérifiez les routes avec la commande route -n
ou pour avoir un détail plus poussé, utilisez l’utilitaire vtysh et exécutez la commande sh ip route
Sur le routeur CISCO, la commande pour vérifier les routes est la même.
Ici, un exemple de résultat de cette commande sur un CISCO.
Les routes ne sont pas exactement celles de l’article ci-dessus, car j’ai adapté les routes pour simplifier le document, sur la vrai config, j’ai 6 cartes réseau sur les Firewalls.
Vous remarquerez les routes précédeés par la lettre « R ».
Ce sont les routes annoncées par RIP.
Router>
Router>sh ip route
Codes: C - connected, S - static, I - IGRP, R - RIP, M -
D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area
N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2
E1 - OSPF external type 1, E2 - OSPF external type 2, E - EGP
i - IS-IS, L1 - IS-IS level-1, L2 - IS-IS level-2, * - candidate default
U - per-user static route, o - ODR
Gateway of last resort is 192.168.100.110 to network 0.0.0.0
192.168.104.0/24 is variably subnetted, 2 subnets, 2 masks
R 192.168.104.0/24 [120/1] via 192.168.100.110, 00:00:20, Ethernet0
R 192.168.104.100/32 [120/1] via 192.168.100.110, 00:00:20, Ethernet0
192.168.105.0/24 is variably subnetted, 2 subnets, 2 masks
R 192.168.105.0/24 [120/1] via 192.168.100.110, 00:00:20, Ethernet0
R 192.168.105.100/32 [120/1] via 192.168.100.110, 00:00:20, Ethernet0
C 192.168.210.0/24 is directly connected, Loopback0
192.168.102.0/24 is variably subnetted, 2 subnets, 2 masks
R 192.168.102.0/24 [120/1] via 192.168.100.110, 00:00:20, Ethernet0
R 192.168.102.100/32 [120/1] via 192.168.100.110, 00:00:20, Ethernet0
C 192.168.220.0/24 is directly connected, Loopback1
192.168.1.0/24 is variably subnetted, 2 subnets, 2 masks
R 192.168.1.100/32 [120/1] via 192.168.100.110, 00:00:20, Ethernet0
[120/1] via 192.168.100.111, 00:00:07, Ethernet0
R 192.168.1.0/24 [120/1] via 192.168.100.110, 00:00:22, Ethernet0
192.168.103.0/24 is variably subnetted, 2 subnets, 2 masks
R 192.168.103.0/24 [120/1] via 192.168.100.110, 00:00:22, Ethernet0
R 192.168.103.100/32 [120/1] via 192.168.100.110, 00:00:22, Ethernet0
192.168.100.0/24 is variably subnetted, 2 subnets, 2 masks
C 192.168.100.0/24 is directly connected, Ethernet0
R 192.168.100.100/32 [120/1] via 192.168.100.110, 00:00:22, Ethernet0
[120/1] via 192.168.100.111, 00:00:09, Ethernet0
R* 0.0.0.0/0 [120/1] via 192.168.100.110, 00:00:23, Ethernet0
Router>
Tests
VRRP
Pour valider le fonctionnement de l’adresse virtuelle, lancez un ping permanent sur cette ip et stoppez un des firewalls, ou déconnectez l’interface concernée.
Le ping ne devrait pas stopper et le fichier /var/log/messages du serveur de BACKUP vous indique qu’il passe MASTER.
Routage dynamique
Sur le routeur CISCO, la route vers les réseaux LAN1 et LAN2 passe par le Firewall 1 car il a un métrique plus petit que Firewall 2 ( d’ailleurs la route vers Firewall 2 n’apparaît pas dans le résultat de « sh ip route » ).
Stoppez le Firewall 1 et observez le comportement du routeur CISCO :
– le traffic réseau est coupé
– le routeur ne détecte pas de changement dans un premier temps
– il commence à dire que la route est « possibly down »
– il supprime cette route et met en place celle pointant vers Firewall 2.
– le traffic réseau repart
Le temps entre l’étape « le traffic réseau est coupé » et « le traffic réseau repart » est de 4 minutes qui est le temps de prise en compte du changement de route lié à RIP.
Pour un temps de rétablissement plus court, il faudrait utiliser un protocole plus évolué comme OSPF, mais cela sort du cadre de cet article.