Дублирование локальных маршрутов в FRR: последствия
Что вызывает дубли локальных маршрутов в FRR v10.5, проблемы с RIB/FIB, нагрузка на zebra, потеря пакетов. Диагностика show ip route, обходные пути и фиксы из баг-репорта GitHub.
К чему может привести дублирование локальных маршрутов в FRR (версия 10.5)?
Пример вывода команды show ip route с дубликатами маршрутов:
Codes: K - kernel route, C - connected, L - local, S - static,
R - RIP, O - OSPF, I - IS-IS, B - BGP, E - EIGRP, N - NHRP,
T - Table, v - VNC, V - VNC-Direct, A - Babel, F - PBR,
f - OpenFabric, t - Table-Direct,
> - selected route, * - FIB route, q - queued, r - rejected, b - backup
t - trapped, o - offload failure
IPv4 unicast VRF default:
S>* 172.30.240.0/24 [1/0] unreachable (blackhole), weight 1, 05:48:42
O 172.30.240.1/32 [110/10] via 0.0.0.0, null0 onlink, rmapsrc 172.30.240.1, weight 1, 05:48:42
L * 172.30.240.1/32 is directly connected, null0, weight 1, 05:48:43
C>* 172.30.240.1/32 is directly connected, null0, weight 1, 05:48:43
O>* 172.30.240.2/32 [110/10] via 192.168.100.2, rtr-br0, rmapsrc 172.30.240.1, weight 1, 05:39:27
O>* 172.30.240.3/32 [110/10] via 192.168.100.5, rtr-br0, rmapsrc 172.30.240.1, weight 1, 05:43:20
O>* 172.30.240.4/32 [110/10] via 192.168.100.3, rtr-br0, rmapsrc 172.30.240.1, weight 1, 00:12:31
O>* 172.30.240.5/32 [110/10] via 192.168.100.6, rtr-br0, rmapsrc 172.30.240.1, weight 1, 05:43:11
L * 192.168.5.1/32 is directly connected, test0, weight 1, 00:00:25
C * 192.168.5.1/32 is directly connected, test0, weight 1, 00:00:25
L * 192.168.5.1/32 is directly connected, test0, weight 1, 00:07:13
L * 192.168.5.1/32 is directly connected, test0, weight 1, 00:07:27
L>* 192.168.5.1/32 is directly connected, test0, weight 1, 00:07:53
C>* 192.168.100.0/24 is directly connected, rtr-br0, weight 1, 05:44:02
O 192.168.100.0/24 [110/10] is directly connected, rtr-br0, weight 1, 05:48:42
L * 192.168.100.1/32 is directly connected, rtr-br0, weight 1, 05:44:02
L>* 192.168.100.1/32 is directly connected, rtr-br0, weight 1, 05:48:43
Связанный баг-репорт: https://github.com/FRRouting/frr/issues/20337
Какие потенциальные проблемы, нестабильность или последствия может вызвать такая дублировка маршрутов (например, множественные L* и C* для 172.30.240.1/32 и 192.168.5.1/32), если FRR работает в этом режиме круглый год?
Дублирование локальных маршрутов в FRR (v10.5) — это не просто визуальный мусор в выводе show ip route: оно может вызвать флуктуации RIB/FIB, усиленную нагрузку на zebra и ядро Linux, а в ряде случаев — потерю пакетов или асимметричную доставку трафика. В описанном баге FRR повторно добавляет локальные записи при изменении параметров интерфейса (например, MAC), из‑за чего появляются множественные L* и C* для одного префикса (см. баг‑репорт). Если такое состояние будет поддерживаться годами, вероятны хроническая деградация производительности, шум в мониторинге и риск неправильной рекламы маршрутов по протоколам.
Содержание
- Почему появляются дубликаты локальных маршрутов в FRR (v10.5)
- Какие проблемы и последствия вызывает дублирование локальных маршрутов в FRR
- Как дублирование проявляется в выводе show ip route и в ядре Linux
- Диагностика: команды и шаги для выявления причины
- Рекомендации: краткосрочные обходы и долгосрочные решения
- Практические сигнатуры мониторинга и автоматизация детектирования
- Источники
- Заключение
Почему появляются дубликаты локальных маршрутов в FRR (v10.5)
В приведённом примере и в баг‑репорте описан сценарий: при изменении параметров сетевого интерфейса (часто — MAC‑адреса) FRRouting заново регистрирует локальные маршруты для IP‑адресов интерфейса, не удаляя предыдущие записи. Иными словами, zebra/netlink‑обработка создаёт повторные записи L (local) и C (connected) для одного и того же префикса вместо корректной замены/обновления. Подробности и обсуждение см. в баг‑репорте на GitHub: https://github.com/FRRouting/frr/issues/20337.
Технически причина связана с тем, как FRR синхронизирует свою RIB с таблицами ядра через netlink: дублированные или неправильно обработанные уведомления приводят к «дубликатам» на уровне RIB/RIB‑печати.
Какие проблемы и последствия вызывает дублирование локальных маршрутов в FRR
Ниже — конкретные потенциальные последствия, которые могут возникнуть при круглогодичной эксплуатации FRR в состоянии с дубликатами.
-
Повышенная загрузка контрольной плоскости и CPU zebra
-
Частые повторные операции добавления/удаления маршрутов приводят к росту числа netlink‑событий. zebra обрабатывает больше сообщений, растёт загрузка CPU, особенно на узлах с большим количеством интерфейсов или адресов.
-
Флуктуации RIB ↔ FIB и кратковременные разрывы трафика
-
Дубликаты в RIB могут не синхронизироваться с FIB ожидаемо; в результате выбранный для форвардинга маршрут может периодически меняться — пакеты теряются или соединения сбрасываются.
-
Чёрные дыры и некорректная реклама маршрутов
-
Как в вашем примере, может появиться статический/blackhole маршрут (S unreachable) или неправильная интерпретация next‑hop при экспорте в OSPF/BGP (в выводе видно rmapsrc). Это приведёт к недоступности подсетей локально или у соседей.
-
Асимметрия маршрутизации и потеря сессий
-
Когда разные записи предлагают разные интерфейсы/next‑hop, пакеты могут уходить через один путь, а возвращаться — по другому, что ломает stateful‑сервисы (NAT, TCP).
-
Насыщение netlink / потеря обновлений
-
При большом количестве повторений netlink‑очереди могут переполняться; часть событий будет отброшена, что ухудшит согласованность между ядром и FRR.
-
Увеличение объёма логов и ложные срабатывания мониторинга
-
Автоматика (скрипты, средства мониторинга) начнёт генерировать оповещения на каждый «флэп» — оператор теряет сигнал среди шума.
-
Возможное накопление внутренних структур или утечки памяти (в худшем случае)
-
Если баг приводит к удержанию старых описателей маршрутов в памяти zebra, со временем может быть деградация памяти/ресурсов.
Заметьте: степень проявления зависит от интенсивности изменений интерфейсов и от количества таких префиксов в сети. Однократные дубликаты — не катастрофа; постоянные повторения — проблема.
Как дублирование проявляется в выводе show ip route и в ядре Linux
В выводе команды FRR вы увидите множественные строки с тем же префиксом, помеченные как L (local) и C (connected). Примерно так, как в вашем логе: несколько L * 192.168.5.1/32 и C * 192.168.5.1/32 с разными временными метками.
Что смотреть:
- Знаки и метки: L — local, C — connected;
*обычно помечает FIB‑запись (маршрут, установленный в ядре);>*— выбранный маршрут. Легенда в вашем выводе поясняет это. - Временные метки: разные timestamps показывают моменты создания/обновления записей — помогает понять частоту события.
ip route show table local— покажет локальные маршруты в таблице ядра (table local). Сравните сvtysh -c "show ip route".
Практический контроль:
- Если в выводе FRR много одинаковых строк, но в
ip route show table localядра видна только одна «реальная» запись — значит проблема в RIB/отображении или в синхронизации; если и в ядре появляются дубли, тогда kernel‑уровень тоже засорён.
Диагностика: команды и шаги для выявления причины
Пошаговый подход — от быстрого обнаружения до корневого анализа.
- Быстрая проверка дубликатов
vtysh -c "show ip route 192.168.5.1/32"
ip -4 route show table local | grep "192.168.5.1"
- Наблюдение netlink / link‑событий в реальном времени
# следим за изменениями маршрутов/локальных записей
ip monitor route
# следим за изменениями link/MAC
ip monitor link
- Просмотр логов FRR / zebra
journalctl -u frr -f
# или
tail -F /var/log/frr/zebra.log
- Корреляция с изменениями интерфейса
ip -o link show dev test0
ip -4 addr show dev test0
dmesg | grep -i link
Сверьте времена из show ip route и моменты изменения MAC/интерфейса: совпадают ли они? Если да — это подтверждает сценарий из баг‑репорта: https://github.com/FRRouting/frr/issues/20337.
- Глубже — мониторинг netlink‑пакетов (для опытных)
- Используйте
strace/perfна процессе zebra, снимите логи netlink, соберите отладочные сообщения для разработчиков FRR, если нужно.
- Проверка окружения
- Провайдер виртуализации/обёртки сети: миграции ВМ, hot‑plug, мультикаст‑агенты, cloud‑агенты могут менять MAC/интерфейс. Отключите/исследуйте такие процессы.
Рекомендации: краткосрочные обходы и долгосрочные решения
Краткосрочно (оперативно, пока ищете исправление):
- Вручную очистите ситуацию в контролируемое окно обслуживания:
- Перезапустите zebra или весь сервис FRR:
systemctl restart frr(или соответствующий для вашей системы). Это снимет временные дубликаты, но приведёт к кратковременной потере маршрутизации — планируйте окно. - При возможности и осторожно — удалить лишние записи в таблице ядра через
ip route del ..., но это рискованно и требует точной проверки. - Включите временное оповещение: скрипт, который считает вхождения префикса в
vtysh -c "show ip route"и шлёт alert при >1.
Долгосрочно (устранение корня):
- Обновление/патч FRR: следите за обсуждением и фиксом в баг‑репорте и примените исправление в версии FRR, где баг закрыт. См. баг на GitHub: https://github.com/FRRouting/frr/issues/20337.
- Искоренение причины изменения интерфейса: устраните источники, которые меняют MAC/параметры (на уровне hypervisor, контейнерной платформы, cloud‑агентов). Стабильные интерфейсы — ключ.
- В тестовой среде прогоните нагрузочные сценарии: имитируйте смену MAC/перезапуски интерфейсов, посмотрите, как FRR ведёт себя после обновления.
- Автоматизация: скрипт‑монитор, который при повторном обнаружении дубликатов либо аккуратно рестартует только zebra, либо уведомляет инженера. Пример простого детектора:
#!/bin/bash
PREFIX="192.168.5.1/32"
CNT=$(vtysh -c "show ip route" | grep -c "$PREFIX")
if [ "$CNT" -gt 1 ]; then
logger "FRR duplicate local routes for $PREFIX: $CNT"
# действие: оповещение, либо (в крайнем случае) перезапуск zebra
fi
- Документируйте процедуру аварийного восстановления и интегрируйте её в runbook.
Важно: перед массовым применением любой автоматизации тщательно протестируйте, чтобы не внести дополнительных рисков.
Практические сигнатуры мониторинга и автоматизация детектирования
Что мониторить:
- Количество записей одного префикса в выводе
show ip route(скрипт/экспортер). - Частота появления netlink‑событий (пик = потенциальный флэп).
- Количество рестартов zebra/frr.
- Рост CPU zebra и общего использования памяти на узле.
- Появление blackhole/неожиданных статических маршрутов в таблице.
Пример идеи для Prometheus (через node textfile exporter):
- Скрипт считает дубликаты и пишет метрику
frr_local_route_duplicates{prefix="192.168.5.1/32"} 2 - Правило алерта: если метрика > 1 более 5 минут → P1 alert.
Такой подход быстро выдаёт сигнал до того, как дубликаты вызовут серьёзные проблемы.
Источники
Заключение
Дублирование локальных маршрутов в FRR (v10.5) — не просто косметическая проблема: при постоянном появлении дубликатов вероятны флуктуации RIB/FIB, рост нагрузки на zebra и ядро, потеря пакетов, асимметрия маршрутизации и шум в мониторинге. Первое — обнаружить и коррелировать события с изменениями интерфейсов (MAC), второе — либо временно очистить/перезапустить сервисы, либо (лучше) применить корректирующий патч/обновление FRR и устранить источник изменения интерфейсов. Наблюдайте за метриками, автоматизируйте детектирование и тестируйте исправления в лаборатории перед продом — так вы минимизируете риск длительной деградации сети.