Мониторинг BGP-анонсов с помощью BGPalerter на Linux

8 мин чтения·Matthieu·rpkinetworkingbgpalertermonitoringbgp|

Разверните 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