BGP-Ankündigungen mit BGPalerter unter Linux überwachen

9 Min. Lesezeit·Matthieu·rpkinetworkingbgpalertermonitoringbgp|

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: true alarmiert, wenn Ihr Präfix keinen ROA hat. Jedes angekündigte Präfix sollte ROA-Abdeckung haben.
  • checkDisappearing: true alarmiert, 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.