Surveiller les annonces BGP avec BGPalerter sur Linux

10 min de lecture·Matthieu·rpkinetworkingbgpalertermonitoringbgp|

Déployez BGPalerter v2 sur un VPS Linux pour surveiller vos préfixes contre les hijacks, les fuites de routes et les états RPKI invalides. Configurez les alertes Slack et email, exécutez le tout en service systemd.

Si vous annoncez vos propres préfixes via BGP, vous devez savoir quand quelque chose tourne mal. Un hijack de préfixe, une fuite de route, une erreur de configuration RPKI : ces incidents peuvent couper votre réseau ou détourner votre trafic vers un attaquant. BGPalerter surveille les données publiques des route collectors et vous alerte en temps réel.

Ce tutoriel installe BGPalerter v2 sur Ubuntu 24.04, configure la surveillance des préfixes et ASN, met en place les notifications Slack et email, et fait tourner le tout en service systemd. Il suppose que BGP est déjà en place avec BIRD2 ou FRR.

Que surveille BGPalerter et comment fonctionne-t-il ?

BGPalerter surveille vos préfixes BGP en temps réel via les données publiques des route collectors de RIPE RIS. Il se connecte en WebSocket à ris-live.ripe.net, qui agrège les flux de plus de 600 pairs dans le monde. Aucune intégration avec vos routeurs n'est nécessaire. Il tourne sur n'importe quel serveur Linux avec un accès internet sortant.

BGPalerter embarque ces moniteurs :

Moniteur Ce qu'il détecte Canal par défaut
monitorHijack AS d'origine incorrect, hijacks de sous-préfixe hijack
monitorVisibility Préfixe retiré ou vu par trop peu de pairs visibility
monitorNewPrefix Sous-préfixe inattendu annoncé par votre AS newprefix
monitorPath Le chemin AS correspond à un motif regex (scrubbing, changement de transit) path
monitorPathNeighbors AS upstream/downstream inattendu dans le chemin path
monitorAS Votre ASN annonce un préfixe non déclaré misconfiguration
monitorRPKI Préfixe annoncé avec un état RPKI invalide rpki
monitorROAS ROA ajouté, modifié, supprimé ou expirant roa

Chaque moniteur possède un paramètre thresholdMinPeers. Une alerte ne se déclenche que lorsque l'anomalie est confirmée par au moins ce nombre de pairs du route collector, ce qui réduit les faux positifs.

Comment installer BGPalerter sur Ubuntu 24.04 ?

Téléchargez le dernier binaire BGPalerter depuis GitHub et rendez-le exécutable. Pas besoin d'installer Node.js avec le binaire précompilé. Le binaire autonome embarque le runtime Node.js ; prévoyez au moins 1 Go de RAM libre sur le serveur de surveillance.

Créer un utilisateur dédié

Exécutez BGPalerter sous son propre compte non privilégié. Ne faites jamais tourner des outils de surveillance réseau en root sans raison.

sudo adduser --system --group --home /opt/bgpalerter --shell /usr/sbin/nologin bgpalerter

Télécharger le binaire

cd /opt/bgpalerter
sudo -u bgpalerter curl -Lo /opt/bgpalerter/bgpalerter-linux-x64 https://github.com/nttgin/BGPalerter/releases/latest/download/bgpalerter-linux-x64
sudo chmod +x /opt/bgpalerter/bgpalerter-linux-x64
ls -la /opt/bgpalerter/bgpalerter-linux-x64

Le fichier devrait peser environ 140 Mo. Le binaire est autonome et embarque le runtime Node.js. Aucune dépendance externe.

Alternative Docker

Si vous préférez les conteneurs :

docker run -d --name bgpalerter \
  -v /opt/bgpalerter/volume:/opt/bgpalerter/volume \
  --restart unless-stopped \
  nttgin/bgpalerter:latest run serve -- --d /opt/bgpalerter/volume/

Placez vos fichiers config.yml et prefixes.yml dans /opt/bgpalerter/volume/ avant de démarrer le conteneur. La suite de ce tutoriel couvre la méthode binaire. Les fichiers de configuration sont identiques dans les deux cas.

Comment configurer prefixes.yml pour surveiller mon ASN ?

BGPalerter doit savoir quels préfixes et ASN vous appartiennent. La commande generate interroge les données de routage publiques et construit prefixes.yml à partir de ce que votre AS annonce actuellement.

sudo -u bgpalerter /opt/bgpalerter/bgpalerter-linux-x64 generate \
  -a YOUR_ASN \
  -o /opt/bgpalerter/prefixes.yml \
  -i -m

Remplacez YOUR_ASN par votre numéro d'AS (chiffres uniquement, sans le préfixe « AS »). Les options :

Option Fonction
-a ASN(s) à surveiller. Séparés par des virgules pour plusieurs : -a 64496,64497
-o Chemin du fichier de sortie
-i Ignorer les préfixes délégués (originés par d'autres ASN)
-m Détecter automatiquement tous les ASN d'origine de vos préfixes

La commande produit un fichier de ce type :

198.51.100.0/24:
  description: Production network
  asn: 64496
  ignoreMorespecifics: false
  ignore: false

2001:db8::/32:
  description: IPv6 allocation
  asn: 64496
  ignoreMorespecifics: false
  ignore: false

options:
  monitorASns:
    64496:
      group: default

Champs principaux

ignoreMorespecifics : Passez à true si vous désagrégez volontairement (par exemple, vous annoncez à la fois un /24 et des /25). À false, BGPalerter alerte sur toute annonce plus spécifique inattendue. Pour la plupart des opérateurs, false est le bon défaut. Des more-specifics inattendus sont un signal de hijack.

options.monitorASns : Active monitorAS pour votre ASN. BGPalerter alerte si votre ASN commence à originer un préfixe absent du fichier.

group : Contrôle le routage des alertes. Le groupe default est associé aux canaux de notification. Vous pouvez créer des groupes séparés (par exemple noc, engineering) et les diriger vers différents canaux Slack ou listes de diffusion.

Modifiez le fichier généré pour ajouter des descriptions, ajuster ignoreMorespecifics par préfixe, ou ajouter des préfixes pas encore annoncés mais à surveiller contre toute origination non autorisée.

Comment configurer config.yml ?

L'assistant de configuration automatique crée un config.yml par défaut au premier lancement. En production, vous voulez un contrôle explicite sur chaque paramètre.

Créez /opt/bgpalerter/config.yml :

connectors:
  - file: connectorRIS
    name: ris
    params:
      carefulSubscription: true
      url: ws://ris-live.ripe.net/v1/ws/
      perMessageDeflate: true

monitors:
  - file: monitorHijack
    channel: hijack
    name: basic-hijack-detection
    params:
      thresholdMinPeers: 3

  - file: monitorVisibility
    channel: visibility
    name: withdrawal-detection
    params:
      thresholdMinPeers: 40
      notificationIntervalSeconds: 3600

  - file: monitorNewPrefix
    channel: newprefix
    name: newprefix-detection
    params:
      thresholdMinPeers: 3

  - file: monitorAS
    channel: misconfiguration
    name: asn-monitor
    params:
      thresholdMinPeers: 3

  - file: monitorRPKI
    channel: rpki
    name: rpki-monitor
    params:
      thresholdMinPeers: 3
      checkUncovered: true
      checkDisappearing: true

  - file: monitorROAS
    channel: roa
    name: rpki-diff
    params:
      enableDiffAlerts: true
      enableExpirationAlerts: true
      roaExpirationAlertHours: 2
      checkOnlyASns: true

  - file: monitorPathNeighbors
    channel: path
    name: path-neighbors
    params:
      thresholdMinPeers: 3

reports:
  - file: reportFile
    channels:
      - hijack
      - newprefix
      - visibility
      - path
      - misconfiguration
      - rpki
      - roa
    params:
      persistAlertData: false
      alertDataDirectory: alertdata/

notificationIntervalSeconds: 86400
persistStatus: true
alertOnlyOnce: false
fadeOffSeconds: 360
checkFadeOffGroupsSeconds: 30

logging:
  directory: logs
  logRotatePattern: YYYY-MM-DD
  maxRetainedFiles: 30
  maxFileSizeMB: 15
  compressOnRotation: true
  useUTC: true

rest:
  host: localhost
  port: 8011

rpki:
  vrpProvider: rpkiclient
  refreshVrpListMinutes: 15

monitoredPrefixesFiles:
  - prefixes.yml

checkForUpdatesAtBoot: true
generatePrefixListEveryDays: 0
pidFile: bgpalerter.pid
maxMessagesPerSecond: 6000
multiProcess: false
environment: production
configVersion: 2

Notes sur le connecteur

connectorRIS transmet en continu les mises à jour BGP depuis RIPE RIS via WebSocket. Le paramètre carefulSubscription: true limite le flux à vos seuls préfixes surveillés, ce qui réduit la bande passante et la charge CPU.

Votre pare-feu doit autoriser les connexions WebSocket sortantes vers ris-live.ripe.net sur le port 80 (ws://) ou 443 (wss://). Aucune règle entrante n'est nécessaire.

La section rest expose une API HTTP locale sur le port 8011 pour les vérifications d'état. Elle écoute sur localhost par défaut et n'est donc pas exposée au réseau.

Réglage des moniteurs

thresholdMinPeers contrôle la sensibilité. Une valeur de 3 signifie qu'au moins 3 pairs du route collector doivent confirmer une anomalie avant de déclencher une alerte. Des valeurs plus basses captent davantage d'événements mais génèrent plus de faux positifs. Pour la détection de hijack, 3 est un bon point de départ. Pour la visibilité, 40 est approprié puisque RIPE RIS compte plus de 600 pairs.

notificationIntervalSeconds au niveau du moniteur remplace le paramètre global. Pour la visibilité, 3600 (1 heure) évite la fatigue d'alertes pendant les phases de flapping.

Comment surveiller les annonces RPKI invalides avec BGPalerter ?

BGPalerter vérifie la validité RPKI de chaque annonce BGP reçue pour vos préfixes. Si votre préfixe apparaît avec un état RPKI invalide, vous recevez une alerte. Cela détecte les erreurs de configuration ROA et certains types de hijacks que le filtrage basé sur RPKI rejetterait.

La section monitorRPKI dans config.yml gère cela :

  • checkUncovered: true alerte lorsque votre préfixe n'a aucun ROA. Chaque préfixe annoncé devrait avoir une couverture ROA.
  • checkDisappearing: true alerte quand un ROA qui couvrait votre préfixe disparaît.

Le module séparé monitorROAS surveille les changements de ROA au niveau RPKI : nouveaux ROA créés, ROA existants modifiés ou supprimés, et ROA proches de l'expiration. Le paramètre roaExpirationAlertHours: 2 vous prévient 2 heures avant l'expiration d'un ROA.

Un exemple d'alerte RPKI :

The prefix 198.51.100.0/24 (AS64496) is announced with RPKI state Invalid.
Seen by 5 peers. Top 3 AS paths: 64496 174 3356, 64496 6939, 64496 1299

Comment configurer les alertes email dans BGPalerter ?

Ajoutez un bloc reportEmail à la section reports de config.yml. BGPalerter utilise SMTP directement.

reports:
  # ... conservez reportFile ci-dessus ...

  - file: reportEmail
    channels:
      - hijack
      - newprefix
      - visibility
      - path
      - misconfiguration
      - rpki
      - roa
    params:
      showPaths: 5
      senderEmail: bgpalerter@example.com
      smtp:
        host: mail.example.com
        port: 587
        secure: false
        ignoreTLS: false
        auth:
          user: bgpalerter@example.com
          pass: your-smtp-password-here
          type: login
        tls:
          rejectUnauthorized: true
      notifiedEmails:
        default:
          - noc@example.com

Remplacez les valeurs SMTP par celles de votre serveur de messagerie. Le paramètre showPaths: 5 inclut jusqu'à 5 chemins AS dans l'email d'alerte pour voir par où la route anormale s'est propagée.

Puisque config.yml contient le mot de passe SMTP en clair, restreignez les permissions du fichier pour que seuls l'utilisateur bgpalerter et root puissent le lire :

sudo chown root:bgpalerter /opt/bgpalerter/config.yml
sudo chmod 640 /opt/bgpalerter/config.yml

La section notifiedEmails associe les groupes aux adresses email. Le groupe default reçoit toutes les alertes. Si vous avez défini des groupes personnalisés dans prefixes.yml, ajoutez les entrées correspondantes :

      notifiedEmails:
        default:
          - noc@example.com
        noc:
          - oncall@example.com
          - sre@example.com

Comment configurer les notifications Slack dans BGPalerter ?

Ajoutez un bloc reportSlack à la section reports. Vous avez besoin d'une URL de webhook Slack entrant.

Créez le webhook dans Slack : allez dans les paramètres de votre workspace, trouvez « Incoming Webhooks » dans Apps, et créez un webhook pour le canal où vous voulez recevoir les alertes.

reports:
  # ... conservez reportFile et reportEmail ...

  - file: reportSlack
    channels:
      - hijack
      - newprefix
      - visibility
      - path
      - misconfiguration
      - rpki
      - roa
    params:
      showPaths: 3
      colors:
        hijack: "#d60b1c"
        newprefix: "#fa9548"
        visibility: "#fad648"
        path: "#42cbf5"
        rpki: "#d892f0"
        roa: "#d892f0"
      hooks:
        default: https://hooks.slack.com/services/T00/B00/xxxx

Le bloc colors donne à chaque type d'alerte une couleur distincte dans Slack. Rouge pour les hijacks, jaune pour les pertes de visibilité, violet pour les problèmes RPKI.

Remplacez l'URL de webhook par votre vrai webhook Slack. Les permissions de config.yml définies plus tôt (640, root:bgpalerter) gardent l'URL du webhook lisible uniquement par le service.

Comment exécuter BGPalerter en service systemd ?

Créer l'unité systemd

sudo tee /etc/systemd/system/bgpalerter.service > /dev/null << 'EOF'
[Unit]
Description=BGPalerter - BGP Monitoring
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
User=bgpalerter
Group=bgpalerter
WorkingDirectory=/opt/bgpalerter
ExecStart=/opt/bgpalerter/bgpalerter-linux-x64
Restart=on-failure
RestartSec=30s

# Hardening
NoNewPrivileges=true
ProtectSystem=strict
ProtectHome=true
ReadWritePaths=/opt/bgpalerter
PrivateTmp=true

[Install]
WantedBy=multi-user.target
EOF

Les directives ProtectSystem=strict et ProtectHome=true restreignent l'accès au système de fichiers. BGPalerter n'a besoin d'écrire que dans son propre répertoire.

Activer et démarrer

sudo systemctl daemon-reload
sudo systemctl enable --now bgpalerter

enable fait démarrer le service au boot. --now le lance immédiatement.

systemctl status bgpalerter
 bgpalerter.service - BGPalerter - BGP Monitoring
     Loaded: loaded (/etc/systemd/system/bgpalerter.service; enabled; preset: enabled)
     Active: active (running) since Thu 2026-03-20 10:20:00 UTC; 5s ago
   Main PID: 1373 (bgpalerter-linu)
      Tasks: 10 (limit: 9443)
     Memory: 724.3M
        CPU: 4.483s
     CGroup: /system.slice/bgpalerter.service
             └─1373 /opt/bgpalerter/bgpalerter-linux-x64

Le binaire autonome embarque tout le runtime Node.js, donc la consommation mémoire de base est autour de 500-800 Mo quel que soit le nombre de préfixes. Prévoyez au moins 1 Go de RAM libre sur le serveur de surveillance.

Consulter les logs

journalctl -u bgpalerter -f --no-pager

Au démarrage, BGPalerter charge la configuration et se connecte à RIPE RIS. Les premières lignes dans le journal ressemblent à :

Loaded config: /opt/bgpalerter/config.yml
BGPalerter, version: 2.0.1 environment: production

BGPalerter écrit aussi des logs dans /opt/bgpalerter/logs/. Le paramètre logRotatePattern: YYYY-MM-DD crée un nouveau fichier de log chaque jour. Avec maxRetainedFiles: 30 et compressOnRotation: true, vous gardez un mois de logs compressés sans intervention manuelle.

Comment tester les alertes BGPalerter ?

Lancez BGPalerter avec l'option -t pour envoyer des alertes de test à travers tous les canaux de notification configurés. Le connecteur de test intégré simule chaque type d'alerte sans attendre de vrais événements BGP.

sudo -u bgpalerter /opt/bgpalerter/bgpalerter-linux-x64 -t

Cela envoie des messages de test à votre canal Slack et par email. Vérifiez que les alertes arrivent avec le bon format et le bon routage. Si vous avez défini plusieurs groupes, chacun doit recevoir les alertes qui lui sont associées.

Pour un suivi continu, consultez le journal :

journalctl -u bgpalerter --since "1 hour ago" --no-pager

Comment BGPalerter se compare-t-il aux alternatives ?

BGPalerter n'est pas la seule option de surveillance BGP. Voici une comparaison rapide :

Outil Type Cas d'usage principal
BGPalerter Auto-hébergé, open source AS unique, surveillance de préfixes, alertes temps réel
ARTEMIS Auto-hébergé, open source Grands réseaux, modules de détection personnalisés, recherche
Cloudflare Radar SaaS Consultation rapide, pas d'auto-hébergement, alertes limitées
BGPStream Bibliothèque/SaaS Analyse programmatique, recherche sur données historiques
bgp.tools SaaS Exploration visuelle, données communautaires, vérifications rapides

BGPalerter convient bien au cas d'un AS unique auto-hébergé. Il ne nécessite aucune intégration routeur et tourne sur un petit VPS. ARTEMIS est plus puissant mais bien plus complexe à déployer.

Pour une défense en profondeur, combinez BGPalerter avec le déploiement de ROA RPKI et un filtrage de routes approprié sur vos sessions BGP.

Un problème ?

BGPalerter s'arrête immédiatement : Vérifiez journalctl -u bgpalerter -e. Causes fréquentes : YAML malformé dans config.yml ou prefixes.yml. Validez avec python3 -c "import yaml; yaml.safe_load(open('config.yml'))".

Pas de données depuis RIPE RIS : Votre pare-feu doit autoriser les connexions sortantes vers ris-live.ripe.net sur le port 80 (WebSocket). Si vous êtes derrière un proxy restrictif, utilisez l'URL wss:// sur le port 443. Mettez à jour l'URL du connecteur dans config.yml.

Alertes non reçues (email) : Lancez avec -t pour isoler le problème. Vérifiez les identifiants SMTP dans config.yml. Vérifiez que l'adresse d'expédition est autorisée par votre serveur de messagerie (SPF, authentification). Consultez journalctl -u bgpalerter pour les messages d'erreur SMTP.

Alertes non reçues (Slack) : Vérifiez que l'URL du webhook est valide. Slack désactive les webhooks des apps inutilisées. Testez le webhook directement : curl -X POST -H 'Content-type: application/json' --data '{"text":"test"}' "https://hooks.slack.com/services/T00/B00/xxxx".

Consommation mémoire élevée : Les longues listes de préfixes consomment plus de mémoire. Si vous surveillez beaucoup d'ASN, augmentez le swap ou divisez en plusieurs instances BGPalerter avec des fichiers de préfixes séparés.

Le service ne redémarre pas : RestartSec=30s dans le fichier d'unité ajoute un délai de 30 secondes entre les tentatives de redémarrage. Pour les échecs persistants, vérifiez le code de sortie dans systemctl status bgpalerter.


Copyright 2026 Virtua.Cloud. Tous droits réservés. Ce contenu est une création originale de l'équipe Virtua.Cloud. Toute reproduction, republication ou redistribution sans autorisation écrite est interdite.

Prêt à essayer ?

Déployez votre serveur en quelques secondes. Linux, Windows ou FreeBSD.

Voir les offres VPS