// DevOps

BGP на Keenetic: как поднять динамическую маршрутизацию через Entware и FRR

Опубликовано 30.05.2026

BGP обычно ассоциируется с оборудованием операторов и Linux-серверами, но в небольших распределённых сетях он полезен и на офисном роутере: соседние площадки сами узнают о новых подсетях, а при падении туннеля маршруты перестраиваются без ручных правок.

В официальном списке компонентов KeeneticOS 5.x ни BGP, ни OSPF нет. Протокол на Keenetic запускают как сторонний демон в среде OPKG/Entware. Готовые пакеты в репозитории Entware есть для BIRD и Quagga; FRR готовым пакетом не распространяется, его нужно собирать самому. В статье — все три варианта и вариант с отдельной машиной рядом с роутером.

BGP работает поверх TCP, порт 179. Открывать его на внешнем интерфейсе без фильтрации нельзя: это прямой путь к атакам на управляющую часть роутера. Поддержка Keenetic допускает установку пакетов Entware, но по их настройке не консультирует — всё делается самостоятельно.

Схема

             ┌──────────────────────┐
             │  Upstream / VPS / DC │
             │  AS 65001            │
             │  10.255.0.1          │
             └──────────┬───────────┘
                        │
                  WireGuard / GRE / IPIP
                        │
             ┌──────────▼───────────┐
             │      Keenetic         │
             │  KeeneticOS + Entware │
             │  BIRD / Quagga / FRR  │
             │  AS 65010             │
             │  10.255.0.2           │
             └──────────┬───────────┘
                        │
                 LAN 192.168.10.0/24

Keenetic здесь — небольшой пограничный маршрутизатор площадки. Он получает от центрального узла маршрут по умолчанию или ограниченный набор префиксов, анонсирует свою локальную сеть и перестраивает маршруты между резервными туннелями. Полную таблицу интернета (больше миллиона префиксов) роутер не потянет — это встраиваемое устройство с ограниченными процессором и памятью.

Когда это оправдано

  1. Связь площадок через VPN. Несколько офисов соединены туннелями WireGuard или GRE, BGP сообщает соседям о новых и изменённых подсетях.
  2. Резервные туннели. Основной и запасной каналы: BGP переключает маршруты при падении сессии, без самописных скриптов.
  3. Лабораторный стенд. Изучение BGP в связке с VyOS, MikroTik или Cisco на недорогом роутере.

Плохая идея — принимать полную таблицу от провайдера, строить на Keenetic ядро сети, использовать его как route reflector для множества клиентов и публиковать BGP наружу без фильтров.

Варианты

ВариантЧто ставитьПлюсыМинусы
A. Отдельная Linux-машинаFRR из пакетов дистрибутиванадёжно, штатные обновления, роутер не нагруженнужна ещё одна машина
B. BIRD на Keeneticbird2 из Entwareготовый пакет, лёгкий демонсобственный синтаксис конфигурации
C. Quagga на Keeneticquagga-* из Entwareготовые пакеты, синтаксис vtysh как у Ciscoпроект не развивается с 2018 года
D. FRR на Keeneticсобственная сборкасовременный стек, vtyshсборка и доработка рецепта, всё сопровождение на вас

Вариант A рекомендуем для рабочих сетей: FRR на мини-ПК, в LXC-контейнере или виртуальной машине рядом с роутером, а на Keenetic — только статический маршрут к нему.

Keenetic ── LAN ── Linux с FRR ── VPN/BGP ── Upstream

Дальше — варианты B, C и D на самом роутере.

Подготовка Keenetic

Шаг 1. Установить Entware

В веб-интерфейсе: Управление → Общие настройки → Изменить набор компонентов, компонент «Поддержка открытых пакетов (OPKG)». Хранилище — USB-накопитель с EXT4 или, на моделях с KeeneticOS 3.7 и новее, встроенная память. Архив установщика выбирается по архитектуре процессора роутера (mipsel, mips или aarch64); для встроенной памяти установка выполняется командой вида:

(config)> opkg disk storage:/ https://bin.entware.net/aarch64-k3.10/installer/aarch64-installer.tar.gz

Шаг 2. Войти в среду Entware и обновить пакеты

(config)> exec sh
bash
opkg update
opkg upgrade

Проверьте, что доступно для вашей архитектуры:

bash
opkg list | grep -E '^(bird|quagga|frr)'

На сентябрь 2026 года в выводе будут bird2, bird3 и пакеты quagga-*, а frr не будет — его в бинарном репозитории Entware нет.

Исходные данные для всех примеров:

  • AS Keenetic — 65010, AS центрального узла — 65001;
  • адрес туннеля Keenetic — 10.255.0.2, центрального узла — 10.255.0.1;
  • локальная сеть Keenetic — 192.168.10.0/24.

Вариант B. BIRD

bash
opkg install bird2 bird2c

Пакет устанавливает демон /opt/sbin/bird, консоль /opt/sbin/birdc, конфигурацию /opt/etc/bird.conf (пример из дистрибутива BIRD) и скрипт запуска /opt/etc/init.d/S70bird.

Замените содержимое /opt/etc/bird.conf:

router id 10.255.0.2;

protocol device { }

# Сети интерфейса LAN — чтобы было что анонсировать.
# Имя интерфейса сверьте командой ip -4 addr.
protocol direct {
    ipv4;
    interface "br0";
}

# В ядро роутера — только маршруты, полученные по BGP.
protocol kernel {
    ipv4 {
        export where source = RTS_BGP;
    };
}

filter lan_out {
    if net ~ [ 192.168.10.0/24 ] then accept;
    reject;
}

filter from_upstream {
    if net ~ [ 0.0.0.0/0, 10.0.0.0/8{8,24}, 172.16.0.0/12{12,24} ] then accept;
    reject;
}

protocol bgp upstream {
    local 10.255.0.2 as 65010;
    neighbor 10.255.0.1 as 65001;
    ipv4 {
        import filter from_upstream;
        export filter lan_out;
    };
}

Запуск и проверка:

bash
/opt/etc/init.d/S70bird start
birdc show protocols
birdc show route protocol upstream

Сессия должна быть в состоянии Established. Скрипт S70bird запускается автоматически вместе с остальными службами Entware.

Вариант C. Quagga

bash
opkg install quagga-zebra quagga-bgpd quagga-vtysh

Конфигурация — в /opt/etc/quagga/, скрипт запуска — /opt/etc/init.d/S50quagga. Скрипт стартует те демоны, для которых существует файл <демон>.conf, поэтому нужны zebra.conf и bgpd.conf. Демоны по умолчанию работают от пользователя network: если его нет в системе Entware, запуск завершится ошибкой — создайте пользователя или поправьте скрипт.

/opt/etc/quagga/zebra.conf:

hostname keenetic-zebra
log file /opt/var/log/zebra.log

/opt/etc/quagga/bgpd.conf:

hostname keenetic-bgpd
log file /opt/var/log/bgpd.log
!
ip prefix-list PL-LAN seq 10 permit 192.168.10.0/24
ip prefix-list PL-IN seq 10 permit 0.0.0.0/0
ip prefix-list PL-IN seq 20 permit 10.0.0.0/8 le 24
!
router bgp 65010
 bgp router-id 10.255.0.2
 network 192.168.10.0/24
 neighbor 10.255.0.1 remote-as 65001
 neighbor 10.255.0.1 prefix-list PL-IN in
 neighbor 10.255.0.1 prefix-list PL-LAN out
bash
/opt/etc/init.d/S50quagga start
vtysh -c 'show ip bgp summary'

Quagga — предшественник FRR, последние изменения в её репозитории датированы февралём 2018 года. Для лабораторий и простых схем её хватает, но исправлений безопасности она больше не получает.

Вариант D. Собственная сборка FRR

Почему готового пакета нет

Рецепт сборки FRR 10.4.1 в исходниках Entware есть (репозиторий entware-packages, каталог net/frr), но он перенесён из OpenWrt без адаптации: конфигурация ставится в /etc/frr, программы — в /usr/sbin и /usr/bin, скрипт запуска рассчитан на систему инициализации OpenWrt. На Keenetic стороннее ПО живёт в /opt, поэтому рецепт перед сборкой нужно доработать. В OpenWrt актуальная версия пакета уже 10.6.1.

Сборка

Сборка идёт на Linux-машине с зависимостями системы сборки OpenWrt и не меньше 7 ГБ свободного места (по wiki Entware):

bash
git clone https://github.com/Entware/Entware.git && cd Entware
make package/symlinks
cp -iv configs/mipsel-3.4.config .config   # или aarch64-3.10, mips-3.4 — по архитектуре роутера
make -j$(nproc) tools/install
make -j$(nproc) toolchain/install
make -j$(nproc) target/compile

Перед сборкой самого пакета исправьте рецепт feeds/packages/net/frr/Makefile (путь внутри дерева сборки может отличаться — найдите каталог net/frr):

  1. в параметрах --sysconfdir и --localstatedir замените /etc/frr и /var/run/frr на /opt/etc/frr и /opt/var/run/frr;
  2. в секциях установки замените /usr/sbin, /usr/bin, /usr/lib и /etc/frr на соответствующие каталоги в /opt;
  3. скрипт запуска OpenWrt не используйте — ниже приведён свой.

Затем выберите в make menuconfig пакеты frr, frr-zebra, frr-bgpd, frr-vtysh, frr-watchfrr и соберите:

bash
make package/frr/compile

У подпакета frr-bgpd в рецепте указана опция ядра CONFIG_TCP_MD5SIG (нужна для паролей BGP). Если он не выбирается в menuconfig, дело в этой зависимости. Работать ли паролям BGP на роутере, решает уже ядро Keenetic, а не сборка.

Готовые .ipk появятся в каталоге bin/ дерева сборки. Вместе с FRR соберётся библиотека libyang — в бинарном репозитории Entware её нет, её пакет тоже нужно скопировать на роутер. Остальные зависимости (libjson-c, libprotobuf-c, libreadline, libcap и другие) ставятся из репозитория Entware.

Установка на роутер

bash
opkg install ./libyang_*.ipk ./frr_*.ipk ./frr-zebra_*.ipk ./frr-bgpd_*.ipk ./frr-vtysh_*.ipk

FRR собирается с пользователем и группой network (--enable-user=network): если их нет в системе Entware, демоны не запустятся — создайте их или соберите с root.

Конфигурация FRR

/opt/etc/frr/frr.conf:

frr defaults traditional
hostname keenetic-bgp
log file /opt/var/log/frr/frr.log informational
service integrated-vtysh-config
!
ip prefix-list PL-LAN seq 10 permit 192.168.10.0/24
ip prefix-list PL-LAN seq 999 deny 0.0.0.0/0 le 32
!
ip prefix-list PL-IN seq 10 permit 0.0.0.0/0
ip prefix-list PL-IN seq 20 permit 10.0.0.0/8 le 24
ip prefix-list PL-IN seq 30 permit 172.16.0.0/12 le 24
ip prefix-list PL-IN seq 999 deny 0.0.0.0/0 le 32
!
route-map RM-IN permit 10
 match ip address prefix-list PL-IN
!
route-map RM-OUT permit 10
 match ip address prefix-list PL-LAN
!
router bgp 65010
 bgp router-id 10.255.0.2
 neighbor 10.255.0.1 remote-as 65001
 neighbor 10.255.0.1 description upstream-vps
 neighbor 10.255.0.1 timers 10 30
 !
 address-family ipv4 unicast
  network 192.168.10.0/24
  neighbor 10.255.0.1 route-map RM-IN in
  neighbor 10.255.0.1 route-map RM-OUT out
 exit-address-family
!
line vty

В режиме frr defaults traditional FRR не требует политики для eBGP-соседа, но фильтры всё равно задавайте явно: они защищают сеть от ошибок на другой стороне. bgp router-id лучше указать вручную — не стоит полагаться на автоматический выбор по адресам интерфейсов роутера.

BGP анонсирует сеть из network только если такой префикс есть в таблице маршрутизации ядра:

bash
ip route show 192.168.10.0/24

Автозапуск

/opt/etc/init.d/S80frr:

bash
#!/bin/sh

PATH=/opt/sbin:/opt/bin:/sbin:/bin:/usr/sbin:/usr/bin
RUN_DIR=/opt/var/run/frr

start() {
  mkdir -p "$RUN_DIR" /opt/var/log/frr
  for d in mgmtd zebra bgpd; do
    pidof "$d" >/dev/null || "$d" -d -A 127.0.0.1
  done
  sleep 2
  vtysh -b          # загрузить /opt/etc/frr/frr.conf во все демоны
}

stop() {
  for d in bgpd zebra mgmtd; do
    pid=$(pidof "$d") && kill "$pid"
  done
}

case "$1" in
  start) start ;;
  stop) stop ;;
  restart) stop; sleep 2; start ;;
  *) echo "Usage: $0 {start|stop|restart}"; exit 1 ;;
esac
bash
chmod +x /opt/etc/init.d/S80frr
/opt/etc/init.d/S80frr start

mgmtd в FRR 10 — служба управления конфигурацией, её запускают вместе с zebra.

Настройка противоположной стороны (Linux с FRR)

frr defaults traditional
hostname upstream-vps
log syslog informational
service integrated-vtysh-config
!
ip prefix-list FROM-KEENETIC seq 10 permit 192.168.10.0/24
ip prefix-list FROM-KEENETIC seq 999 deny 0.0.0.0/0 le 32
!
ip prefix-list TO-KEENETIC seq 10 permit 0.0.0.0/0
ip prefix-list TO-KEENETIC seq 999 deny 0.0.0.0/0 le 32
!
router bgp 65001
 bgp router-id 10.255.0.1
 neighbor 10.255.0.2 remote-as 65010
 neighbor 10.255.0.2 description keenetic-router
 !
 address-family ipv4 unicast
  neighbor 10.255.0.2 prefix-list FROM-KEENETIC in
  neighbor 10.255.0.2 prefix-list TO-KEENETIC out
  neighbor 10.255.0.2 default-originate
 exit-address-family

default-originate отдаёт соседу маршрут по умолчанию, даже если его нет в таблице BGP самого сервера. Включите пересылку пакетов:

bash
sysctl -w net.ipv4.ip_forward=1
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.d/99-forwarding.conf

Проверка

Что проверитьBIRDQuagga / FRR
Состояние сессииbirdc show protocolsvtysh -c 'show bgp summary'
Полученные маршрутыbirdc show route protocol upstreamvtysh -c 'show ip bgp'
Маршруты в ядреip routeip route show proto bgp (FRR)

Нужное состояние сессии — Established.

Типичные ошибки

  1. opkg install frr — «Unknown package». Готового FRR в Entware нет: используйте BIRD или Quagga либо соберите FRR сами.
  2. Сессия висит в Active или Connect. Проверьте доступность соседа по TCP 179 (nc -vz 10.255.0.1 179) и межсетевой экран KeeneticOS на туннельном интерфейсе.
  3. Сессия Established, но маршрутов нет. Ошибка в фильтрах или prefix-list на одной из сторон.
  4. После перезагрузки ничего не работает. Демоны стартуют только после монтирования хранилища Entware; проверьте, что накопитель подключился и скрипты в /opt/etc/init.d запустились.
  5. Демон не стартует из-за пользователя. Quagga и FRR по умолчанию работают от network — пользователь должен существовать.

Ограничения

  • Маршруты вне ведома KeeneticOS. Сторонний демон пишет маршруты прямо в таблицу ядра Linux. KeeneticOS управляет своими таблицами, политиками подключений и Multi-WAN сам и эти маршруты в веб-интерфейсе не показывает. Документация Keenetic такую связку не описывает, поэтому после изменений настроек роутера проверяйте, что маршруты на месте и трафик идёт через нужный интерфейс.
  • Зависимость от хранилища. Если флешка с Entware отказала или отмонтировалась, демон маршрутизации перестаёт работать вместе с ней.
  • Ресурсы. Частые изменения маршрутов у соседа (flapping) нагружают слабый процессор роутера и мешают остальным его функциям.

Итог

BGP на Keenetic через Entware — рабочий инструмент для небольших распределённых сетей и лабораторий. Проще всего начать с BIRD: пакет готовый и лёгкий. Quagga подойдёт тем, кому привычен синтаксис Cisco, но проект заброшен. FRR на самом роутере возможен только через собственную сборку и остаётся вариантом для энтузиастов. Для рабочих сетей надёжнее вынести FRR на отдельную Linux-машину рядом с роутером, а Keenetic оставить подключение к интернету.

// Contact

Нужна помощь?

Свяжись со мной и я помогу решить проблему

Написать в Telegram

Отвечаю в течение рабочего дня (03:00–13:00 GMT)

Или оставьте заявку здесь:

Подтвердите, что вы не бот.

Написать и получить быстрый ответ