BGP-aankondigingen monitoren met BGPalerter op Linux

9 min leestijd·Matthieu·rpkinetworkingbgpalertermonitoringbgp|

Installeer BGPalerter v2 op een Linux VPS om je prefixen te bewaken op hijacks, route leaks en RPKI-invalidaties. Stel Slack- en e-mailmeldingen in en draai alles als systemd-service.

Als je je eigen prefixen via BGP aankondigt, moet je weten wanneer er iets misgaat. Een prefix-hijack, een route leak, een RPKI-misconfiguratie: deze incidenten kunnen je netwerk offline halen of je verkeer via een aanvaller routeren. BGPalerter bewaakt publieke route collector-data en waarschuwt je in realtime.

Deze tutorial installeert BGPalerter v2 op Ubuntu 24.04, configureert prefix- en ASN-monitoring, stelt Slack- en e-mailnotificaties in, en draait alles als systemd-service. Er wordt van uitgegaan dat BGP al draait met BIRD2 of FRR.

Wat monitort BGPalerter en hoe werkt het?

BGPalerter monitort je BGP-prefixen in realtime via publieke route collector-data van RIPE RIS. Het maakt een WebSocket-verbinding met ris-live.ripe.net, dat feeds van meer dan 600 peers wereldwijd aggregeert. Integratie met je routers is niet nodig. Het draait op elke Linux-server met uitgaand internetverkeer.

BGPalerter bevat deze monitors:

Monitor Wat het detecteert Standaardkanaal
monitorHijack Verkeerde origin-AS, sub-prefix-hijacks hijack
monitorVisibility Prefix teruggetrokken of door te weinig peers gezien visibility
monitorNewPrefix Onverwacht sub-prefix aangekondigd door jouw AS newprefix
monitorPath AS-pad matcht een regex-patroon (scrubbing, transit-wijziging) path
monitorPathNeighbors Onverwachte upstream/downstream-AS in het pad path
monitorAS Jouw ASN kondigt een niet-gedeclareerd prefix aan misconfiguration
monitorRPKI Prefix aangekondigd met RPKI-status Invalid rpki
monitorROAS ROA toegevoegd, bewerkt, verwijderd of bijna verlopen roa

Elke monitor heeft een thresholdMinPeers-parameter. Een waarschuwing wordt pas gegeven wanneer de anomalie door minstens dat aantal route collector-peers is bevestigd, wat valse meldingen vermindert.

Hoe installeer ik BGPalerter op Ubuntu 24.04?

Download het nieuwste BGPalerter-binary van GitHub en maak het uitvoerbaar. Bij gebruik van het voorgebouwde binary is geen Node.js-installatie nodig. Het zelfstandige binary bevat de Node.js-runtime; reken op minstens 1 GB vrij RAM op de monitoringserver.

Een dedicated gebruiker aanmaken

Draai BGPalerter onder een eigen onbevoegd account. Draai netwerkmonitoringtools nooit als root als dat niet nodig is.

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

Het binary downloaden

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

Het bestand is ongeveer 140 MB. Het binary is zelfstandig en bevat de Node.js-runtime. Geen externe afhankelijkheden.

Docker-alternatief

Als je de voorkeur geeft aan containers:

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

Plaats je config.yml en prefixes.yml in /opt/bgpalerter/volume/ voordat je de container start. De rest van deze tutorial behandelt de binary-methode. De configuratiebestanden zijn in beide gevallen identiek.

Hoe configureer ik prefixes.yml om mijn ASN te monitoren?

BGPalerter moet weten welke prefixen en ASN's van jou zijn. Het generate-commando bevraagt publieke routingdata en bouwt prefixes.yml op basis van wat jouw AS momenteel aankondigt.

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

Vervang YOUR_ASN door je AS-nummer (alleen cijfers, zonder "AS"-prefix). De opties:

Optie Doel
-a Te monitoren ASN('s). Kommagescheiden voor meerdere: -a 64496,64497
-o Pad van het uitvoerbestand
-i Gedelegeerde prefixen negeren (georigineerd door andere ASN's)
-m Automatisch alle origin-ASN's voor je prefixen detecteren

Het commando produceert een bestand als dit:

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

Belangrijke velden

ignoreMorespecifics: Zet op true als je bewust deaggregeert (bijvoorbeeld zowel /24 als /25 aankondigt). Bij false waarschuwt BGPalerter bij elke onverwachte meer-specifieke aankondiging. Voor de meeste operators is false de juiste standaard. Onverwachte more-specifics zijn een hijack-signaal.

options.monitorASns: Activeert monitorAS voor jouw ASN. BGPalerter waarschuwt als jouw ASN een prefix begint te origineren dat niet in het bestand staat.

group: Bepaalt de routering van waarschuwingen. De groep default is gekoppeld aan de notificatiekanalen. Je kunt aparte groepen maken (bijvoorbeeld noc, engineering) en ze naar verschillende Slack-kanalen of mailinglijsten sturen.

Bewerk het gegenereerde bestand om beschrijvingen toe te voegen, ignoreMorespecifics per prefix aan te passen, of prefixen toe te voegen die nog niet aangekondigd worden maar gemonitord moeten worden op ongeautoriseerde originatie.

Hoe configureer ik config.yml?

De automatische configuratiewizard maakt bij de eerste start een standaard config.yml aan. Voor productie wil je expliciete controle over elke parameter.

Maak /opt/bgpalerter/config.yml aan:

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

Opmerkingen over de connector

connectorRIS streamt live BGP-updates van RIPE RIS via WebSocket. De instelling carefulSubscription: true beperkt de stream tot alleen je gemonitorde prefixen, wat bandbreedte en CPU vermindert.

Je firewall moet uitgaande WebSocket-verbindingen naar ris-live.ripe.net op poort 80 (ws://) of 443 (wss://) toestaan. Inkomende regels zijn niet nodig.

De rest-sectie stelt een lokale HTTP-API beschikbaar op poort 8011 voor health checks. Deze luistert standaard op localhost en is dus niet bereikbaar via het netwerk.

Monitor-tuning

thresholdMinPeers regelt de gevoeligheid. Een waarde van 3 betekent dat minstens 3 route collector-peers een anomalie moeten bevestigen voordat er een waarschuwing wordt gegeven. Lagere waarden vangen meer events op maar produceren meer valse meldingen. Voor hijack-detectie is 3 een goed startpunt. Voor visibility is 40 geschikt aangezien RIPE RIS meer dan 600 peers heeft.

notificationIntervalSeconds op monitorniveau overschrijft de globale instelling. Voor visibility voorkomt 3600 (1 uur) waarschuwingsmoeheid tijdens flapping.

Hoe monitor ik RPKI-ongeldige aankondigingen met BGPalerter?

BGPalerter controleert de RPKI-geldigheid van elke ontvangen BGP-aankondiging voor je prefixen. Als je prefix verschijnt met RPKI-status Invalid, krijg je een waarschuwing. Dit detecteert ROA-misconfiguraties en bepaalde hijack-typen die RPKI-gebaseerde filtering zou afwijzen.

De monitorRPKI-sectie in config.yml regelt dit:

  • checkUncovered: true waarschuwt wanneer je prefix geen ROA heeft. Elk aangekondigd prefix zou ROA-dekking moeten hebben.
  • checkDisappearing: true waarschuwt wanneer een ROA die je prefix dekte verdwijnt.

De aparte monitorROAS-module bewaakt ROA-wijzigingen op RPKI-niveau: nieuwe ROA's aangemaakt, bestaande ROA's bewerkt of verwijderd, en ROA's die bijna verlopen. De instelling roaExpirationAlertHours: 2 waarschuwt je 2 uur voor het verlopen van een ROA.

Een voorbeeld van een RPKI-waarschuwing:

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

Hoe stel ik e-mailwaarschuwingen in bij BGPalerter?

Voeg een reportEmail-blok toe aan de reports-sectie van config.yml. BGPalerter gebruikt SMTP rechtstreeks.

reports:
  # ... behoud reportFile van hierboven ...

  - 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

Vervang de SMTP-waarden door die van je mailserver. De instelling showPaths: 5 voegt tot 5 AS-paden toe aan de waarschuwingsmail zodat je kunt zien waar de afwijkende route zich verspreidde.

Aangezien config.yml het SMTP-wachtwoord in platte tekst bevat, beperk je de bestandsrechten zodat alleen de bgpalerter-gebruiker en root het kunnen lezen:

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

De notifiedEmails-sectie koppelt groepen aan e-mailadressen. De groep default ontvangt alle waarschuwingen. Als je aangepaste groepen hebt gedefinieerd in prefixes.yml, voeg dan overeenkomstige vermeldingen toe:

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

Hoe stel ik Slack-notificaties in bij BGPalerter?

Voeg een reportSlack-blok toe aan de reports-sectie. Je hebt een Slack incoming webhook-URL nodig.

Maak de webhook aan in Slack: ga naar je workspace-instellingen, zoek "Incoming Webhooks" onder Apps, en maak een webhook voor het kanaal waar je waarschuwingen wilt ontvangen.

reports:
  # ... behoud reportFile en 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

De colors-map geeft elk waarschuwingstype een eigen kleur in Slack. Rood voor hijacks, geel voor zichtbaarheidsverlies, paars voor RPKI-problemen.

Vervang de placeholder webhook-URL door je echte Slack-webhook. De eerder ingestelde config.yml-rechten (640, root:bgpalerter) houden de webhook-URL alleen leesbaar voor de service.

Hoe draai ik BGPalerter als systemd-service?

De systemd-unit aanmaken

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

De directieven ProtectSystem=strict en ProtectHome=true beperken de toegang tot het bestandssysteem. BGPalerter hoeft alleen in zijn eigen directory te schrijven.

Inschakelen en starten

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

enable zorgt ervoor dat de service bij het opstarten draait. --now start het direct.

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

Het zelfstandige binary bevat de volledige Node.js-runtime, dus het basisgeheugengebruik ligt rond 500-800 MB ongeacht het aantal prefixen. Zorg voor minstens 1 GB vrij RAM op de monitoringserver.

Logs bekijken

journalctl -u bgpalerter -f --no-pager

Bij het opstarten laadt BGPalerter de configuratie en maakt verbinding met RIPE RIS. De eerste regels in het journal zien er zo uit:

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

BGPalerter schrijft ook logs naar /opt/bgpalerter/logs/. De instelling logRotatePattern: YYYY-MM-DD maakt dagelijks een nieuw logbestand. Met maxRetainedFiles: 30 en compressOnRotation: true bewaar je een maand aan gecomprimeerde logs zonder handmatig ingrijpen.

Hoe test ik BGPalerter-waarschuwingen?

Start BGPalerter met de -t-vlag om testwaarschuwingen via alle geconfigureerde notificatiekanalen te sturen. De ingebouwde testconnector simuleert elk waarschuwingstype zonder te wachten op echte BGP-events.

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

Dit stuurt testberichten naar je Slack-kanaal en per e-mail. Controleer of waarschuwingen aankomen met de juiste opmaak en routering. Als je meerdere groepen hebt gedefinieerd, moet elke groep de toegewezen waarschuwingen ontvangen.

Voor doorlopende monitoring bekijk je het journal:

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

Hoe verhoudt BGPalerter zich tot alternatieven?

BGPalerter is niet de enige BGP-monitoringoptie. Hier een snelle vergelijking:

Tool Type Primair gebruik
BGPalerter Self-hosted, open source Enkel AS, prefix-monitoring, realtime waarschuwingen
ARTEMIS Self-hosted, open source Grote netwerken, aangepaste detectiemodules, onderzoek
Cloudflare Radar SaaS Snelle lookup, geen self-hosting, beperkte alerting
BGPStream Bibliotheek/SaaS Programmatische analyse, historisch dataonderzoek
bgp.tools SaaS Visuele verkenning, communitydata, snelle checks

BGPalerter past goed bij de self-hosted single-AS-usecase. Het vereist geen routerintegratie en draait op een kleine VPS. ARTEMIS is krachtiger maar aanzienlijk complexer om te deployen.

Voor defense-in-depth combineer je BGPalerter met RPKI ROA-deployment en goede routefiltering op je BGP-sessies.

Iets gaat mis?

BGPalerter stopt direct: Controleer journalctl -u bgpalerter -e. Veelvoorkomende oorzaken: onjuiste YAML in config.yml of prefixes.yml. Valideer met python3 -c "import yaml; yaml.safe_load(open('config.yml'))".

Geen data van RIPE RIS: Je firewall moet uitgaande verbindingen naar ris-live.ripe.net op poort 80 (WebSocket) toestaan. Als je achter een beperkende proxy zit, gebruik dan de wss://-URL op poort 443. Werk de connector-URL in config.yml dienovereenkomstig bij.

Waarschuwingen komen niet aan (e-mail): Start met -t om te isoleren. Controleer SMTP-credentials in config.yml. Verifieer dat het afzenderadres is toegestaan door je mailserver (SPF, authenticatie). Bekijk journalctl -u bgpalerter voor SMTP-foutmeldingen.

Waarschuwingen komen niet aan (Slack): Controleer of de webhook-URL geldig is. Slack deactiveert webhooks voor ongebruikte apps. Test de webhook direct: curl -X POST -H 'Content-type: application/json' --data '{"text":"test"}' "https://hooks.slack.com/services/T00/B00/xxxx".

Hoog geheugengebruik: Grote prefixlijsten verbruiken meer geheugen. Als je veel ASN's monitort, vergroot dan de swap of splits op in meerdere BGPalerter-instanties met aparte prefixbestanden.

Service herstart niet: RestartSec=30s in het unit-bestand voegt een vertraging van 30 seconden toe tussen herstartpogingen. Bij aanhoudende fouten controleer je de exit-code in systemctl status bgpalerter.


Copyright 2026 Virtua.Cloud. Alle rechten voorbehouden. Deze inhoud is een origineel werk van het Virtua.Cloud-team. Reproductie, herpublicatie of herdistributie zonder schriftelijke toestemming is verboden.

Klaar om het zelf te proberen?

Deploy uw eigen server in seconden. Linux, Windows of FreeBSD.

Bekijk VPS-aanbod