在Linux上使用BGPalerter监控BGP公告
在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.yml和prefixes.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组关联到通知频道。你可以创建单独的组(如noc、engineering),将其路由到不同的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.yml的reports部分添加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=strict和ProtectHome=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: 30和compressOnRotation: 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 团队原创作品。 未经书面许可,禁止复制、转载或再分发。