Настройка BGP-маршрутизации на Linux с FRR: пошаговое руководство | AdminWiki

Настройка BGP-маршрутизации на Linux с FRR: пошаговое руководство

28 июля 2026 11 мин. чтения
Содержание статьи

Что такое 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-сайтов поможет быстро запустить каталог с описанием ваших услуг.

Поделиться:
Сохранить гайд? В закладки браузера