Мониторинг BGP-анонсов с помощью BGPalerter на Linux
Разверните BGPalerter v2 на Linux VPS для мониторинга префиксов на предмет хайджеков, утечек маршрутов и невалидных состояний RPKI. Настройте оповещения в Slack и по email, запустите как systemd-сервис.
Если ты анонсируешь собственные префиксы через BGP, нужно знать, когда что-то идёт не так. Хайджек префикса, утечка маршрута, ошибка конфигурации RPKI — всё это может увести твою сеть в оффлайн или направить трафик через атакующего. BGPalerter отслеживает публичные данные route collector'ов и оповещает в реальном времени.
В этом руководстве мы установим BGPalerter v2 на Ubuntu 24.04, настроим мониторинг префиксов и ASN, подключим оповещения в Slack и по email, и запустим всё это как systemd-сервис. Предполагается, что BGP уже работает через BIRD2 или FRR.
Что мониторит BGPalerter и как он работает?
BGPalerter мониторит твои BGP-префиксы в реальном времени через публичные данные route collector'ов RIPE RIS. Он подключается по WebSocket к ris-live.ripe.net, который агрегирует потоки от 600+ пиров по всему миру. Интеграция с твоими маршрутизаторами не нужна. Работает на любом Linux-сервере с исходящим доступом в интернет.
BGPalerter включает следующие мониторы:
| Монитор | Что обнаруживает | Канал по умолчанию |
|---|---|---|
| monitorHijack | Несоответствие origin AS, хайджеки подпрефиксов | hijack |
| monitorVisibility | Префикс отозван или виден слишком малому числу пиров | visibility |
| monitorNewPrefix | Неожиданный подпрефикс, анонсированный твоим AS | newprefix |
| monitorPath | AS-путь совпадает с regex-шаблоном (scrubbing, смена транзита) | path |
| monitorPathNeighbors | Неожиданный upstream/downstream AS в пути | path |
| monitorAS | Твой ASN анонсирует необъявленный префикс | misconfiguration |
| monitorRPKI | Префикс анонсирован с RPKI-статусом Invalid | rpki |
| monitorROAS | ROA добавлен, изменён, удалён или истекает | roa |
У каждого монитора есть параметр thresholdMinPeers. Оповещение срабатывает только когда аномалию подтвердит как минимум указанное число пиров route collector'а, что снижает ложные срабатывания.
Как установить BGPalerter на Ubuntu 24.04?
Скачай последний бинарник BGPalerter с GitHub и сделай его исполняемым. При использовании готового бинарника установка Node.js не нужна. Автономный бинарник включает runtime Node.js; рассчитывай минимум на 1 ГБ свободной RAM на сервере мониторинга.
Создаём выделенного пользователя
Запускай 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 МБ. Бинарник автономный и включает runtime 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 запрашивает публичные данные маршрутизации и создаёт prefixes.yml на основе того, что твой AS сейчас анонсирует.
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 для мониторинга. Через запятую для нескольких: -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: Установи в true, если намеренно деагрегируешь (например, анонсируешь и /24, и /25). При false BGPalerter оповестит о любом неожиданном more-specific анонсе. Для большинства операторов false — правильное значение по умолчанию. Неожиданные more-specifics — сигнал о хайджеке.
options.monitorASns: Включает monitorAS для твоего ASN. BGPalerter оповестит, если твой ASN начнёт оригинировать префикс, не указанный в файле.
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 стримит live BGP-обновления от RIPE RIS через WebSocket. Настройка carefulSubscription: true ограничивает поток только твоими мониторируемыми префиксами, снижая потребление полосы и CPU.
Файрвол должен разрешать исходящие WebSocket-соединения к ris-live.ripe.net на порту 80 (ws://) или 443 (wss://). Входящие правила не нужны.
Секция rest открывает локальный HTTP API на порту 8011 для health check'ов. По умолчанию слушает на localhost, так что наружу не торчит.
Тюнинг мониторов
thresholdMinPeers управляет чувствительностью. Значение 3 означает, что как минимум 3 пира route collector'а должны подтвердить аномалию перед срабатыванием оповещения. Меньшие значения ловят больше событий, но дают больше ложных срабатываний. Для обнаружения хайджеков 3 — хорошая отправная точка. Для visibility подходит 40, поскольку у RIPE RIS 600+ пиров.
notificationIntervalSeconds на уровне монитора переопределяет глобальную настройку. Для visibility значение 3600 (1 час) предотвращает усталость от оповещений при флэппинге.
Как мониторить RPKI-невалидные анонсы с BGPalerter?
BGPalerter проверяет RPKI-валидность каждого полученного BGP-анонса для твоих префиксов. Если твой префикс появляется с RPKI-статусом Invalid, ты получаешь оповещение. Это ловит ошибки конфигурации ROA и определённые типы хайджеков, которые RPKI-фильтрация бы отклонила.
Секция monitorRPKI в config.yml отвечает за это:
checkUncovered: trueоповещает, когда у твоего префикса нет ROA. Каждый анонсируемый префикс должен иметь покрытие ROA.checkDisappearing: trueоповещает, когда ROA, покрывавший твой префикс, исчезает.
Отдельный модуль monitorROAS следит за изменениями ROA на уровне RPKI: новые ROA, редактирование или удаление существующих, ROA с приближающимся сроком истечения. Параметр roaExpirationAlertHours: 2 предупреждает за 2 часа до истечения ROA.
Пример 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
Как настроить email-оповещения в BGPalerter?
Добавь блок reportEmail в секцию reports файла config.yml. 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 сопоставляет группы с email-адресами. Группа default получает все оповещения. Если ты определил пользовательские группы в prefixes.yml, добавь соответствующие записи:
notifiedEmails:
default:
- noc@example.com
noc:
- oncall@example.com
- sre@example.com
Как настроить Slack-уведомления в BGPalerter?
Добавь блок reportSlack в секцию reports. Понадобится URL входящего вебхука Slack.
Создай вебхук в Slack: зайди в настройки воркспейса, найди «Incoming Webhooks» в разделе Apps и создай вебхук для канала, куда хочешь получать оповещения.
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.
Замени URL-заглушку вебхука на свой реальный Slack-вебхук. Права config.yml, установленные ранее (640, root:bgpalerter), делают 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
Автономный бинарник включает весь runtime Node.js, поэтому базовое потребление памяти составляет 500-800 МБ вне зависимости от числа префиксов. Убедись, что на сервере мониторинга есть минимум 1 ГБ свободной RAM.
Смотрим логи
journalctl -u bgpalerter -f --no-pager
При запуске BGPalerter загружает конфиг и подключается к RIPE RIS. Первые строки в журнале выглядят так:
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?
Запусти BGPalerter с флагом -t, чтобы отправить тестовые оповещения через все настроенные каналы уведомлений. Встроенный тестовый коннектор симулирует каждый тип оповещения без ожидания реальных BGP-событий.
sudo -u bgpalerter /opt/bgpalerter/bgpalerter-linux-x64 -t
Это отправит тестовые сообщения в Slack-канал и на email. Проверь, что оповещения приходят с правильным форматированием и маршрутизацией. Если определено несколько групп, каждая должна получить свои оповещения.
Для постоянного мониторинга смотри журнал:
journalctl -u bgpalerter --since "1 hour ago" --no-pager
Как BGPalerter выглядит на фоне альтернатив?
BGPalerter — не единственный вариант мониторинга BGP. Вот краткое сравнение:
| Инструмент | Тип | Основной сценарий |
|---|---|---|
| BGPalerter | Self-hosted, open source | Один AS, мониторинг префиксов, оповещения в реальном времени |
| ARTEMIS | Self-hosted, open source | Крупные сети, кастомные модули обнаружения, исследования |
| Cloudflare Radar | SaaS | Быстрый просмотр, без self-hosting, ограниченный алертинг |
| BGPStream | Библиотека/SaaS | Программный анализ, исследование исторических данных |
| bgp.tools | SaaS | Визуальное исследование, данные сообщества, быстрые проверки |
BGPalerter хорошо подходит для self-hosted мониторинга одного AS. Не требует интеграции с маршрутизаторами и работает на небольшом VPS. ARTEMIS мощнее, но значительно сложнее в развёртывании.
Для эшелонированной защиты комбинируй BGPalerter с развёртыванием RPKI ROA и корректной фильтрацией маршрутов на BGP-сессиях.
Что-то пошло не так?
BGPalerter сразу завершается: Проверь journalctl -u bgpalerter -e. Частые причины: некорректный YAML в config.yml или prefixes.yml. Проверь валидность: python3 -c "import yaml; yaml.safe_load(open('config.yml'))".
Нет данных от RIPE RIS: Файрвол должен разрешать исходящие соединения к ris-live.ripe.net на порту 80 (WebSocket). Если ты за ограничивающим прокси, используй wss:// URL на порту 443. Обнови URL коннектора в config.yml.
Оповещения не приходят (email): Запусти с -t для изоляции проблемы. Проверь SMTP-учётные данные в config.yml. Убедись, что адрес отправителя разрешён почтовым сервером (SPF, аутентификация). Смотри journalctl -u bgpalerter на предмет ошибок SMTP.
Оповещения не приходят (Slack): Проверь, что URL вебхука валиден. Slack деактивирует вебхуки неиспользуемых приложений. Протестируй вебхук напрямую: curl -X POST -H 'Content-type: application/json' --data '{"text":"test"}' "https://hooks.slack.com/services/T00/B00/xxxx".
Высокое потребление памяти: Большие списки префиксов потребляют больше памяти. При мониторинге множества ASN увеличь swap или раздели на несколько инстансов BGPalerter с отдельными файлами префиксов.
Сервис не перезапускается: RestartSec=30s в юнит-файле добавляет 30-секундную задержку между попытками перезапуска. При постоянных сбоях проверь код выхода в systemctl status bgpalerter.
Авторское право 2026 Virtua.Cloud. Все права защищены. Данный контент является оригинальным произведением команды Virtua.Cloud. Воспроизведение, повторная публикация или распространение без письменного разрешения запрещены.
Готовы попробовать?
Разверните свой сервер за секунды. Linux, Windows или FreeBSD.
Смотреть тарифы VPS