Files
poc-frr-anycast/docs/2026-09-10-bgp-outbound-filter-plan.md
ayurishchevandClaude Sonnet 5 804fee4ffa Fix BGP route leak: mandatory outbound prefix-filter on every neighbor
Prod-инцидент: FRR реэкспортировал входящий 10.0.0.0/8 обратно
eBGP-соседям. Причина — ни у одного соседа не было outbound-фильтра
(no bgp ebgp-requires-policy отключал защиту FRR, единственный
route-map RM-PREPEND-OUT permit-all фильтрации не делал).

frr.conf.j2: добавлен ip prefix-list PL-ANYCAST-OUT (permit только
anycast_prefix) и route-map RM-OUT / RM-OUT-PREPEND (фильтр, либо
фильтр+prepend), оба с явным deny в конце. Назначены outbound на
ВСЕХ соседей без исключения — наружу теперь уходит исключительно
анонсируемый anycast-префикс, что бы ни попало в локальную
BGP-таблицу от других соседей.

Уязвимость структурная (в общей роли), поэтому фикс задел и
площадку A — golden-файлы frr/a{1,2,3}/frr.conf синхронизированы
с новым рендером (намеренно, не регресс). no bgp ebgp-requires-policy
сознательно не тронут — его включение требует ещё inbound-policy на
каждого соседа, отдельная задача.

render-check.sh 6/6, render-check-cloud.sh 84/84 (включая nft -c).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Bc3HkMiDwooSyLBLoMKNyF
2026-09-10 17:57:51 +03:00

2.6 KiB
Raw Permalink Blame History

План внедрения: outbound-фильтр BGP (устранение утечки 10.0.0.0/8)

Дата: 2026-09-10

Проблема

В PROD (окружение site-cloud) FRR реэкспортировал входящий маршрут 10.0.0.0/8 обратно соседям. Причина: ни у одного BGP-соседа не было outbound-фильтра — no bgp ebgp-requires-policy отключает защитный механизм FRR, а единственный существующий route-map (RM-PREPEND-OUT, только на резервном канале) фильтрации не делал (permit 10 без match). Роутеры многодомны в 2 разных внешних AS без изоляции — любой маршрут в BGP-таблице реэкспортировался всем eBGP-соседям (классический непреднамеренный transit/route-leak).

Решение

frr.conf.j2 (общий для всех окружений, включая площадку A — та же уязвимость структурно применима и там):

  • ip prefix-list PL-ANYCAST-OUT permit <anycast_prefix>.
  • route-map RM-OUT (filter-only) и route-map RM-OUT-PREPEND (filter + prepend, рендерится только если есть соседи с prepend: true) — оба матчат PL-ANYCAST-OUT, оба заканчиваются явным deny 20.
  • neighbor ... route-map out теперь навешан на всех соседей без исключения: RM-OUT-PREPEND для prepend: true, RM-OUT для остальных.
  • no bgp ebgp-requires-policy сознательно не убран — иначе FRR перестанет принимать вообще все inbound-маршруты без явной inbound-policy (отдельная задача, не входит в текущий фикс).

Golden-файлы площадки A (frr/a{1,2,3}/frr.conf) обновлены под новый рендер — это намеренное изменение (тот же класс уязвимости актуален и для Docker-лабы), а не регресс.

Definition of done

  • render-check.sh (площадка A) — совпадает с обновлёнными golden-файлами.
  • render-check-cloud.sh — фильтр применён на всех 4 узлах, prepend — только на резервных соседях, RM-OUT/RM-OUT-PREPEND синтаксически корректны.
  • README и summary обновлены.