Haute disponibilité avec OPNsense et CARP : paire actif/passif sans interruption

Configurez une paire OPNsense actif/passif avec CARP, pfsync et XMLRPC Config Sync sur Proxmox. Basculement automatique en moins de 3 secondes, mises à jour sans downtime, monitoring Grafana intégré — haute disponibilité enterprise à coût zéro.

Haute disponibilité avec OPNsense et CARP : paire actif/passif sans interruption
Architecture CARP haute disponibilité OPNsense actif passif
Architecture CARP : nœud MASTER actif et nœud BACKUP en attente sur la même VIP partagée

Qu'est-ce que CARP ?

CARP (Common Address Redundancy Protocol) est un protocole réseau qui permet à plusieurs machines de partager une adresse IP virtuelle (VIP). Développé initialement pour OpenBSD et intégré nativement dans OPNsense, CARP garantit la haute disponibilité de votre firewall : si le nœud maître tombe, le nœud de secours prend le relais en quelques secondes, de manière totalement transparente pour les connexions en cours.

Dans mon infra BOTUM, CARP résout trois problèmes concrets :

  • Mises à jour sans downtime : basculer sur le backup, mettre à jour le master, rebasculer — zéro interruption pour les clients.
  • Résilience aux pannes : panne VM Proxmox, crash OPNsense, coupure réseau — basculement automatique en moins de 3 secondes.
  • Maintenance planifiée : arrêt propre du master, le backup prend le relais, fenêtre de maintenance sans impact SLA.

Prérequis : 2 VMs OPNsense sur Proxmox

Pour mettre en place la haute disponibilité CARP, il vous faut :

  • 2 VMs OPNsense identiques sur Proxmox (même version, même configuration de base)
  • 3 interfaces réseau par VM : WAN, LAN, et SYNC (pfsync)
  • Un switch ou VLAN dédié pour le lien de synchronisation
  • Accès SSH aux deux nœuds
  • Même version OPNsense sur les deux nœuds (impératif pour la config sync)

Architecture réseau recommandée

# OPNsense-1 (MASTER)
# - vtnet0 : WAN  → IP: 203.0.113.2/28 (réelle)
# - vtnet1 : LAN  → IP: 192.168.1.1/24 (réelle)
# - vtnet2 : SYNC → IP: 192.168.254.1/30

# OPNsense-2 (BACKUP)
# - vtnet0 : WAN  → IP: 203.0.113.3/28 (réelle)
# - vtnet1 : LAN  → IP: 192.168.1.2/24 (réelle)
# - vtnet2 : SYNC → IP: 192.168.254.2/30

# VIPs CARP partagées (les clients utilisent ces IPs)
# - WAN VIP : 203.0.113.4/28  (VHID 1)
# - LAN VIP : 192.168.1.254/24 (VHID 2)
Configuration VIP CARP OPNsense interface web VHID skew
Interface OPNsense — configuration VIP CARP avec VHID, mot de passe et skew (0 = MASTER)

Configurer les VIPs CARP

Créer la VIP WAN sur le MASTER

Dans OPNsense MASTER : Interfaces > Virtual IPs > Settings > Add

Type         : CARP
Interface    : WAN
IP Address   : 203.0.113.4 / 28
Virtual VHID : 1
VHID Password: MonMotDePasseCarp2026
Advertising frequency - Base : 1
Advertising frequency - Skew : 0   ← 0 = MASTER (priorité haute)
Description  : WAN-VIP-CARP

Créer la VIP LAN sur le MASTER

Type         : CARP
Interface    : LAN
IP Address   : 192.168.1.254 / 24
Virtual VHID : 2
VHID Password: MonMotDePasseCarp2026
Advertising frequency - Base : 1
Advertising frequency - Skew : 0
Description  : LAN-VIP-CARP

Configurer le BACKUP (Skew 100)

Sur OPNsense-2 (BACKUP), créer les mêmes VIPs avec Skew = 100 :

# Sur OPNsense-2 (BACKUP) — même config, seul le skew change :
# WAN VIP : VHID 1, Skew 100  ← 100 = BACKUP (priorité basse)
# LAN VIP : VHID 2, Skew 100

# Règles CARP :
# - Skew 0   = priorité haute → MASTER actif
# - Skew 100 = priorité basse → BACKUP en attente
# - Plus le skew est bas, plus le nœud est prioritaire
pfsync synchronisation états connexion OPNsense haute disponibilité
pfsync en action : synchronisation temps réel des états TCP/UDP entre MASTER et BACKUP via le lien SYNC dédié

pfsync : Synchronisation des états de connexion

pfsync synchronise les tables d'états du firewall entre les deux nœuds en temps réel. Lors d'un basculement, les connexions TCP actives (SSH, HTTPS, tunnels VPN WireGuard) ne sont pas interrompues — le backup connaît déjà tous les états grâce à pfsync.

Activer pfsync sur le MASTER

System > High Availability > Settings

# System > High Availability > Settings

[High Availability Sync]
✓ Synchronize States (pfsync)
Synchronize Interface        : SYNC  (vtnet2)
pfsync Synchronize Peer IP   : 192.168.254.2  ← IP SYNC du BACKUP

[Firewall]
✓ Synchronize firewall rules
✓ Synchronize NAT
✓ Synchronize static routes

Activer pfsync sur le BACKUP

# System > High Availability > Settings (sur BACKUP)

[High Availability Sync]
✓ Synchronize States (pfsync)
Synchronize Interface        : SYNC  (vtnet2)
pfsync Synchronize Peer IP   : 192.168.254.1  ← IP SYNC du MASTER

⚠️ Le lien SYNC doit être isolé sur un VLAN ou réseau dédié. Ne jamais faire transiter du trafic utilisateur sur cette interface.

XMLRPC Config Sync

XMLRPC Config Sync propage automatiquement la configuration OPNsense du MASTER vers le BACKUP. Chaque modification sur le MASTER (nouvelle règle firewall, NAT, alias) est synchronisée sans intervention manuelle.

# System > High Availability > Settings

[Configuration Synchronization]
Synchronize Config to IP   : 192.168.254.2  ← IP SYNC du BACKUP
Remote System Username     : root
Remote System Password     : MotDePasseBackup2026

# Sections à synchroniser (toutes cochées) :
✓ Aliases          ✓ Auth Servers     ✓ Certificates
✓ DHCP Server      ✓ DNS Resolver     ✓ Firewall Rules
✓ Gateways         ✓ Interfaces       ✓ NAT
✓ OpenVPN/WireGuard ✓ Routes          ✓ Users and Groups

💡 Après chaque modification sur le MASTER, cliquez Save & Sync pour propager immédiatement vers le BACKUP.

Tester le basculement (Failover)

Le test de basculement est obligatoire avant la mise en production. Il valide que le backup prend bien le relais et que les connexions survivent.

Test 1 : Basculement manuel (arrêt propre)

# Vérifier l'état initial :
# MASTER : CARP State = MASTER (VIPs actives)
# BACKUP : CARP State = BACKUP (VIPs en attente)

# Sur le MASTER : forcer le passage en mode BACKUP
# System > High Availability > Forcefully become BACKUP

# Observer le BACKUP prendre le relais en ~2-3 secondes

Test 2 : Simulation de panne (arrêt brutal)

# Dans Proxmox, éteindre la VM OPNsense-1 (MASTER)
# qm stop 100

# Depuis un client réseau :
ping 203.0.113.4
# → 1-2 pertes max pendant le basculement
# → Reprise en 1-3 secondes

# Vérifier sur le BACKUP :
# VIP WAN : MASTER | VIP LAN : MASTER  ✓

Test 3 : Connexions actives survivent au failover

# Ouvrir une session SSH via la VIP LAN :
ssh admin@192.168.1.254

# Forcer le basculement pendant que la session est active
# La session SSH doit SURVIVRE grâce à pfsync
# Si SSH survit → pfsync fonctionne correctement ✓
Test basculement CARP OPNsense failover timeline trafic
Timeline du basculement CARP : T=0 MASTER actif, T=5s panne détectée, T=7s BACKUP reprend les VIPs

Cas d'usage : Production sans interruption

La principale valeur ajoutée de CARP dans mon infra BOTUM est la possibilité de faire des maintenances sans fenêtre d'indisponibilité.

Procédure de mise à jour OPNsense sans downtime

# Étape 1 : Vérifier que le BACKUP est sain
# System > High Availability > Status
# BACKUP : CARP BACKUP, pfsync OK, config synced

# Étape 2 : Basculer le trafic vers le BACKUP
# Sur MASTER : System > HA > Forcefully become BACKUP
# → BACKUP devient MASTER, prend toutes les VIPs

# Étape 3 : Mettre à jour l'ancien MASTER (maintenant BACKUP)
# System > Firmware > Updates > Upgrade
# → Redémarrage normal, aucun impact sur le trafic

# Étape 4 : Vérifier le retour de l'ancien MASTER
# → Il revient en mode BACKUP automatiquement
# → Vérifier : sync states OK + config sync OK

# Étape 5 : Répéter pour l'autre nœud
# Résultat : 2 nœuds mis à jour, 0 seconde de downtime
Grafana dashboard monitoring CARP OPNsense haute disponibilité
Dashboard Grafana CARP — état des VIPs, historique des basculements, métriques pfsync en temps réel

Intégration Grafana pour monitorer CARP

En complément du Billet 9 (Monitoring Grafana + InfluxDB), voici comment ajouter le suivi CARP à vos dashboards existants.

Collecter les métriques CARP via Telegraf

# Dans telegraf.conf — ajout input CARP :
[[inputs.http]]
  urls = ["http://192.168.1.254/api/diagnostics/interface/getVipStatus"]
  method = "GET"
  username = "telegraf_user"
  password = "VOTRE-TOKEN-API-OPNSENSE"
  data_format = "json"
  name_suffix = "_carp"

# Requête Flux Grafana — état CARP :
from(bucket: "opnsense")
  |> range(start: -1h)
  |> filter(fn: (r) => r._measurement == "http_carp")
  |> filter(fn: (r) => r._field == "status" or r._field == "vhid")

Panneaux recommandés pour le dashboard CARP

  • État CARP actuel (MASTER/BACKUP) pour chaque VIP — Gauge avec alerte si INACTIF
  • Historique des basculements — Timeline/Log panel (chaque event CARP)
  • Compteur pfsync : états synchronisés/seconde — Time series
  • Latence lien SYNC — Gauge (alerte si > 10ms)
  • Nombre d'états firewall synchronisés — Stat panel

Conclusion et prochaines étapes

Vous avez maintenant une infrastructure OPNsense en haute disponibilité active/passive, avec :

  • ✅ CARP VIPs partagées entre MASTER et BACKUP
  • ✅ pfsync pour la continuité des connexions TCP/UDP
  • ✅ XMLRPC Config Sync pour la propagation automatique de la config
  • ✅ Tests de basculement validés (graceful + hard failure)
  • ✅ Monitoring Grafana intégré pour la visibilité en temps réel

Cette stack vous donne un firewall enterprise-grade avec un RTO < 3 secondes et un RPO de 0 — aucune connexion perdue, aucune configuration désynchronisée.

🔗 Prochain billet : SIEM Wazuh avec OPNsense — Centralisation des logs et détection d'intrusions en temps réel.

🔗 Hub de la série : OPNsense Stack Sécurité Enterprise sur Proxmox

📥 Guide PDF complet

Téléchargez ce guide en PDF pour le consulter hors ligne.

⬇ Télécharger le guide (PDF)

🚀 Aller plus loin avec BOTUM

Ce guide couvre les bases. En production, chaque environnement a ses spécificités. Les équipes BOTUM accompagnent les organisations dans le déploiement, la configuration avancée et la sécurisation de leur infrastructure. Si vous avez un projet, parlons-en.

Discuter de votre projet →
Série OPNsense 📋 Voir la série complète →