Chapitre 522 minIntermédiaire
Redondance de passerelle : HSRP, VRRP, CARP et keepalived
Par Josselyn C., prof de BTS SIO. Mis à jour le .
À la fin de ce chapitre, tu sauras
- expliquer le partage d'une adresse IP et d'une adresse MAC virtuelles ;
- configurer HSRP et VRRP sur un équipement Cisco ;
- faire flotter une adresse virtuelle entre deux serveurs avec keepalived ;
- préparer un cluster de deux pare-feu avec CARP et pfsync ;
- régler la priorité, la préemption et le suivi.
5 exercices corrigés2 schémas
Un protocole de redondance de passerelle (FHRP, First Hop Redundancy Protocol) permet à deux routeurs, deux pare-feu ou deux serveurs de partager une adresse IP virtuelle : l'un la porte, l'autre la reprend automatiquement en quelques secondes s'il tombe. HSRP (propriétaire Cisco), VRRP (le standard), CARP (pfSense, OPNsense) et keepalived (un logiciel Linux qui implémente VRRP) reposent tous sur ce principe. Ce chapitre explique le mécanisme commun, puis la configuration de chacun, et les réglages qui font une bascule propre : priorité, préemption et suivi.
Le problème : une passerelle, un SPOF
Chaque poste du VLAN 10 de Ravelle Conseil reçoit par DHCP une seule passerelle par défaut, 10.10.10.254. Dès qu'il veut joindre une machine d'un autre réseau (un serveur du VLAN 20, Internet), il envoie ses trames à l'adresse MAC de cette passerelle. Si l'équipement qui porte 10.10.10.254 tombe, plus aucun poste ne sort de son réseau, même si un second routeur est branché à côté.
Configurer deux passerelles sur les postes ne résout rien : un poste utilise sa passerelle par défaut tant qu'elle répond à ARP, et les mécanismes de détection de passerelle morte des systèmes sont lents et peu fiables. La solution consiste à faire porter l'adresse de passerelle par un groupe d'équipements plutôt que par un seul.
Le principe commun : une adresse virtuelle partagée
Tous les protocoles de ce chapitre fonctionnent de la même façon :
- Chaque équipement garde sa propre adresse (ici 10.10.10.252 et 10.10.10.253), qui sert à l'administrer.
- Le groupe partage une adresse IP virtuelle (VIP, ici 10.10.10.254) et une adresse MAC virtuelle, dérivée du numéro de groupe. C'est la VIP que les postes reçoivent comme passerelle.
- Une élection désigne l'équipement actif, celui qui a la plus haute priorité (à égalité, la plus haute adresse IP). Lui seul répond aux requêtes ARP pour la VIP et transmet le trafic.
- L'actif annonce régulièrement qu'il est vivant, par des messages envoyés en multidiffusion sur le réseau.
- Si les annonces cessent pendant un délai donné, le secours se déclare actif, prend la VIP et envoie un ARP gratuit : un message qui annonce « la VIP est désormais derrière moi ». Les commutateurs mettent à jour leur table MAC, et le trafic des postes arrive au nouvel actif. Les postes n'ont rien vu : leur passerelle a gardé la même adresse IP et la même adresse MAC.
Trois réglages déterminent le comportement du groupe :
- la priorité : qui est actif quand tout va bien ;
- la préemption : quand un équipement de priorité supérieure revient (après un redémarrage, une réparation), reprend-il le rôle d'actif ? Avec préemption, oui, au prix d'une seconde microcoupure ; sans préemption, le secours garde le rôle jusqu'à sa propre panne ;
- le suivi (tracking) : l'actif baisse sa propre priorité si un élément qu'il surveille tombe (son lien vers Internet, son service HAProxy), pour laisser la place à un équipement en meilleur état.
HSRP, le protocole de Cisco
HSRP (Hot Standby Router Protocol) est le protocole propriétaire de Cisco, décrit dans une RFC informative (RFC 2281) pour sa version 1. Il ne fonctionne qu'entre équipements Cisco.
| Paramètre | HSRP version 1 | HSRP version 2 |
|---|---|---|
| Annonces (hello) | Multidiffusion 224.0.0.2, UDP 1985 | Multidiffusion 224.0.0.102, UDP 1985 |
| Numéros de groupe | 0 à 255 | 0 à 4095 |
| Adresse MAC virtuelle | 0000.0c07.acXX (XX : groupe en hexadécimal) | 0000.0c9f.fXXX |
| IPv6 | Non | Oui |
Dans les deux versions, l'actif et le secours envoient un hello toutes les 3 secondes ; le secours prend le relais après 10 secondes sans nouvelle (le hold time). La priorité vaut 100 par défaut, de 0 à 255. La préemption est désactivée par défaut : il faut l'activer explicitement. Les autres routeurs du groupe sont en écoute (listen), prêts à devenir secours.
L'exemple. Si le routage entre VLAN de Ravelle Conseil était assuré par deux commutateurs de niveau 3 plutôt que par le pare-feu, voici la configuration de la passerelle du VLAN 10. SW-CORE1 doit être actif, et céder sa place si son lien vers le pare-feu (Gi1/0/48) tombe :
! SW-CORE1
track 1 interface GigabitEthernet1/0/48 line-protocol
!
interface Vlan10
ip address 10.10.10.252 255.255.255.0
standby version 2
standby 10 ip 10.10.10.254
standby 10 priority 110
standby 10 preempt
standby 10 track 1 decrement 20
! SW-CORE2
interface Vlan10
ip address 10.10.10.253 255.255.255.0
standby version 2
standby 10 ip 10.10.10.254
standby 10 preempt
Si Gi1/0/48 tombe, la priorité de SW-CORE1 passe de 110 à 90, sous les 100 de SW-CORE2. Comme SW-CORE2 a la préemption, il prend le rôle d'actif alors que SW-CORE1 est toujours vivant. La vérification :
SW-CORE1# show standby brief
P indicates configured to preempt.
|
Interface Grp Pri P State Active Standby Virtual IP
Vl10 10 110 P Active local 10.10.10.253 10.10.10.254
Cisco propose aussi GLBP (Gateway Load Balancing Protocol), qui répartit le trafic sortant entre plusieurs passerelles actives en distribuant plusieurs adresses MAC virtuelles. Il est propriétaire, et rarement exigé au BTS.
VRRP, le standard
VRRP (Virtual Router Redundancy Protocol) est le protocole normalisé, que tous les constructeurs implémentent. Sa version 3, pour IPv4 et IPv6, est décrite par la RFC 9568 (2024), qui remplace la RFC 5798.
| Paramètre | VRRP |
|---|---|
| Transport | Directement sur IP, protocole n° 112, multidiffusion 224.0.0.18 (ff02::12 en IPv6) |
| Identifiant de groupe (VRID) | 1 à 255 |
| Adresse MAC virtuelle | 00-00-5E-00-01-XX (XX : VRID en hexadécimal) |
| Priorité | 1 à 254, 100 par défaut ; 255 est réservé au propriétaire de l'adresse, quand la VIP est aussi l'adresse réelle d'un des routeurs |
| Annonces | Envoyées par le seul maître, toutes les secondes par défaut |
| Délai de détection | 3 intervalles d'annonce plus un petit décalage qui dépend de la priorité, soit environ 3,6 secondes avec les valeurs par défaut |
| Préemption | Activée par défaut |
Le décalage (skew time) vaut (256 − priorité) ÷ 256 intervalle d'annonce : plus un secours a une priorité élevée, plus il réagit tôt, ce qui évite que plusieurs secours se déclarent maîtres en même temps. Avec la priorité 100 et une annonce par seconde : 3 + 156 ÷ 256 ≈ 3,61 secondes. Les rôles s'appellent traditionnellement Master et Backup ; la RFC 9568 parle désormais de routeur actif.
Sur un équipement Cisco, la syntaxe classique est proche de celle de HSRP :
interface Vlan10
ip address 10.10.10.252 255.255.255.0
vrrp 10 ip 10.10.10.254
vrrp 10 priority 110
Sur les versions récentes d'IOS XE, VRRP version 3 s'active avec fhrp version vrrp v3, puis se configure par famille d'adresses (vrrp 10 address-family ipv4, puis address 10.10.10.254 primary et priority 110). La logique reste identique.
| HSRP | VRRP | CARP | GLBP | |
|---|---|---|---|---|
| Origine | Cisco (propriétaire) | Standard IETF | OpenBSD, libre | Cisco (propriétaire) |
| Où on le trouve | Routeurs et commutateurs Cisco | Tous les constructeurs, Linux (keepalived) | pfSense, OPNsense, systèmes BSD | Routeurs et commutateurs Cisco |
| Annonces | Actif et secours, toutes les 3 s | Maître seul, toutes les 1 s | Maître, toutes les 1 s par défaut | Toutes les 3 s |
| Préemption par défaut | Non | Oui | Réglable sur le système | Non |
| Répartition de charge | Non (un actif par groupe) | Non (un maître par groupe) | Non (un maître par adresse) | Oui |
keepalived : VRRP sous Linux
keepalived implémente VRRP sous Linux. Il sert à faire flotter une adresse virtuelle entre deux serveurs : deux répartiteurs HAProxy, deux serveurs DNS, deux passerelles Linux. C'est la réponse à la question qui tombe à chaque recette d'E6 : « Votre répartiteur est un point unique de panne, non ? »
L'exemple. Chez Ravelle Conseil, l'unique répartiteur SRV-LB (10.10.20.30) devient deux VM, LB1 (10.10.20.28) et LB2 (10.10.20.29), placées sur deux hôtes différents. Elles se partagent la VIP 10.10.20.30, l'ancienne adresse de SRV-LB : le DNS, le certificat et les postes ne changent pas. Sur les deux machines :
apt install keepalived
useradd --system --no-create-home --shell /usr/sbin/nologin keepalived_script
echo 'net.ipv4.ip_nonlocal_bind = 1' > /etc/sysctl.d/90-vip.conf
sysctl --system
Le compte keepalived_script sert à exécuter les scripts de contrôle sans les droits de root : keepalived l'utilise automatiquement s'il existe. Le réglage ip_nonlocal_bind permet à HAProxy de démarrer en écoutant sur la VIP même sur la machine qui ne la porte pas encore, sinon HAProxy refuse de démarrer sur le secours.
Le fichier /etc/keepalived/keepalived.conf de LB1 :
global_defs {
router_id LB1
enable_script_security
}
vrrp_script chk_haproxy {
script "/usr/bin/systemctl is-active --quiet haproxy"
interval 2
fall 2
rise 2
weight -30
}
vrrp_instance VI_INTRANET {
state MASTER
interface ens18
virtual_router_id 30
priority 150
advert_int 1
virtual_ipaddress {
10.10.20.30/24
}
track_script {
chk_haproxy
}
}
Sur LB2, le même fichier avec router_id LB2, state BACKUP et priority 130.
| Directive | Rôle |
|---|---|
vrrp_script | Un contrôle exécuté toutes les 2 secondes ; après 2 échecs (fall), il retire 30 à la priorité (weight -30) ; après 2 succès (rise), il la rend |
state | L'état de départ ; l'élection par priorité décide ensuite |
interface | La carte réseau qui porte la VIP et envoie les annonces |
virtual_router_id | Le VRID, identique sur les deux machines et unique sur le réseau |
priority | 150 sur LB1, 130 sur LB2 |
advert_int | Une annonce par seconde |
track_script | Relie le contrôle à l'instance |
Le calcul des priorités est la clé : si HAProxy s'arrête sur LB1, sa priorité passe de 150 à 120, sous les 130 de LB2, qui prend la VIP alors que LB1 est toujours allumé. Sans ce contrôle, keepalived ne surveillerait que la machine : un HAProxy arrêté sur un LB1 vivant couperait l'intranet sans aucune bascule.
On démarre et on vérifie :
systemctl enable --now keepalived
ip -br address show ens18
# ens18 UP 10.10.20.28/24 10.10.20.30/24 ← sur LB1 : la VIP est là
journalctl -u keepalived -n 20
# ... (VI_INTRANET) Entering MASTER STATE
Le pare-feu local. Les annonces VRRP sont des paquets IP de protocole 112, envoyés en multidiffusion vers 224.0.0.18. Si le pare-feu local d'une des machines les bloque, chaque nœud croit l'autre mort et les deux deviennent maîtres : la même VIP existe deux fois sur le réseau, et l'intranet fonctionne par intermittence au gré des mises à jour ARP. Avec nftables, autorise-les explicitement dans la chaîne d'entrée :
ip protocol 112 ip saddr { 10.10.20.28, 10.10.20.29 } accept
Être prévenu des bascules. keepalived peut lancer un script à chaque changement d'état (notify_master, notify_backup, notify_fault), et il écrit chaque transition dans le journal. Fais remonter ces lignes dans ta supervision : une bascule qui passe inaperçue laisse le service sans redondance (chapitre 11).
CARP et pfsync : deux pare-feu en cluster
Le pare-feu est souvent le SPOF le plus critique : il route entre les VLAN, il fait la traduction d'adresses vers Internet, il termine les VPN. pfSense (comme OPNsense) le double avec trois mécanismes complémentaires :
| Mécanisme | Rôle |
|---|---|
| CARP (Common Address Redundancy Protocol) | Le partage des adresses virtuelles, sur le même principe que VRRP. Né sous OpenBSD comme alternative libre, il utilise lui aussi le protocole IP 112. Chaque adresse virtuelle a un identifiant (VHID) ; le pare-feu au plus petit décalage d'annonce (advskew) est maître |
| pfsync | La synchronisation de la table d'états du pare-feu : les connexions en cours (un téléchargement, une session VPN, un appel) continuent après la bascule, parce que le secours connaît déjà leur état |
| Synchronisation de la configuration (XMLRPC) | La recopie automatique des règles, alias, NAT et autres réglages du maître vers le secours : on n'administre que le maître |
Les conditions d'un cluster de pare-feu.
- Trois adresses par réseau : une pour chaque pare-feu et l'adresse virtuelle. Côté WAN, il faut donc trois adresses publiques dans le même réseau, ce qu'une simple box d'opérateur ne fournit pas toujours.
- Une interface dédiée à la synchronisation, idéalement un câble direct entre les deux pare-feu : pfsync transporte la table d'états, et ce trafic n'a rien à faire sur le LAN.
- La traduction d'adresses sortante sur l'adresse virtuelle WAN : si les connexions sortaient avec l'adresse réelle de PF1, elles casseraient à la bascule.
- Les services du pare-feu sur les adresses virtuelles : le DHCP distribue la VIP LAN comme passerelle et comme DNS, les VPN écoutent sur la VIP WAN.
- Un matériel identique (ou des interfaces nommées à l'identique), pour que la configuration recopiée corresponde.
Pour une mise à jour, pfSense propose un mode maintenance CARP (dans Status > CARP) : le maître cède volontairement son rôle, on le met à jour, on vérifie, on sort du mode maintenance, puis on fait de même pour le secours. Les utilisateurs ne voient au pire qu'une microcoupure. Le cours Pare-feu pfSense monte cette grappe pas à pas sur le labo de Sorbier, plan d'adressage compris : Haute disponibilité pfSense : CARP et pfsync.
Préemption, minuteries et suivi : les bons réglages
La préemption. Elle garantit que l'équipement le mieux placé (le plus puissant, le mieux relié) reprend son rôle dès qu'il revient. Mais un équipement qui redémarre en boucle fait alors basculer le service à chaque redémarrage : c'est le flapping, et chaque bascule est une microcoupure. On peut retarder la préemption (standby 10 preempt delay minimum 60 sur Cisco) pour laisser au revenant le temps de converger, ou la désactiver et revenir à la main, de façon planifiée. Avec keepalived, nopreempt impose que les deux nœuds démarrent en state BACKUP.
Les minuteries. Des annonces plus fréquentes détectent la panne plus vite, mais une simple surcharge du processeur ou une congestion passagère peut alors déclencher une bascule inutile. Les valeurs par défaut (environ 3,6 secondes en VRRP, 10 secondes en HSRP) conviennent à la plupart des services ; on les réduit seulement si l'engagement de service l'exige, et après des tests.
Le suivi. Sans suivi, le protocole ne surveille que la présence du voisin. Un routeur actif dont le lien vers Internet est tombé reste actif et jette tout le trafic. Suis toujours ce qui fait l'utilité de l'équipement : le lien montant d'un routeur, le service d'un serveur.
Exercices
Exercice 1 sur 5 Combien de temps dure la bascule ? Réussi À revoir
- Deux routeurs VRRP, annonce toutes les secondes. Le secours a la priorité 100. Combien de temps après la dernière annonce reçue se déclare-t-il maître ?
- Même question avec un secours de priorité 200.
- Deux routeurs HSRP avec les minuteries par défaut. Au bout de combien de temps, au plus, le secours devient-il actif ?
- Pourquoi la durée totale de coupure vue par un utilisateur est-elle un peu plus longue que ces valeurs ?
Voir la réponseMasquer la réponse de l'exercice 1
- Délai = 3 × 1 + (256 − 100) ÷ 256 × 1 = 3 + 0,609 ≈ 3,61 secondes.
- 3 + (256 − 200) ÷ 256 = 3 + 0,219 ≈ 3,22 secondes. La priorité élevée fait réagir le secours un peu plus tôt.
- Le hold time par défaut : 10 secondes sans hello.
- Il faut ajouter le temps entre la panne réelle et la dernière annonce reçue (jusqu'à un intervalle), la mise à jour des tables MAC des commutateurs par l'ARP gratuit, et pour une connexion TCP le délai de retransmission du client. Une connexion en cours peut aussi être perdue si l'état n'est pas synchronisé (c'est le rôle de pfsync sur un pare-feu).
Tu avais trouvé ?
Exercice 2 sur 5 Le suivi sans préemption Réussi À revoir
SW-CORE1 : priorité 110, préemption, suivi de son lien vers le pare-feu avec decrement 20. SW-CORE2 : priorité 100, sans préemption. Les deux sont configurés en HSRP pour le VLAN 10, et SW-CORE1 est actif.
- Le lien de SW-CORE1 vers le pare-feu tombe. Quelle est sa nouvelle priorité ? SW-CORE2 devient-il actif ?
- Que faut-il corriger ?
- Le lien revient. Que se passe-t-il, une fois la correction faite ?
Voir la réponseMasquer la réponse de l'exercice 2
- 110 − 20 = 90. Mais SW-CORE1 est toujours vivant et continue d'envoyer ses hello : sans préemption, SW-CORE2 ne prend pas le rôle d'un actif vivant, même de priorité inférieure. SW-CORE2 reste en secours, et le trafic des postes arrive sur un SW-CORE1 qui ne peut plus le router. Le suivi ne sert à rien.
- Activer
standby 10 preemptsur SW-CORE2 : la préemption doit être configurée sur l'équipement qui doit prendre la place. - La priorité de SW-CORE1 remonte à 110, au-dessus des 100 de SW-CORE2. Comme SW-CORE1 a la préemption, il redevient actif.
Tu avais trouvé ?
Exercice 3 sur 5 Deux maîtres keepalived Réussi À revoir
Après l'installation de keepalived sur LB1 et LB2, journalctl -u keepalived affiche « Entering MASTER STATE » sur les deux machines, et ip -br address montre la VIP 10.10.20.30 sur les deux. L'intranet répond une fois sur deux.
- Comment s'appelle cette situation, et pourquoi l'intranet répond-il par intermittence ?
- Cite trois causes possibles.
- Quelle commande lancerais-tu sur LB2 pour vérifier qu'il reçoit les annonces de LB1 ?
Voir la réponseMasquer la réponse de l'exercice 3
- Un double maître (une forme de split-brain) : chaque nœud ne reçoit pas les annonces de l'autre et se croit seul. Les deux répondent aux requêtes ARP pour la VIP avec leur propre adresse MAC, et les postes envoient leurs paquets tantôt à l'un, tantôt à l'autre, selon la dernière réponse ARP reçue ; les connexions établies cassent à chaque changement.
- Le pare-feu local qui bloque le protocole IP 112 ou la multidiffusion vers 224.0.0.18 ; des
virtual_router_iddifférents sur les deux machines ; des interfaces dans des réseaux ou des VLAN différents ; un filtrage de la multidiffusion sur le commutateur virtuel ou l'hyperviseur. - Une capture des annonces :
tcpdump -i ens18 -n ip proto 112. Si rien ne s'affiche venant de 10.10.20.28, les annonces n'arrivent pas.
Tu avais trouvé ?
Exercice 4 sur 5 Les adresses MAC virtuelles Réussi À revoir
Donne l'adresse MAC virtuelle utilisée par :
- le groupe VRRP de VRID 30 ;
- le groupe HSRP version 1 numéro 10 ;
- le groupe HSRP version 2 numéro 10.
Pourquoi une adresse MAC virtuelle est-elle indispensable, en plus de l'adresse IP virtuelle ?
Voir la réponseMasquer la réponse de l'exercice 4
- 30 = 0x1E : 00-00-5E-00-01-1E.
- 10 = 0x0A : 0000.0c07.ac0a.
- 0000.0c9f.f00a.
Les postes gardent dans leur cache ARP l'association entre la passerelle et une adresse MAC. Si la MAC changeait à chaque bascule, les postes continueraient d'envoyer leurs trames à l'ancienne adresse jusqu'à l'expiration de leur cache. Avec une MAC virtuelle qui suit la VIP, seul le commutateur doit apprendre le nouveau port, ce que l'ARP gratuit déclenche immédiatement.
Tu avais trouvé ?
Exercice 5 sur 5 Préparer un cluster pfSense Réussi À revoir
Ravelle Conseil achète un second pare-feu pour former un cluster avec PF-SIEGE. Pour le VLAN 10 et le WAN, propose les adresses de chaque pare-feu et de l'adresse virtuelle, et réponds :
- Quelle passerelle le DHCP doit-il distribuer aux postes ?
- Avec quelle adresse source les connexions vers Internet doivent-elles sortir, et pourquoi ?
- Que se passe-t-il pour un téléchargement en cours au moment de la bascule, avec et sans pfsync ?
Voir la réponseMasquer la réponse de l'exercice 5
Une proposition : VLAN 10, PF1 en 10.10.10.252, PF2 en 10.10.10.253, VIP CARP en 10.10.10.254 (l'adresse de passerelle actuelle, que les postes connaissent déjà). WAN : PF1 en 203.0.113.11, PF2 en 203.0.113.12, VIP en 203.0.113.10 (l'adresse publique actuelle). Une interface SYNC dédiée, par exemple 192.168.255.1 et 192.168.255.2 sur un câble direct.
- La VIP 10.10.10.254, jamais l'adresse réelle d'un des pare-feu.
- Avec la VIP WAN 203.0.113.10 : c'est elle qui passe au secours lors de la bascule. Avec l'adresse réelle de PF1, les réponses d'Internet arriveraient à une adresse disparue.
- Avec pfsync, PF2 connaît déjà la connexion dans sa table d'états : le téléchargement continue après une pause de quelques secondes. Sans pfsync, PF2 voit arriver des paquets d'une connexion qu'il ne connaît pas et les rejette : le téléchargement échoue et doit être relancé.
Tu avais trouvé ?