在Linux上使用BGPalerter监控BGP公告

2 分钟阅读·Matthieu·rpkinetworkingbgpalertermonitoringbgp|

在Linux VPS上部署BGPalerter v2,监控你的前缀是否遭遇劫持、路由泄漏和RPKI无效状态。配置Slack和邮件告警,以systemd服务运行。

如果你通过BGP公告自己的前缀,你需要在出问题时第一时间知道。前缀劫持、路由泄漏、RPKI配置错误:这些事件可能让你的网络离线,或者把你的流量引导到攻击者那里。BGPalerter监控公共路由收集器数据,实时向你发出告警。

本教程在Ubuntu 24.04上安装BGPalerter v2,配置前缀和ASN监控,设置Slack和邮件通知,并以systemd服务运行。前提是你已经用BIRD2或FRR运行了BGP。

BGPalerter监控什么?如何工作?

BGPalerter通过RIPE RIS的公共路由收集器数据实时监控你的BGP前缀。它通过WebSocket连接到ris-live.ripe.net,该平台聚合了全球600多个peer的数据。不需要与你的路由器集成。任何有出站网络访问的Linux服务器都可以运行。

BGPalerter内置以下监控器:

监控器 检测内容 默认频道
monitorHijack Origin AS不匹配,子前缀劫持 hijack
monitorVisibility 前缀被撤回或被过少peer看到 visibility
monitorNewPrefix 你的AS公告了意外的子前缀 newprefix
monitorPath AS路径匹配正则模式(scrubbing、transit变更) path
monitorPathNeighbors 路径中出现意外的上游/下游AS path
monitorAS 你的ASN公告了未声明的前缀 misconfiguration
monitorRPKI 前缀以RPKI无效状态被公告 rpki
monitorROAS ROA被添加、编辑、删除或即将过期 roa

每个监控器都有thresholdMinPeers参数。只有当异常被至少指定数量的路由收集器peer确认时才会触发告警,从而减少误报。

如何在Ubuntu 24.04上安装BGPalerter?

从GitHub下载最新的BGPalerter二进制文件并赋予执行权限。使用预编译二进制文件不需要安装Node.js。该自包含二进制文件内置了Node.js运行时,请确保监控服务器至少有1 GB空闲内存。

创建专用用户

以专用的非特权账户运行BGPalerter。没有理由时不要以root身份运行网络监控工具。

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

下载二进制文件

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

文件大小约140 MB。二进制文件是自包含的,内置Node.js运行时。无外部依赖。

Docker替代方案

如果你偏好容器:

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

在启动容器之前,将config.ymlprefixes.yml放入/opt/bgpalerter/volume/。本教程后续内容介绍二进制文件方式。两种方式的配置文件完全相同。

如何配置prefixes.yml来监控我的ASN?

BGPalerter需要知道哪些前缀和ASN属于你。generate命令查询公共路由数据,根据你的AS当前公告的内容生成prefixes.yml

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

YOUR_ASN替换为你的AS号(纯数字,不带"AS"前缀)。各选项说明:

选项 用途
-a 要监控的ASN。多个ASN用逗号分隔:-a 64496,64497
-o 输出文件路径
-i 忽略委派前缀(由其他ASN发起)
-m 自动检测你的前缀的所有origin ASN

命令会生成如下文件:

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

关键字段

ignoreMorespecifics:如果你有意进行解聚(例如同时公告/24和/25),设为true。设为false时,BGPalerter会对任何意外的更具体公告发出告警。对大多数运营商来说,false是正确的默认值。意外的more-specifics是劫持信号。

options.monitorASns:为你的ASN启用monitorAS。如果你的ASN开始发起文件中未列出的前缀,BGPalerter会告警。

group:控制告警路由。default组关联到通知频道。你可以创建单独的组(如nocengineering),将其路由到不同的Slack频道或邮件列表。

编辑生成的文件,添加描述,按前缀调整ignoreMorespecifics,或添加尚未公告但需要监控未授权发起的前缀。

如何配置config.yml?

自动配置向导在首次运行时创建默认的config.yml。生产环境中,你需要对每个参数进行明确控制。

创建/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

连接器说明

connectorRIS通过WebSocket从RIPE RIS传输实时BGP更新。carefulSubscription: true设置将数据流限制为仅你监控的前缀,减少带宽和CPU消耗。

你的防火墙必须允许到ris-live.ripe.net端口80(ws://)或443(wss://)的出站WebSocket连接。不需要入站规则。

rest部分在端口8011暴露一个本地HTTP API用于健康检查。默认绑定到localhost,不会暴露到网络。

监控器调优

thresholdMinPeers控制灵敏度。值为3表示至少3个路由收集器peer必须确认异常才会触发告警。较低的值能捕获更多事件但会产生更多误报。对于劫持检测,3是一个好的起点。对于可见性监控,40比较合适,因为RIPE RIS有600多个peer。

notificationIntervalSeconds在监控器级别覆盖全局设置。对于可见性监控,3600(1小时)可防止flapping期间的告警疲劳。

如何用BGPalerter监控RPKI无效公告?

BGPalerter检查接收到的每个BGP公告的RPKI有效性。如果你的前缀以RPKI无效状态出现,你会收到告警。这可以捕获ROA配置错误和某些RPKI过滤会拒绝的劫持类型。

config.yml中的monitorRPKI部分负责此功能:

  • checkUncovered: true在你的前缀没有ROA时告警。每个公告的前缀都应该有ROA覆盖。
  • checkDisappearing: true在之前覆盖你前缀的ROA消失时告警。

独立的monitorROAS模块监控RPKI层面的ROA变化:新ROA创建、现有ROA编辑或删除、以及ROA即将过期。roaExpirationAlertHours: 2设置在ROA过期前2小时通知你。

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

如何在BGPalerter中设置邮件告警?

config.ymlreports部分添加reportEmail块。BGPalerter直接使用SMTP。

reports:
  # ... 保留上面的reportFile ...

  - 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

将SMTP值替换为你的邮件服务器信息。showPaths: 5设置在告警邮件中包含最多5条AS路径,方便你查看异常路由的传播路径。

由于config.yml以明文存储SMTP密码,限制文件权限使只有bgpalerter用户和root可以读取:

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

notifiedEmails部分将组映射到邮件地址。default组接收所有告警。如果你在prefixes.yml中定义了自定义组,添加对应条目:

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

如何在BGPalerter中设置Slack通知?

reports部分添加reportSlack块。你需要一个Slack incoming webhook URL。

在Slack中创建webhook:进入workspace设置,在Apps下找到"Incoming Webhooks",为你想接收告警的频道创建webhook。

reports:
  # ... 保留reportFile和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

colors映射为Slack中每种告警类型分配不同颜色。红色表示劫持,黄色表示可见性丢失,紫色表示RPKI问题。

将webhook URL替换为你的实际Slack webhook。之前设置的config.yml权限(640,root:bgpalerter)确保webhook URL只有服务可以读取。

如何将BGPalerter作为systemd服务运行?

创建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

ProtectSystem=strictProtectHome=true指令限制文件系统访问。BGPalerter只需要写入自己的目录。

启用并启动

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

enable使服务开机自启。--now立即启动。

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

自包含二进制文件内置了完整的Node.js运行时,因此基础内存消耗约500-800 MB,与前缀数量无关。确保监控服务器至少有1 GB空闲内存。

查看日志

journalctl -u bgpalerter -f --no-pager

启动时,BGPalerter加载配置并连接RIPE RIS。journal中的前几行如下:

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

BGPalerter也会将日志写入/opt/bgpalerter/logs/logRotatePattern: YYYY-MM-DD设置每天创建新的日志文件。配合maxRetainedFiles: 30compressOnRotation: true,无需手动维护即可保留一个月的压缩日志。

如何测试BGPalerter告警?

使用-t选项运行BGPalerter,向所有已配置的通知频道发送测试告警。内置的测试连接器会模拟每种告警类型,无需等待真实的BGP事件。

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

这会向你的Slack频道和邮箱发送测试消息。检查告警是否以正确的格式和路由到达。如果你定义了多个组,每个组应收到其对应的告警。

持续监控时,查看journal:

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

BGPalerter与替代方案相比如何?

BGPalerter不是唯一的BGP监控方案。以下是快速对比:

工具 类型 适用场景
BGPalerter 自托管,开源 单AS,前缀监控,实时告警
ARTEMIS 自托管,开源 大型网络,自定义检测模块,研究
Cloudflare Radar SaaS 快速查询,无需自托管,有限告警
BGPStream 库/SaaS 编程分析,历史数据研究
bgp.tools SaaS 可视化探索,社区数据,快速检查

BGPalerter适合自托管单AS的使用场景。不需要路由器集成,可以在小型VPS上运行。ARTEMIS更强大,但部署复杂度也高得多。

为了纵深防御,将BGPalerter与RPKI ROA部署和BGP会话上的适当路由过滤结合使用。

出了问题?

BGPalerter立即退出:检查journalctl -u bgpalerter -e。常见原因:config.yml或prefixes.yml中的YAML格式错误。用python3 -c "import yaml; yaml.safe_load(open('config.yml'))"验证。

没有来自RIPE RIS的数据:防火墙必须允许到ris-live.ripe.net端口80(WebSocket)的出站连接。如果你在限制性代理后面,改用端口443的wss:// URL。相应地更新config.yml中的连接器URL。

告警未到达(邮件):用-t运行来定位问题。检查config.yml中的SMTP凭据。确认发件地址被邮件服务器允许(SPF、身份验证)。查看journalctl -u bgpalerter中的SMTP错误信息。

告警未到达(Slack):确认webhook URL有效。Slack会停用未使用的app的webhook。直接测试webhook:curl -X POST -H 'Content-type: application/json' --data '{"text":"test"}' "https://hooks.slack.com/services/T00/B00/xxxx"

内存占用高:大型前缀列表消耗更多内存。如果你监控很多ASN,考虑增加swap或拆分为多个BGPalerter实例,使用独立的前缀文件。

服务无法重启:unit文件中的RestartSec=30s在重启尝试之间添加30秒延迟。对于持续失败,检查systemctl status bgpalerter中的退出代码。


版权所有 2026 Virtua.Cloud。保留所有权利。 本内容为 Virtua.Cloud 团队原创作品。 未经书面许可,禁止复制、转载或再分发。

准备好亲自尝试了吗?

几秒内部署您自己的服务器。支持 Linux、Windows 或 FreeBSD。

查看 VPS 方案