BGP-Ankündigungen mit BGPalerter unter Linux überwachen
Installieren Sie BGPalerter v2 auf einem Linux-VPS, um Ihre Präfixe auf Hijacks, Route Leaks und RPKI-Invalidierungen zu überwachen. Richten Sie Slack- und E-Mail-Benachrichtigungen ein und betreiben Sie alles als systemd-Dienst.
Wenn Sie Ihre eigenen Präfixe per BGP ankündigen, müssen Sie wissen, wenn etwas schiefgeht. Ein Präfix-Hijack, ein Route Leak, eine RPKI-Fehlkonfiguration: Solche Vorfälle können Ihr Netzwerk offline nehmen oder Ihren Datenverkehr über einen Angreifer leiten. BGPalerter überwacht öffentliche Route-Collector-Daten und alarmiert Sie in Echtzeit.
Dieses Tutorial installiert BGPalerter v2 auf Ubuntu 24.04, konfiguriert die Überwachung von Präfixen und ASNs, richtet Slack- und E-Mail-Benachrichtigungen ein und betreibt das Ganze als systemd-Dienst. Es setzt voraus, dass BGP bereits mit BIRD2 oder FRR läuft.
Was überwacht BGPalerter und wie funktioniert es?
BGPalerter überwacht Ihre BGP-Präfixe in Echtzeit anhand öffentlicher Route-Collector-Daten von RIPE RIS. Es verbindet sich per WebSocket mit ris-live.ripe.net, das Feeds von über 600 Peers weltweit aggregiert. Eine Integration mit Ihren Routern ist nicht erforderlich. Es läuft auf jedem Linux-Server mit ausgehendem Internetzugang.
BGPalerter bringt diese Monitore mit:
| Monitor | Was er erkennt | Standardkanal |
|---|---|---|
| monitorHijack | Falscher Origin-AS, Sub-Präfix-Hijacks | hijack |
| monitorVisibility | Präfix zurückgezogen oder von zu wenigen Peers gesehen | visibility |
| monitorNewPrefix | Unerwartetes Sub-Präfix von Ihrem AS angekündigt | newprefix |
| monitorPath | AS-Pfad entspricht einem Regex-Muster (Scrubbing, Transit-Wechsel) | path |
| monitorPathNeighbors | Unerwarteter Upstream-/Downstream-AS im Pfad | path |
| monitorAS | Ihr ASN kündigt ein nicht deklariertes Präfix an | misconfiguration |
| monitorRPKI | Präfix mit RPKI-Status Invalid angekündigt | rpki |
| monitorROAS | ROA hinzugefügt, bearbeitet, gelöscht oder ablaufend | roa |
Jeder Monitor hat einen Parameter thresholdMinPeers. Ein Alarm wird erst ausgelöst, wenn die Anomalie von mindestens dieser Anzahl an Route-Collector-Peers bestätigt wird. Das reduziert Fehlalarme.
Wie installiere ich BGPalerter auf Ubuntu 24.04?
Laden Sie die neueste BGPalerter-Binärdatei von GitHub herunter und machen Sie sie ausführbar. Bei Verwendung der vorkompilierten Binärdatei ist keine Node.js-Installation nötig. Die eigenständige Binärdatei enthält die Node.js-Runtime; planen Sie mindestens 1 GB freien RAM auf dem Überwachungsserver ein.
Dedizierten Benutzer anlegen
Führen Sie BGPalerter unter einem eigenen unprivilegierten Konto aus. Betreiben Sie Netzwerk-Monitoring-Tools nie als root, wenn es keinen Grund dafür gibt.
sudo adduser --system --group --home /opt/bgpalerter --shell /usr/sbin/nologin bgpalerter
Binärdatei herunterladen
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
Die Datei sollte etwa 140 MB groß sein. Die Binärdatei ist eigenständig und enthält die Node.js-Runtime. Keine externen Abhängigkeiten.
Docker-Alternative
Falls Sie Container bevorzugen:
docker run -d --name bgpalerter \
-v /opt/bgpalerter/volume:/opt/bgpalerter/volume \
--restart unless-stopped \
nttgin/bgpalerter:latest run serve -- --d /opt/bgpalerter/volume/
Legen Sie Ihre config.yml und prefixes.yml in /opt/bgpalerter/volume/ ab, bevor Sie den Container starten. Der Rest dieses Tutorials behandelt die Binärdatei-Methode. Die Konfigurationsdateien sind in beiden Fällen identisch.
Wie konfiguriere ich prefixes.yml zur Überwachung meines ASN?
BGPalerter muss wissen, welche Präfixe und ASNs Ihnen gehören. Der Befehl generate fragt öffentliche Routing-Daten ab und erstellt prefixes.yml anhand dessen, was Ihr AS aktuell ankündigt.
sudo -u bgpalerter /opt/bgpalerter/bgpalerter-linux-x64 generate \
-a YOUR_ASN \
-o /opt/bgpalerter/prefixes.yml \
-i -m
Ersetzen Sie YOUR_ASN durch Ihre AS-Nummer (nur Ziffern, ohne „AS"-Präfix). Die Optionen:
| Option | Zweck |
|---|---|
-a |
Zu überwachende ASN(s). Kommagetrennt für mehrere: -a 64496,64497 |
-o |
Pfad der Ausgabedatei |
-i |
Delegierte Präfixe ignorieren (von anderen ASNs originiert) |
-m |
Alle Origin-ASNs für Ihre Präfixe automatisch erkennen |
Der Befehl erzeugt eine Datei wie diese:
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
Wichtige Felder
ignoreMorespecifics: Setzen Sie dies auf true, wenn Sie absichtlich deaggregieren (z. B. sowohl /24 als auch /25 ankündigen). Bei false alarmiert BGPalerter bei jeder unerwarteten spezifischeren Ankündigung. Für die meisten Betreiber ist false die richtige Voreinstellung. Unerwartete More-Specifics sind ein Hijack-Signal.
options.monitorASns: Aktiviert monitorAS für Ihr ASN. BGPalerter alarmiert, wenn Ihr ASN ein nicht in der Datei gelistetes Präfix zu originieren beginnt.
group: Steuert das Alert-Routing. Die Gruppe default ist den Benachrichtigungskanälen zugeordnet. Sie können separate Gruppen erstellen (z. B. noc, engineering) und sie an verschiedene Slack-Kanäle oder E-Mail-Verteiler leiten.
Bearbeiten Sie die generierte Datei, um Beschreibungen hinzuzufügen, ignoreMorespecifics pro Präfix anzupassen oder Präfixe hinzuzufügen, die noch nicht angekündigt werden, aber auf unautorisierte Origination überwacht werden sollen.
Wie konfiguriere ich config.yml?
Der automatische Konfigurationsassistent erstellt beim ersten Start eine Standard-config.yml. Für den Produktionsbetrieb möchten Sie explizite Kontrolle über jeden Parameter.
Erstellen Sie /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
Hinweise zum Connector
connectorRIS streamt Live-BGP-Updates von RIPE RIS über WebSocket. Die Einstellung carefulSubscription: true beschränkt den Stream auf Ihre überwachten Präfixe und reduziert so Bandbreite und CPU-Last.
Ihre Firewall muss ausgehende WebSocket-Verbindungen zu ris-live.ripe.net auf Port 80 (ws://) oder 443 (wss://) erlauben. Eingehende Regeln sind nicht erforderlich.
Der Abschnitt rest stellt eine lokale HTTP-API auf Port 8011 für Health-Checks bereit. Sie bindet standardmäßig an localhost und ist damit nicht im Netzwerk erreichbar.
Monitor-Tuning
thresholdMinPeers steuert die Empfindlichkeit. Ein Wert von 3 bedeutet, dass mindestens 3 Route-Collector-Peers eine Anomalie bestätigen müssen, bevor ein Alarm ausgelöst wird. Niedrigere Werte erfassen mehr Ereignisse, erzeugen aber auch mehr Fehlalarme. Für die Hijack-Erkennung ist 3 ein guter Ausgangspunkt. Für Visibility ist 40 angemessen, da RIPE RIS über 600 Peers hat.
notificationIntervalSeconds auf Monitor-Ebene überschreibt die globale Einstellung. Für Visibility verhindert 3600 (1 Stunde) Alarm-Ermüdung während Flapping-Phasen.
Wie überwache ich RPKI-invalide Ankündigungen mit BGPalerter?
BGPalerter prüft die RPKI-Validität jeder empfangenen BGP-Ankündigung für Ihre Präfixe. Wenn Ihr Präfix mit dem RPKI-Status Invalid erscheint, erhalten Sie einen Alarm. Das erkennt ROA-Fehlkonfigurationen und bestimmte Hijack-Typen, die RPKI-basiertes Filtering ablehnen würde.
Der Abschnitt monitorRPKI in config.yml übernimmt das:
checkUncovered: truealarmiert, wenn Ihr Präfix keinen ROA hat. Jedes angekündigte Präfix sollte ROA-Abdeckung haben.checkDisappearing: truealarmiert, wenn ein ROA, der Ihr Präfix abdeckte, verschwindet.
Das separate Modul monitorROAS überwacht ROA-Änderungen auf RPKI-Ebene: neue ROAs, bearbeitete oder gelöschte ROAs und ROAs, die bald ablaufen. Die Einstellung roaExpirationAlertHours: 2 warnt Sie 2 Stunden vor dem Ablauf eines ROA.
Ein Beispiel für einen RPKI-Alarm:
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
Wie richte ich E-Mail-Benachrichtigungen in BGPalerter ein?
Fügen Sie einen reportEmail-Block zum Abschnitt reports in config.yml hinzu. BGPalerter nutzt SMTP direkt.
reports:
# ... reportFile von oben beibehalten ...
- 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
Ersetzen Sie die SMTP-Werte durch die Daten Ihres Mailservers. Die Einstellung showPaths: 5 fügt bis zu 5 AS-Pfade in die Alert-E-Mail ein, damit Sie sehen können, wohin sich die anomale Route verbreitet hat.
Da config.yml das SMTP-Passwort im Klartext enthält, beschränken Sie die Dateiberechtigungen, sodass nur der bgpalerter-Benutzer und root die Datei lesen können:
sudo chown root:bgpalerter /opt/bgpalerter/config.yml
sudo chmod 640 /opt/bgpalerter/config.yml
Der Abschnitt notifiedEmails ordnet Gruppen E-Mail-Adressen zu. Die Gruppe default empfängt alle Alarme. Wenn Sie in prefixes.yml eigene Gruppen definiert haben, fügen Sie entsprechende Einträge hinzu:
notifiedEmails:
default:
- noc@example.com
noc:
- oncall@example.com
- sre@example.com
Wie richte ich Slack-Benachrichtigungen in BGPalerter ein?
Fügen Sie einen reportSlack-Block zum Abschnitt reports hinzu. Sie benötigen eine Slack-Incoming-Webhook-URL.
Erstellen Sie den Webhook in Slack: Gehen Sie zu den Workspace-Einstellungen, suchen Sie „Incoming Webhooks" unter Apps und erstellen Sie einen Webhook für den Kanal, in dem Sie Alarme empfangen möchten.
reports:
# ... reportFile und reportEmail beibehalten ...
- 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
Die colors-Map gibt jedem Alarmtyp eine eigene Farbe in Slack. Rot für Hijacks, Gelb für Sichtbarkeitsverlust, Violett für RPKI-Probleme.
Ersetzen Sie die Webhook-URL durch Ihren tatsächlichen Slack-Webhook. Die zuvor gesetzten config.yml-Berechtigungen (640, root:bgpalerter) halten die Webhook-URL nur für den Dienst lesbar.
Wie betreibe ich BGPalerter als systemd-Dienst?
systemd-Unit erstellen
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
Die Direktiven ProtectSystem=strict und ProtectHome=true schränken den Dateisystemzugriff ein. BGPalerter muss nur in sein eigenes Verzeichnis schreiben.
Aktivieren und starten
sudo systemctl daemon-reload
sudo systemctl enable --now bgpalerter
enable sorgt dafür, dass der Dienst beim Booten startet. --now startet ihn sofort.
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
Die eigenständige Binärdatei enthält die gesamte Node.js-Runtime, daher liegt der Basis-Speicherverbrauch bei 500-800 MB unabhängig von der Präfix-Anzahl. Stellen Sie sicher, dass mindestens 1 GB freier RAM auf dem Überwachungsserver vorhanden ist.
Logs prüfen
journalctl -u bgpalerter -f --no-pager
Beim Start lädt BGPalerter die Konfiguration und verbindet sich mit RIPE RIS. Die ersten Zeilen im Journal sehen so aus:
Loaded config: /opt/bgpalerter/config.yml
BGPalerter, version: 2.0.1 environment: production
BGPalerter schreibt auch Logs nach /opt/bgpalerter/logs/. Die Einstellung logRotatePattern: YYYY-MM-DD erstellt täglich eine neue Log-Datei. Mit maxRetainedFiles: 30 und compressOnRotation: true behalten Sie einen Monat komprimierter Logs ohne manuellen Eingriff.
Wie teste ich BGPalerter-Alarme?
Starten Sie BGPalerter mit dem Flag -t, um Testalarme über alle konfigurierten Benachrichtigungskanäle zu senden. Der integrierte Test-Connector simuliert jeden Alarmtyp, ohne auf reale BGP-Ereignisse zu warten.
sudo -u bgpalerter /opt/bgpalerter/bgpalerter-linux-x64 -t
Das sendet Testnachrichten an Ihren Slack-Kanal und per E-Mail. Prüfen Sie, ob Alarme mit der richtigen Formatierung und Zuordnung ankommen. Wenn Sie mehrere Gruppen definiert haben, sollte jede Gruppe die ihr zugewiesenen Alarme erhalten.
Für die laufende Überwachung beobachten Sie das Journal:
journalctl -u bgpalerter --since "1 hour ago" --no-pager
Wie schneidet BGPalerter im Vergleich zu Alternativen ab?
BGPalerter ist nicht die einzige BGP-Überwachungsoption. Hier ein kurzer Vergleich:
| Tool | Typ | Haupteinsatzgebiet |
|---|---|---|
| BGPalerter | Selbst gehostet, Open Source | Einzelnes AS, Präfix-Überwachung, Echtzeit-Alarme |
| ARTEMIS | Selbst gehostet, Open Source | Große Netzwerke, eigene Erkennungsmodule, Forschung |
| Cloudflare Radar | SaaS | Schnelle Abfrage, kein Self-Hosting, eingeschränktes Alerting |
| BGPStream | Bibliothek/SaaS | Programmatische Analyse, historische Datenforschung |
| bgp.tools | SaaS | Visuelle Exploration, Community-Daten, schnelle Prüfungen |
BGPalerter eignet sich gut für den selbst gehosteten Single-AS-Anwendungsfall. Es erfordert keine Router-Integration und läuft auf einem kleinen VPS. ARTEMIS ist leistungsfähiger, aber deutlich komplexer im Deployment.
Für Defense-in-Depth kombinieren Sie BGPalerter mit RPKI-ROA-Deployment und ordnungsgemäßem Route-Filtering auf Ihren BGP-Sessions.
Etwas funktioniert nicht?
BGPalerter beendet sich sofort: Prüfen Sie journalctl -u bgpalerter -e. Häufige Ursachen: fehlerhaftes YAML in config.yml oder prefixes.yml. Validieren Sie mit python3 -c "import yaml; yaml.safe_load(open('config.yml'))".
Keine Daten von RIPE RIS: Ihre Firewall muss ausgehende Verbindungen zu ris-live.ripe.net auf Port 80 (WebSocket) erlauben. Wenn Sie hinter einem restriktiven Proxy sind, verwenden Sie die wss://-URL auf Port 443. Aktualisieren Sie die Connector-URL in config.yml entsprechend.
Alarme kommen nicht an (E-Mail): Starten Sie mit -t zur Eingrenzung. Prüfen Sie die SMTP-Zugangsdaten in config.yml. Stellen Sie sicher, dass die Absenderadresse vom Mailserver erlaubt ist (SPF, Authentifizierung). Prüfen Sie journalctl -u bgpalerter auf SMTP-Fehlermeldungen.
Alarme kommen nicht an (Slack): Überprüfen Sie, ob die Webhook-URL gültig ist. Slack deaktiviert Webhooks für ungenutzte Apps. Testen Sie den Webhook direkt: curl -X POST -H 'Content-type: application/json' --data '{"text":"test"}' "https://hooks.slack.com/services/T00/B00/xxxx".
Hoher Speicherverbrauch: Große Präfix-Listen verbrauchen mehr Speicher. Wenn Sie viele ASNs überwachen, erhöhen Sie den Swap oder teilen Sie auf mehrere BGPalerter-Instanzen mit separaten Präfix-Dateien auf.
Dienst startet nicht neu: RestartSec=30s in der Unit-Datei fügt eine 30-Sekunden-Verzögerung zwischen Neustartversuchen hinzu. Bei dauerhaften Fehlern prüfen Sie den Exit-Code in systemctl status bgpalerter.
Bereit, es selbst auszuprobieren?
Betreiben Sie BGP-Sessions auf Ihrem eigenen IP-Bereich mit Virtua.Cloud VPS. →