Surveiller les annonces BGP avec BGPalerter sur Linux
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: truealerte lorsque votre préfixe n'a aucun ROA. Chaque préfixe annoncé devrait avoir une couverture ROA.checkDisappearing: truealerte 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