Bird — свободный демон маршрутизации, который поддерживает BGP, OSPF, RIP, статические маршруты и проверку RPKI. Его используют и в домашних лабораториях, и на границе крупных сетей. В этой статье речь пойдёт только о BGP внутри собственной инфраструктуры: между офисами, филиалами, гипервизорами и маршрутизаторами, которые вам принадлежат. Никаких чужих автономных систем, обхода ограничений и работы с префиксами, на которые у вас нет прав.
Когда BGP действительно нужен
Для двух-трёх подсетей достаточно статических маршрутов: они предсказуемы, не требуют демона и легко читаются. BGP становится оправданным, когда сеть растёт и появляется несколько путей. Типичные сценарии: два офиса с резервным каналом, несколько гипервизоров с плавающими подсетями виртуальных машин, лаборатория с эмуляцией провайдеров или площадка, где маршруты должны переключаться автоматически при отказе линка.
Главное преимущество BGP — не магия, а формальное описание политики: какие префиксы принимать, какие отдавать, какой путь считать лучше. Внутри одной организации это удобнее, чем десятки статических записей, которые забывают обновлять.
Адресация и номера автономных систем
Для внутренней маршрутизации используются частные ASN из диапазона 64512–65534, зарезервированного RFC 6996. Публичный номер нужен только при работе с провайдерами, и его выдают региональные регистраторы. Для примеров и стендов применяйте документационные префиксы 192.0.2.0/24, 198.51.100.0/24 и 203.0.113.0/24 — они не маршрутизируются в интернете и не создают конфликтов.
Различайте eBGP и iBGP. Внешний BGP соединяет разные ASN, внутренний — маршрутизаторы одной ASN. В небольшой сети проще назначить каждому офису свой частный ASN и использовать eBGP: правила проще, а петли видны сразу. iBGP требует полной сетки соседств или route reflector, иначе маршруты не передаются транзитом.
Установка и расположение файлов
В Debian, Ubuntu и производных дистрибутивах пакет называется bird2. Версия 2 использует единый синтаксис с блоками ipv4 и ipv6, поэтому старые конфигурации от Bird 1.6 придётся переписать. Служба запускается через systemd, основной конфиг лежит в /etc/bird/bird.conf, а управление идёт через сокет и утилиту birdc.
sudo apt update
sudo apt install bird2
systemctl status bird2 --no-pager
sudo birdc show status
После правки конфигурации не перезапускайте службу вслепую: сначала проверьте синтаксис командой sudo bird -p -c /etc/bird/bird.conf. Если ошибок нет, примените конфигурацию через sudo birdc configure — это мягкая перезагрузка, при которой существующие сессии по возможности сохраняются.
Минимальная конфигурация
Ниже — рабочий пример для маршрутизатора офиса с адресом 10.10.0.1 и ASN 65001. Сосед 10.10.0.2 принадлежит филиалу с ASN 65002. Блок device включает мониторинг интерфейсов, direct импортирует подключённые сети, kernel синхронизирует таблицу маршрутизации с ядром Linux.
router id 10.10.0.1;
protocol device { }
protocol direct {
ipv4;
interface "eth1";
}
protocol kernel {
ipv4 {
export all;
};
learn;
}
protocol bgp office_filial {
local as 65001;
neighbor 10.10.0.2 as 65002;
ipv4 {
import all;
export all;
};
}
Параметр learn в блоке kernel позволяет Bird принимать маршруты, добавленные в ядро вручную. На практике его лучше отключить, чтобы демон оставался единственным источником истины, а ручные записи не создавали расхождений.
Фильтры префиксов
Отдавать соседу все маршруты без разбора — плохая привычка даже внутри своей сети. Фильтр ограничивает анонсы вашими же подсетями и защищает от случайной утечки маршрута по умолчанию. Запись 10.20.0.0/16{16,24} означает: разрешены префиксы от /16 до /24 внутри этого блока.
filter export_own {
if net ~ [ 10.20.0.0/16{16,24} ] then accept;
reject;
}
protocol bgp office_filial {
local as 65001;
neighbor 10.10.0.2 as 65002;
ipv4 {
import all;
export filter export_own;
};
}
Для входящих маршрутов полезно добавить проверку bogon-префиксов и максимальное число принимаемых записей. В Bird 2 есть параметр import limit 1000 action warn — он не рвёт сессию, но пишет предупреждение, если сосед прислал слишком много. Это спасает от аварии из-за разросшейся таблицы.
Проверка сессии и маршрутов
После применения конфигурации убедитесь, что сессия перешла в состояние Established. Команда show protocols all показывает таймеры, счётчики сообщений и причину последнего разрыва — это первое, что стоит смотреть при проблемах.
sudo birdc show protocols all office_filial
sudo birdc show route
sudo birdc show route all 10.20.0.0/16
sudo birdc show route count
Команда show route выводит лучшие маршруты, show route all — все кандидаты, включая отклонённые фильтром. Если префикс виден в all, но отсутствует в основной таблице, ищите причину в фильтре импорта или в более предпочтительном пути от другого соседа.
Диагностика типовых проблем
Самая частая причина — закрытый TCP-порт 179. Проверьте, слушает ли демон, и посмотрите трафик на интерфейсе. BGP работает поверх TCP, поэтому обычные сетевые инструменты здесь полностью применимы.
sudo ss -tnp | grep :179
sudo tcpdump -ni any tcp port 179 -c 20
sudo journalctl -u bird2 -n 50 --no-pager
sudo birdc show protocols
Если сессия поднимается и сразу падает, сверьте ASN, адреса соседей и версию протокола. Если соединение устанавливается, но маршруты не приходят, проверьте фильтры с обеих сторон и не забывайте, что BGP по умолчанию не анонсирует ничего, пока вы явно это не разрешите.
Отдельный класс проблем — асимметрия и MTU. При инкапсуляции туннелей уменьшайте MTU на интерфейсе и не полагайтесь на фрагментацию. Для BGP это критично: сессия может подняться, но большие обновления будут теряться.
Чек-лист перед вводом в эксплуатацию
- Каждому маршрутизатору назначен уникальный router id и частный ASN.
- Порт 179 открыт только между доверенными адресами, доступ ограничен на уровне фильтра пакетов.
- Экспортные фильтры разрешают только ваши префиксы, импортные — отсекают bogon и лишние анонсы.
- Настроен лимит числа принимаемых маршрутов и оповещение при его приближении.
- Ведётся мониторинг состояния сессий, а не только доступности хостов по ICMP.
- Конфигурация хранится в системе контроля версий, изменения проходят проверку синтаксиса.
Итог
Bird 2 даёт полный контроль над маршрутизацией без проприетарных лицензий и сложных панелей. Начните с двух соседей и жёстких фильтров, проверьте поведение при отключении линка, и только потом расширяйте схему. Главное правило: анонсируйте ровно те префиксы, которыми владеете, и документируйте каждое исключение. Тогда динамическая маршрутизация останется понятной и предсказуемой частью вашей сети.