Что такое FRR и почему BGP на Linux - это реально
Free Range Routing (FRR) - это пакет демонов динамической маршрутизации, родившийся как форк проекта Quagga. Он поддерживает OSPF, RIP, IS-IS и, конечно, BGP. FRR работает в userspace и взаимодействует с ядром Linux через стандартный сетевой стек, превращая обычный сервер в полноценный маршрутизатор. Проект активно развивается, имеет модульную архитектуру и интегрируется с systemd.
Аппаратные маршрутизаторы - это закрытые коробки с фиксированным объемом памяти, ограниченной производительностью CPU и дорогими лицензиями на фичи. Сервер Linux с FRR даёт вам полный контроль над оборудованием: вы сами выбираете число ядер, объем RAM, тип сетевых карт. Масштабирование - это добавление ресурсов, а не замена устройства целиком. Стоимость решения снижается кратно, особенно в сценариях с высокой пропускной способностью.
Типовые сценарии использования FRR с BGP на Linux:
- Граничный маршрутизатор ЦОД, принимающий полную таблицу маршрутов от upstream-провайдеров.
- BGP-пиринг с одним или несколькими провайдерами для анонсирования собственных IP-префиксов.
- Внутренняя маршрутизация в кластере Kubernetes с Calico, где BGP используется для обмена маршрутами между узлами.
- Построение отказоустойчивых конфигураций с резервированием каналов через Multi-homing и балансировку.
Если вы уже работали с аппаратными платформами вроде Cisco или Juniper, синтаксис vtysh покажется знакомым - он намеренно сделан похожим на IOS. Это сокращает порог входа для сетевых инженеров, переходящих на Linux-роутеры.
Подготовка среды: установка FRR и включение BGP-демона
Перед настройкой BGP необходимо установить FRR и активировать демон bgpd. Процесс отличается в зависимости от дистрибутива, но логика везде одна: добавить официальный репозиторий FRR, установить пакет, включить нужные демоны в конфигурационном файле и запустить службу.
Структура конфигурационных файлов после установки:
/etc/frr/frr.conf- основной файл конфигурации, куда записываются настройки BGP, OSPF и других протоколов./etc/frr/daemons- файл, определяющий, какие демоны запускать (bgpd, ospfd, ripd и т.д.)./var/log/frr/bgpd.log- лог-файл демона BGP, основной источник информации при диагностике.
Установка FRR на Debian/Ubuntu
FRR предоставляет собственный репозиторий для Debian и Ubuntu. Добавьте его и установите пакет:
# Добавление GPG-ключа и репозитория
curl -s https://deb.frrouting.org/frr/keys.gpg | sudo tee /usr/share/keyrings/frrouting.gpg > /dev/null
echo "deb [signed-by=/usr/share/keyrings/frrouting.gpg] https://deb.frrouting.org/frr $(lsb_release -sc) frr-stable" | sudo tee /etc/apt/sources.list.d/frr.list
# Установка
sudo apt update
sudo apt install frr frr-pythontools
Проверьте версию после установки:
sudo systemctl status frr
vtysh --version
Установка FRR на RHEL/CentOS/Rocky Linux
Для RPM-дистрибутивов FRR доступен через EPEL и собственный репозиторий. Пути к файлам немного отличаются от Debian, но логика та же:
# Установка EPEL и репозитория FRR
sudo dnf install epel-release
curl -s https://rpm.frrouting.org/repo/frr-stable.repo | sudo tee /etc/yum.repos.d/frr.repo
# Установка
sudo dnf install frr frr-pythontools
После установки конфигурационные файлы находятся в /etc/frr/, как и в Debian. Различие - в командах управления службами (systemctl вместо service), но systemd используется в обоих семействах.
Активация демона bgpd и первый запуск
По умолчанию все демоны FRR отключены. Откройте файл /etc/frr/daemons и установите bgpd=yes:
sudo sed -i 's/bgpd=no/bgpd=yes/' /etc/frr/daemons
Запустите службу FRR и проверьте статус:
sudo systemctl start frr
sudo systemctl enable frr
sudo systemctl status frr
Теперь войдите в интерфейс vtysh и выполните первую проверку:
sudo vtysh
show bgp summary
Вывод покажет пустую таблицу BGP-сессий - соседей ещё нет, но демон работает. Это подтверждает, что FRR установлен корректно и bgpd активен. Дальше - конфигурация первого BGP-соседа.
Базовая конфигурация BGP: ваш первый eBGP-сеанс
Минимальная рабочая конфигурация BGP состоит из трёх элементов: номер автономной системы (ASN), IP-адрес соседа с его ASN и префикс сети для анонсирования. Начнём с выбора ASN.
Понимание ASN и выбор номера автономной системы
Автономная система (AS) - это набор IP-сетей под единым административным контролем. Для BGP-пиринга каждой стороне нужен уникальный ASN. Публичные ASN (1–64511) выделяются региональными интернет-регистраторами и обязательны для работы в глобальной таблице маршрутизации. Частные ASN (64512–65534) используются внутри организаций и не должны утекать в интернет.
Для тестового стенда или внутренней маршрутизации выбирайте номер из диапазона 64512–65534. Для продакшен-пиринга с провайдером используйте выделенный вам публичный ASN. Ошибка с выбором ASN на этапе настройки - частая причина того, что сессия не поднимается.
Настройка eBGP с одним провайдером
Типовой сценарий: ваш сервер с AS 65001 подключается к провайдеру с AS 65002. IP-адрес вашего сервера - 192.0.2.2, адрес провайдера - 192.0.2.1. Вы анонсируете сеть 203.0.113.0/24. Войдите в vtysh и выполните конфигурацию:
sudo vtysh
configure terminal
router bgp 65001
neighbor 192.0.2.1 remote-as 65002
neighbor 192.0.2.1 description Upstream-Provider
address-family ipv4 unicast
network 203.0.113.0/24
exit-address-family
exit
write memory
Разбор команд:
router bgp 65001- создаёт BGP-процесс с вашим ASN.neighbor 192.0.2.1 remote-as 65002- определяет соседа и его ASN.address-family ipv4 unicast- переходит в контекст IPv4-маршрутизации.network 203.0.113.0/24- анонсирует указанную сеть.write memory- сохраняет конфигурацию в/etc/frr/frr.conf.
Проверьте состояние сессии:
show bgp summary
show ip bgp
В выводе show bgp summary столбец State/PfxRcd должен показывать число полученных префиксов, а не Idle или Active. Если видите число - сессия установлена и маршруты принимаются.
Углубленная настройка: фильтрация маршрутов и политики
Базовая конфигурация анонсирует вашу сеть и принимает всё, что отправляет провайдер. В реальной среде это недопустимо: вы рискуете стать транзитным узлом для чужого трафика или получить в таблицу маршрутизации сотни тысяч ненужных префиксов. Фильтрация через prefix-list и route-map решает эту задачу.
Использование prefix-list для определения разрешенных сетей
Prefix-list - это механизм сопоставления IP-префиксов с поддержкой масок переменной длины. В отличие от access-list, он понимает структуру подсети и позволяет задавать диапазоны длин префиксов через ключевые слова ge (greater or equal) и le (less or equal).
Примеры создания prefix-list в vtysh:
configure terminal
! Разрешить только маршрут по умолчанию
ip prefix-list DEFAULT-ONLY permit 0.0.0.0/0
! Разрешить конкретную сеть
ip prefix-list MY-NETWORKS permit 203.0.113.0/24
! Разрешить префиксы от /24 до /28 в диапазоне 10.0.0.0/8
ip prefix-list INTERNAL permit 10.0.0.0/8 ge 24 le 28
! Запретить всё остальное (неявное deny в конце)
ip prefix-list INTERNAL deny any
exit
Первый пример критически важен для сценария, когда провайдер отправляет вам только маршрут по умолчанию - вы принимаете его и ничего больше.
Применение route-map к BGP-соседу
Route-map связывает prefix-list с конкретным соседом и направлением (входящие или исходящие анонсы). Создайте route-map, который разрешает только маршрут по умолчанию от провайдера, и примените его на входящий трафик:
configure terminal
! Создание route-map
route-map FROM-PROVIDER permit 10
match ip address prefix-list DEFAULT-ONLY
exit
! Применение к соседу на входящие анонсы
router bgp 65001
neighbor 192.0.2.1 route-map FROM-PROVIDER in
exit
write memory
Для фильтрации исходящих анонсов - чтобы не стать транзитным узлом - создайте prefix-list с вашими сетями и route-map, разрешающий только их:
configure terminal
ip prefix-list MY-PREFIXES permit 203.0.113.0/24
route-map TO-PROVIDER permit 10
match ip address prefix-list MY-PREFIXES
exit
router bgp 65001
neighbor 192.0.2.1 route-map TO-PROVIDER out
exit
write memory
После применения фильтров сбросьте сессию с соседом для активации изменений:
clear ip bgp 192.0.2.1 soft in
clear ip bgp 192.0.2.1 soft out
soft означает мягкий сброс - сессия не разрывается, но фильтры переприменяются. Это безопасно для продакшена.
Отказоустойчивость и балансировка: BFD, Multipath и Graceful Restart
Стандартные таймеры BGP обнаруживают отказ соседа за 90–180 секунд. Для критичных сервисов это неприемлемо. Три механизма FRR сокращают время простоя до долей секунды и распределяют нагрузку между каналами.
Ускорение сходимости с BFD
Bidirectional Forwarding Detection (BFD) - это легковесный протокол, обнаруживающий потерю связности между двумя узлами за миллисекунды. Он работает независимо от BGP и сигнализирует демону bgpd о проблеме мгновенно, не дожидаясь истечения hold-таймера.
Настройка BFD в FRR выполняется в два шага: конфигурация BFD на интерфейсе и привязка к BGP-соседу:
configure terminal
! Включение BFD на интерфейсе
interface eth0
ip bfd
exit
! Привязка BFD к соседу
router bgp 65001
neighbor 192.0.2.1 bfd
exit
write memory
Проверка статуса BFD-сессии:
show bfd peers
Вывод покажет состояние Up и время последнего обнаружения. BFD работает на уровне интерфейса, поэтому убедитесь, что файрвол не блокирует BFD-пакеты (порт 3784 UDP для single-hop).
Балансировка трафика через несколько BGP-сессий
FRR поддерживает ECMP (Equal-Cost Multi-Path) - балансировку трафика между несколькими путями с одинаковой метрикой. Включите multipath и настройте несколько соседей:
configure terminal
router bgp 65001
bgp bestpath as-path multipath-relax
maximum-paths 4
maximum-paths ibgp 4
neighbor 192.0.2.1 remote-as 65002
neighbor 192.0.2.1 description Provider-A
neighbor 198.51.100.1 remote-as 65003
neighbor 198.51.100.1 description Provider-B
exit
write memory
Параметр bgp bestpath as-path multipath-relax разрешает использовать пути с разными AS-PATH для балансировки - без него ECMP работает только для маршрутов с идентичным AS-PATH. Балансировка на уровне ядра Linux использует хэширование по src/dst IP и портам, что даёт хорошее распределение для разнообразного трафика.
Для более сложных сценариев с несколькими провайдерами и управлением входящим трафиком через local-preference и MED изучите полное руководство по Multi-homing с FRR.
Graceful Restart
Graceful Restart позволяет bgpd перезапуститься без разрыва BGP-сессий и потери маршрутов. Сосед, поддерживающий эту функцию, продолжит пересылать трафик, пока демон восстанавливается. Включение:
configure terminal
router bgp 65001
bgp graceful-restart
exit
write memory
Диагностика и мониторинг BGP в FRR
Без систематической диагностики BGP-сессия, упавшая в три часа ночи, превращается в инцидент с долгим временем восстановления. Набор команд vtysh и анализ логов - ваш основной инструментарий.
Основные команды для проверки состояния BGP
| Команда | Что показывает |
|---|---|
show bgp summary |
Общая сводка: число соседей, состояние сессий, количество полученных префиксов от каждого соседа |
show ip bgp |
Таблица BGP-маршрутов: префиксы, next-hop, AS-PATH, local-preference |
show ip bgp neighbors 192.0.2.1 |
Детальная информация о конкретном соседе: таймеры, количество отправленных/полученных префиксов, ошибки |
show ip bgp neighbors 192.0.2.1 advertised-routes |
Префиксы, которые вы анонсируете этому соседу |
show ip bgp neighbors 192.0.2.1 received-routes |
Префиксы, полученные от этого соседа, до применения фильтров |
show bgp ipv4 unicast |
Полная таблица IPv4-маршрутов BGP |
Типовые ошибки и их решение
Состояние соседа Idle или Active. Сессия не устанавливается. Причины:
- Неверный ASN в
remote-as- проверьте, совпадает ли он с реальным ASN провайдера. - IP-адрес соседа недоступен - проверьте связность через
pingи убедитесь, что маршрут до соседа есть в таблице ядра (ip route). - Файрвол блокирует TCP-порт 179 - BGP использует этот порт для установления сессии. Проверьте правила iptables/nftables.
Маршрут не появляется в таблице BGP. Вы выполнили network 203.0.113.0/24, но префикс не анонсируется. Причина: BGP анонсирует только те сети, которые уже присутствуют в таблице маршрутизации ядра (IGP-маршрут). Добавьте статический маршрут или интерфейс с этим IP:
ip addr add 203.0.113.1/24 dev lo
ip route add 203.0.113.0/24 dev lo
Логи FRR. Файл /var/log/frr/bgpd.log содержит детальные записи о событиях BGP. При проблемах с сессией ищите строки с NOTIFICATION или error - они укажут точную причину разрыва.
Для комплексного мониторинга с Prometheus и Grafana используйте руководство по диагностике и мониторингу динамической маршрутизации.
Интеграция BGP с другими сервисами: файрвол и резервирование шлюза
BGP на Linux не работает в изоляции. Файрвол должен пропускать BGP-трафик, а для высокой доступности шлюза по умолчанию BGP объединяется с VRRP через keepalived.
Настройка файрвола для BGP
BGP использует TCP-порт 179. Если на сервере активен iptables или nftables, добавьте разрешающие правила. Для iptables:
iptables -A INPUT -p tcp --dport 179 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 179 -j ACCEPT
Для nftables:
nft add rule inet filter input tcp dport 179 accept
nft add rule inet filter output tcp sport 179 accept
Если используете BFD, добавьте также UDP-порт 3784 для single-hop BFD.
Резервирование шлюза с keepalived и BGP
Сценарий: два сервера Linux анонсируют один и тот же префикс через BGP разным провайдерам. Для клиентов внутри сети они выступают как шлюз по умолчанию через виртуальный IP (VIP), управляемый keepalived. Сервер с активным VIP анонсирует префикс с более высоким local-preference, привлекая входящий трафик. При отказе активного сервера VIP переезжает на резервный, и тот начинает анонсировать префикс с лучшей метрикой.
Конфигурация keepalived (/etc/keepalived/keepalived.conf) для VRRP:
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
virtual_ipaddress {
10.0.0.1/24
}
}
На резервном сервере измените state на BACKUP и priority на 50. В конфигурации BGP используйте route-map, который назначает local-preference в зависимости от наличия VIP (keepalived может вызывать скрипт при смене состояния).
Если вы строите распределённую инфраструктуру с BGP и Anycast, обратитесь к руководству по глобальной отказоустойчивости сервисов.
Автоматизация управления конфигурацией FRR
Ручная настройка BGP на десятках серверов - источник ошибок и расхождений в конфигурациях. FRR поддерживает автоматизацию через два механизма: пакетный режим vtysh и системы управления конфигурацией вроде Ansible.
Команда vtysh -c выполняет одиночную команду без входа в интерактивный режим. Это позволяет писать скрипты настройки:
vtysh -c "configure terminal" -c "router bgp 65001" -c "neighbor 192.0.2.1 remote-as 65002" -c "write memory"
Для массового развертывания создайте Ansible-роль с шаблоном frr.conf.j2, подставляющим переменные (ASN, IP соседей, префиксы) из инвентаря. Шаблон генерирует полную конфигурацию FRR, которая копируется на целевые хосты с последующей перезагрузкой службы. Такой подход гарантирует идентичность конфигураций и упрощает аудит изменений через систему контроля версий.
Если вы разворачиваете программный маршрутизатор на Linux с нуля, включая BGP, OSPF, DHCP и DNS, используйте пошаговое руководство по созданию enterprise-маршрутизатора на Debian/Ubuntu.
Для проектов, требующих облачной инфраструктуры под BGP-роутеры, Timeweb Cloud предоставляет VDS и выделенные серверы с гибким масштабированием ресурсов. А если вы создаёте сайт для документирования сетевой инфраструктуры, сервис автоматической генерации SEO-сайтов поможет быстро запустить каталог с описанием ваших услуг.