Monitoring OPNsense avec Grafana et InfluxDB : tableaux de bord temps réel

Déployez une stack de monitoring temps réel pour OPNsense avec Telegraf, InfluxDB 2.x et Grafana sur Docker/Proxmox. Dashboards WAN/VLAN/VPN, alerting Telegram, intégration Suricata et AdGuard Home — visibilité totale sur votre infrastructure.

Monitoring OPNsense avec Grafana et InfluxDB : tableaux de bord temps réel
Architecture monitoring OPNsense Telegraf InfluxDB Grafana
Architecture de la stack monitoring : OPNsense → Telegraf → InfluxDB → Grafana

Pourquoi monitorer son firewall ?

Un firewall sans monitoring, c'est conduire les yeux bandés. Sur mon infra BOTUM, j'ai appris à la dure que les problèmes réseau les plus coûteux sont ceux qu'on ne voit pas venir : une saturation WAN silencieuse à 3h du matin, une tentative d'intrusion qui passe entre les mailles, un VLAN IoT qui génère 10x plus de trafic que la normale.

Le monitoring temps réel avec Grafana + InfluxDB m'apporte trois choses essentielles :

  • Visibilité complète : voir en temps réel ce qui passe sur chaque interface, chaque VLAN, chaque tunnel VPN.
  • Détection d'anomalies : identifier les comportements anormaux — spike de trafic, flood DNS, connexions vers des IPs suspectes.
  • Conformité SLA : prouver la disponibilité (uptime), documenter les incidents réseau, mesurer la latence WAN.

Ce billet est le 9e et dernier de la Série Stack OPNsense. Vous avez déjà le firewall, les VLANs, le VPN, le WiFi, la protection IDS/IPS, le NAC et le DNS. Il ne manquait que les yeux.

Architecture de la stack monitoring

La stack que j'utilise est simple et éprouvée :

OPNsense (données brutes)
     ↓  plugin os-telegraf (collecte)
Telegraf (agent de métriques)
     ↓  HTTP/UDP vers port 8086
InfluxDB 2.x (base time-series)
     ↓  source de données Grafana
Grafana (visualisation + alerting)
     ↓  notifications
Email / Telegram / Slack

Chaque composant tourne dans un container Docker sur une VM Proxmox dédiée. J'alloue 2 vCPU + 2 Go RAM — largement suffisant pour une infra jusqu'à 1 Gbps de trafic agrégé.

Activer l'export InfluxDB dans OPNsense

Installer le plugin os-telegraf

# Dans OPNsense : System > Firmware > Plugins
# Chercher "telegraf" et installer : os-telegraf

# Ou via SSH dans OPNsense :
pkg install os-telegraf

Configurer Telegraf dans OPNsense

# Services > Telegraf > General
# Cocher : Enable Telegraf
# InfluxDB URL : http://PROXMOX-IP:8086
# Token : (généré dans InfluxDB)
# Bucket : opnsense
# Organization : botum

# Activer les collecteurs :
# ✓ Interfaces (trafic par interface)
# ✓ Firewall (règles, états)
# ✓ CPU / Memory / Disk
# ✓ Gateway (latence WAN)

Configuration telegraf.conf avancée

[agent]
  interval = "10s"
  flush_interval = "10s"

[[inputs.net]]
  interfaces = ["em0", "vtnet0", "igc0"]

[[inputs.cpu]]
  totalcpu = true

[[inputs.mem]]

[[inputs.system]]

[[inputs.netstat]]

[[outputs.influxdb_v2]]
  urls = ["http://192.168.1.x:8086"]
  token = "VOTRE-TOKEN-INFLUXDB"
  organization = "botum"
  bucket = "opnsense"
  timeout = "5s"
InfluxDB 2.x interface web OPNsense bucket
Interface InfluxDB 2.x — bucket opnsense avec données Telegraf

Installer InfluxDB 2.x en Docker sur Proxmox

Docker Compose — Stack monitoring complète

mkdir -p /opt/monitoring/{influxdb,grafana}
cd /opt/monitoring

cat > docker-compose.yml << 'EOF'
version: '3.8'

services:
  influxdb:
    image: influxdb:2.7
    container_name: influxdb
    restart: unless-stopped
    ports:
      - "8086:8086"
    volumes:
      - ./influxdb/data:/var/lib/influxdb2
      - ./influxdb/config:/etc/influxdb2
    environment:
      DOCKER_INFLUXDB_INIT_MODE: setup
      DOCKER_INFLUXDB_INIT_USERNAME: admin
      DOCKER_INFLUXDB_INIT_PASSWORD: BotumSecure2026!
      DOCKER_INFLUXDB_INIT_ORG: botum
      DOCKER_INFLUXDB_INIT_BUCKET: opnsense
      DOCKER_INFLUXDB_INIT_RETENTION: 90d

  grafana:
    image: grafana/grafana:latest
    container_name: grafana
    restart: unless-stopped
    ports:
      - "3000:3000"
    volumes:
      - ./grafana:/var/lib/grafana
    environment:
      GF_SECURITY_ADMIN_PASSWORD: BotumSecure2026!
      GF_INSTALL_PLUGINS: grafana-clock-panel,grafana-worldmap-panel
    depends_on:
      - influxdb

EOF

docker compose up -d
echo "InfluxDB : http://PROXMOX-IP:8086"
echo "Grafana  : http://PROXMOX-IP:3000"

Générer le token InfluxDB

# Via l'interface web InfluxDB (http://IP:8086)
# Load Data > API Tokens > Generate API Token > All Access
# Copier le token (88 caractères)

# Ou via CLI :
docker exec influxdb influx auth create   --org botum   --all-access   --description "Telegraf OPNsense"

⚠️ Stockez le token dans votre gestionnaire de secrets (Vaultwarden). Il ne sera affiché qu'une seule fois.

Configurer Grafana avec InfluxDB

Ajouter la source de données InfluxDB

# Grafana → Configuration > Data Sources > Add Data Source
# Sélectionner : InfluxDB
# Query Language : Flux (pour InfluxDB 2.x)
# URL : http://influxdb:8086
# Organization : botum
# Token : VOTRE-TOKEN
# Default Bucket : opnsense
# Save & Test → "datasource is working. 1 buckets found"

Requête Flux de base — trafic WAN

from(bucket: "opnsense")
  |> range(start: -1h)
  |> filter(fn: (r) => r._measurement == "net")
  |> filter(fn: (r) => r.interface == "em0")
  |> filter(fn: (r) => r._field == "bytes_recv" or r._field == "bytes_sent")
  |> derivative(unit: 1s, nonNegative: true)
  |> map(fn: (r) => ({ r with _value: r._value * 8.0 }))
  |> aggregateWindow(every: 30s, fn: mean, createEmpty: false)
Grafana dashboard OPNsense monitoring temps réel
Dashboard Grafana OPNsense — WAN, VPN, VLANs, menaces bloquées en temps réel

Importer les dashboards OPNsense

La communauté Grafana propose d'excellents dashboards préconçus pour OPNsense :

  • OPNsense Overview (ID: 13713) — Trafic WAN, CPU, mémoire, états firewall, gateways
  • OPNsense Interfaces (ID: 14966) — Débit par interface, erreurs, paquets/sec
  • OPNsense Firewall Rules (ID: 15413) — Hits par règle, connexions bloquées, géolocalisation IPs
  • VLAN Traffic (personnalisé) — Trafic par VLAN, top clients, anomalies
  • OPNsense VPN WireGuard (personnalisé) — Pairs connectés, trafic par tunnel, latence
# Import via Grafana UI :
# Dashboards > Import > Dashboard ID
# Dashboard ID 13713 → OPNsense Overview
# Data Source = InfluxDB (opnsense)

# Variables du dashboard :
# Bucket : opnsense
# Interfaces WAN : em0, vtnet0
# Interfaces LAN/VLAN : vtnet1, vtnet2, vtnet3...

Alerting Grafana : bande passante et connexions suspectes

Configurer un contact point Telegram

# Grafana → Alerting > Contact Points > Add Contact Point
# Type : Telegram
# Bot Token : votre token Telegram Bot
# Chat ID   : votre Chat ID
# Test → message Telegram reçu ✓

Alerte — saturation bande passante WAN

# Flux query :
from(bucket: "opnsense")
  |> range(start: -5m)
  |> filter(fn: (r) => r._measurement == "net" and r.interface == "em0")
  |> filter(fn: (r) => r._field == "bytes_sent" or r._field == "bytes_recv")
  |> derivative(unit: 1s, nonNegative: true)
  |> map(fn: (r) => ({ r with _value: r._value * 8.0 }))
  |> sum()

# Condition : avg() > 900000000 (900 Mbps) pendant 2 minutes
# Alerte → Telegram : "Saturation WAN détectée"
Grafana alerting règles bande passante connexions suspectes
Configuration des alertes Grafana — seuils bande passante et connexions suspectes

Alerte — connexions suspectes (spike)

from(bucket: "opnsense")
  |> range(start: -10m)
  |> filter(fn: (r) => r._measurement == "pf_state")
  |> filter(fn: (r) => r._field == "count")
  |> derivative(unit: 1m, nonNegative: true)
  |> mean()

# Condition : mean() > 5000 connexions/min
# Calibrer sur 1 semaine de trafic normal avant de fixer les seuils

Intégrer Suricata et AdGuard Home dans Grafana

Logs Suricata via Loki

# Ajouter dans docker-compose.yml :
  loki:
    image: grafana/loki:latest
    container_name: loki
    restart: unless-stopped
    ports:
      - "3100:3100"

  promtail:
    image: grafana/promtail:latest
    container_name: promtail
    volumes:
      - /var/log:/var/log:ro
      - ./promtail-config.yml:/etc/promtail/config.yml

# OPNsense : activer Suricata EVE JSON logs
# Intrusion Detection > Administration > Log to syslog : ON

# promtail-config.yml :
scrape_configs:
  - job_name: suricata
    static_configs:
      - targets: [localhost]
        labels:
          job: suricata
          __path__: /var/log/suricata/*.json

Métriques AdGuard Home via API REST

# Intégration Telegraf → InfluxDB :
[[inputs.http]]
  urls = ["http://192.168.1.x:3000/control/stats"]
  method = "GET"
  username = "admin"
  password = "VOTRE-MOT-DE-PASSE"
  data_format = "json"
  name_suffix = "_adguard"

# Requête Grafana :
from(bucket: "opnsense")
  |> range(start: -24h)
  |> filter(fn: (r) => r._measurement == "http_adguard")
  |> filter(fn: (r) => r._field == "dns_queries" or r._field == "blocked_filters")
Grafana Suricata AdGuard Home logs unified dashboard
Vue unifiée Grafana : alertes Suricata IDS + statistiques DNS AdGuard Home

Conclusion : récapitulatif de la série complète

Nous voici au bout de 9 billets qui construisent une infrastructure réseau enterprise complète à partir d'OPNsense sur Proxmox. Voici ce que vous avez maintenant :

Cette stack vous donne une infrastructure réseau que la plupart des PME à $50k/an de budget réseau ne possèdent pas — pour moins de $500 en matériel et $0 en licences logicielles.

Les prochaines étapes : la Série OpenClaw — automatisation de l'infra, agents intelligents, self-healing network. Restez connectés.

🔗 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 →