OpenBGPD — демон маршрутизации BGP с открытым кодом, который вырос из проекта OpenBSD. Его ценят за компактный конфиг, строгую фильтрацию по умолчанию и предсказуемое поведение. На OpenBSD он входит в базовую систему, на Linux собирается из портируемой ветки. Ниже — установка, настройка сессии, фильтры префиксов и диагностика на собственной инфраструктуре.

Когда он уместен

OpenBGPD решает задачи пограничной маршрутизации: обмен маршрутами с провайдером, анонс своей сети, приём маршрутов от нескольких аплинков, внутренняя сессия с другим маршрутизатором. Демон не пытается быть комбайном: в нём нет OSPF и IS-IS, нет богатого набора политик и огромной экосистемы модулей. Зато конфигурация читается целиком, а фильтры описываются явно.

Важная особенность — безопасная модель по умолчанию. Пока администратор явно не разрешил приём или анонс, сессия не передаст маршруты. Это защищает от классической ошибки, когда маршрутизатор принимает весь интернет-таблицу от случайного соседа. Для домашней лаборатории с одним провайдером такой демон часто избыточен, но для учебной площадки и небольшого оператора подходит хорошо.

Установка на OpenBSD

На OpenBSD ставить нечего: bgpd и bgpctl уже есть. Нужно включить демон, проверить конфиг и запустить его через rcctl. Файл по умолчанию — /etc/bgpd.conf.

doas bgpd -nv -f /etc/bgpd.conf
doas rcctl enable bgpd
doas rcctl start bgpd
doas bgpctl show summary

Ключ -n проверяет синтаксис без запуска, -v добавляет подробности. Привычка прогонять эту команду перед перезапуском экономит немало времени: ошибка в одном символе не роняет рабочую сессию.

Сборка на Linux

В репозиториях большинства дистрибутивов OpenBGPD нет, поэтому используют порт openbgpd-portable. Нужны компилятор, libevent и OpenSSL. Сборка занимает пару минут на обычном сервере.

sudo apt install build-essential libevent-dev libssl-dev git pkg-config
git clone https://github.com/openbgpd-portable/openbgpd-portable.git
cd openbgpd-portable && ./configure --prefix=/usr/local --sysconfdir=/etc/bgpd
make -j$(nproc) && sudo make install

Демон слушает порт 179 и меняет таблицу маршрутизации, поэтому ему нужны права root либо набор возможностей CAP_NET_ADMIN и CAP_NET_BIND_SERVICE. Простой unit-файл запускает бинарник с явным конфигом и перечитывает его по SIGHUP.

sudo tee /etc/systemd/system/bgpd.service <<'EOF'
[Unit]
Description=OpenBGPD
After=network-online.target
[Service]
ExecStart=/usr/local/sbin/bgpd -f /etc/bgpd/bgpd.conf
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure
[Install]
WantedBy=multi-user.target
EOF
sudo systemctl daemon-reload && sudo systemctl enable --now bgpd

Сессия с соседом

Минимальный конфиг описывает локальный AS, router-id и одного соседа. Для связи через несколько площадок удобно держать общие определения в отдельном файле и подключать их директивой include.

AS 65001
router-id 192.0.2.1
listen on 192.0.2.1

neighbor 192.0.2.2 {
    remote-as 65002
    descr "upstream"
    local-address 192.0.2.1
    announce IPv4 unicast
    announce IPv6 unicast
    max-prefix 500000
}
include "/etc/bgpd/filters.conf"

Параметр max-prefix ограничивает число принимаемых маршрутов: при превышении сессия сбрасывается, и площадка не забивает память миллионом записей. Значение подбирают по реальному размеру таблицы плюс запас. Для IPv6-сессии нужен адрес 2001:db8::1 и тот же блок с announce IPv6 unicast.

Фильтрация префиксов

Фильтры — главная часть конфигурации. Сначала объявляют набор разрешённых префиксов, затем правила «разрешить только его, остальное отбросить». Правила применяются по порядку, первое совпадение выигрывает.

prefix-set mynet {
    192.0.2.0/24
    2001:db8:100::/48
}

allow from any prefix-set mynet
deny from any
allow to any prefix-set mynet
deny to any

Пустой deny в конце обязателен: без него демон может принять неожиданный маршрут. Анонс наружу тоже ограничивают своим префиксом, иначе легко стать источником утечки чужих сетей. Проверьте маски в наборе: опечатка превращает /24 в /16 и открывает анонс целого блока, который вам не принадлежит. Для атрибутов используют match: например, повышают локальное предпочтение маршрутам с определённым community.

match from any community 65001:100 set localpref 200
match from any community 65001:200 set med 50
deny from any

Выбор пути и несколько аплинков

Когда соседей два, демон сравнивает маршруты по цепочке атрибутов: вес, локальное предпочтение, длина AS-path, origin, MED. Понимание этой цепочки важнее любых настроек. Если трафик уходит не туда, сначала смотрят bgpctl show rib detail и находят, какой атрибут решил исход, а уже потом меняют политику.

MED имеет смысл только между сессиями с одним и тем же соседом: за пределы чужого AS он обычно не передаётся. Локальное предпочтение действует внутри вашей сети и потому надёжнее для выбора основного канала. Анонс по умолчанию делайте только для своих префиксов: маршрут, полученный от одного провайдера, не должен уходить второму.

bgpctl show rib community 65001:100
bgpctl show rib as 65002
bgpctl show neighbor 192.0.2.2 timers

Диагностика

Основной инструмент — bgpctl. Он показывает состояние сессий, таблицу маршрутов и установленные в ядро записи. Если сессия не поднимается, проверяют reachability, ACL и совпадение AS.

bgpctl show summary
bgpctl show neighbor 192.0.2.2
bgpctl show rib detail
bgpctl show fib
sudo tcpdump -ni eth0 tcp port 179

show summary даёт состояние, uptime и число принятых префиксов. show neighbor показывает таймеры и причины последнего сброса. show fib полезен, когда BGP-таблица полна, а трафик всё равно идёт не туда: значит, маршрут не прошёл выбор лучшего пути или его перекрывает статический маршрут. После правки конфига выполняют bgpctl reload, а не полный рестарт, чтобы не рвать сессии без нужды. Этого набора хватает в большинстве случаев.

Короткий чек-лист перед запуском

  • AS, router-id и адреса соседей заданы явно;
  • префикс-сеты проверены по whois;
  • bgpd -nv проходит без ошибок.

Итог

OpenBGPD — аккуратный инструмент для тех, кто готов описать политику явно. На OpenBSD он доступен сразу, на Linux собирается из порта и нормально живёт под systemd. Начните с одной тестовой сессии в отдельном AS, проверьте фильтры на стенде, включите max-prefix и только потом выводите демон на пограничный маршрутизатор. Явные allow и deny в конфиге читаются лучше, чем отладка последствий по трафику.

Насколько публикация полезна?

Нажмите на звезду, чтобы оценить!

Средняя оценка 0 / 5. Количество оценок: 0

Оценок пока нет. Поставьте оценку первым.

Поделиться: Telegram ВКонтакте