Теория: Перераспределение маршрутов между протоколами
Как сшить OSPF, BGP и статику в одну сеть и не устроить петлю: административная дистанция, метрика заново, типы E1 и E2, метки против обратного заноса и фильтры, без которых redistribute писать не стоит. Прочитайте материал, а затем пройдите тест — следующий пункт курса откроется после верных ответов.
Зачем сшивать протоколы между собой
Каждый протокол ведёт свою собственную базу и про соседние не знает ничего. OSPF не видит маршрутов BGP, BGP не видит статики. Чтобы маршруты перешли из одной базы в другую, нужен роутер, который стоит на стыке и явно скажет: «всё, что я знаю оттуда, объявляй здесь». Это и есть перераспределение (redistribution).
Настраивается оно одной строкой, и именно поэтому тема опасная: команда простая, а последствия — самые тяжёлые в курсе. Большинство аварий уровня «сеть работала годами и вдруг легла целиком» начинались с одной такой строки.
Административная дистанция: кто победит, если маршрут пришёл дважды
connected 0 static 1 eBGP 20 OSPF 110 IS-IS 115 RIP 120 iBGP 200Обратите внимание на строку eBGP — 20, она стоит выше OSPF. Это выглядит безобидно ровно до раздела про петли: маршрут, вернувшийся из BGP, вытеснит родной маршрут OSPF просто потому, что источнику больше доверия. Здесь начинаются самые запутанные аварии перераспределения.
Дистанция — величина локальная. Она нигде не передаётся, живёт в пределах одного роутера и меняется вручную, если стандартный порядок доверия не подходит.
Метрика не переносится — её назначают заново
Это называют начальной метрикой (seed metric). При вносе в OSPF по умолчанию здесь ставится
20, и все внешние маршруты становятся равнозначными: и соседняя подсеть, и сеть на другом конце страны получают одну и ту же цифру.Последствие практическое. Если внешние маршруты вносят две разные точки стыка, а метрика у обеих одинаковая, выбор между ними будет определяться уже не близостью, а внутренней метрикой до ASBR — и то не всегда. Разумная привычка: задавать метрику руками, осмысленно разводя точки входа.
Внешние маршруты в OSPF: E1 против E2
• E2 (по умолчанию) — метрика не растёт при движении по домену. Сколько назначил ASBR, столько все и видят, хоть в соседней стойке, хоть за десятью хопами. Смысл: метрика внешнего мира важнее внутренних расстояний.
• E1 — к внешней метрике прибавляется внутренний cost до ASBR. Чем дальше от точки входа, тем дороже.
Разница проявляется, когда одну и ту же внешнюю сеть вносят несколько ASBR. С E2 все роутеры домена видят одинаковую метрику и выбирают точку входа не по близости — трафик может уехать через дальний стык при живом соседнем. С E1 каждый роутер выберет ближайший ASBR, потому что расстояние до него входит в метрику.
Отсюда правило: один ASBR — оставляйте E2, он проще. Несколько точек входа в одну и ту же внешнюю сеть — берите E1, иначе трафик пойдёт неочевидными путями.
Тип маршрута видно в
show ip ospf route: N E1 или N E2 в начале строки. А вот в общей таблице show ip route всем маршрутам OSPF пишется одна буква O — без деления на внешние и межобластные, в отличие от Cisco IOS. Ищете тип — идите в таблицу протокола.Самый частый случай: connected и static
redistribute connected нужен, когда часть интерфейсов не попала под network-команды протокола. Тонкость: этой командой уходят все connected-сети сразу, включая управляющие и служебные, которые светить в сеть незачем. Фильтр здесь нужен почти всегда.redistribute static вносит прописанное руками. Обычно это маршруты к оборудованию, которое не умеет динамику.Отдельный случай — маршрут по умолчанию. Через
redistribute static он не уходит: для него есть своя команда default-information originate. Ключ always заставляет объявлять умолчание даже когда его нет у самого роутера — и это отличный способ построить чёрную дыру, куда домен будет исправно слать трафик в никуда. Без always объявление исчезает вместе с маршрутом, и сеть узнаёт об аварии, а не глотает её.Между OSPF и BGP
network. Причина простая — redistribute ospf отдаст наружу всё, что появится в OSPF, включая то, что появится там завтра и о чём никто не подумает. Явный список меняется только руками.Из BGP в OSPF — вносим маршруты интернета внутрь. Так делать не надо почти никогда: полная таблица BGP — это сотни тысяч префиксов, и OSPF от них ляжет вместе с роутерами. Внутрь отдают маршрут по умолчанию, и этого достаточно: пусть внутренние роутеры знают одно — «всё незнакомое неси на границу».
Осмысленный случай для BGP→OSPF — это когда внутрь нужно занести несколько конкретных префиксов, например сети партнёра. Тогда это делается с обязательным фильтром по списку, а не целиком.
Петля перераспределения — главная авария темы
1. Сеть
10.1.0.0/24 живёт в нашем OSPF.2. Роутер A вносит её в BGP и отдаёт партнёру.
3. У партнёра на эту сеть с давних пор прописан статический маршрут, и он его тоже перераспределяет. Наша сеть возвращается к нам уже его анонсом: в AS_PATH стоит только его номер, нашего там нет.
4. Роутер B получает её по eBGP. Теперь у него два источника: родной OSPF с дистанцией 110 и eBGP с дистанцией 20.
5. Побеждает BGP. Роутер B начинает слать трафик к сети, которая на самом деле у него за спиной, — в сторону границы. А партнёр по своему статическому маршруту шлёт его обратно. Пакеты ходят между границей и партнёром, пока не кончится TTL.
Обратите внимание на третий шаг — в нём вся суть. Простой отскок BGP отбил бы сам: увидев собственный номер AS в пути, роутер молча выбрасывает маршрут. Именно поэтому анонс, ушедший от нас и вернувшийся к нам же, обычно не опасен. Но здесь маршрут не вернулся, а родился заново у партнёра — нашего номера в пути нет, и встроенная защита молчит.
Симптом со стороны выглядит бессмысленно: «соседняя подсеть недоступна, а интернет работает».
Лечится это не отключением перераспределения, а фильтрами — по одному на каждое направление:
• На вход: свои собственные префиксы снаружи не принимаем никогда. Никакой правильный анонс не принесёт нам нашу же сеть — значит это либо чужая ошибка, либо чужой злой умысел. Один
prefix-list с deny на свои сети закрывает всю эту историю целиком, и ставить его надо на обеих границах: одна незакрытая — и дыра остаётся.• На выход: отдаём только перечисленное явно, а не всё, что оказалось в протоколе.
Метка (tag) — защита там, где номеров AS нет
route-map TO-RIP permit 10 match ip address prefix-list LAN set tag 100 # помечаем всё, что вынесли наружу route-map TO-OSPF deny 5 match tag 100 # помеченное обратно не пускаем route-map TO-OSPF permit 10Метка едет вместе с маршрутом и не требует вести списки сетей: добавится новая подсеть — защита сработает и для неё. Тем и хороша по сравнению со списком префиксов, который придётся дописывать руками при каждом изменении.
Route-map на перераспределении
redistribute:ip prefix-list LAN seq 5 permit 192.168.0.0/16 le 24 route-map TO-OSPF permit 10 match ip address prefix-list LAN set metric 100 set metric-type type-1 set tag 100 router ospf redistribute static route-map TO-OSPFЗдесь одной картой сделано сразу четыре вещи: отобраны нужные сети, задана осмысленная метрика, выбран тип E1 и поставлена метка для защиты от обратного заноса.
Ловушка та же, что и в BGP: неявный deny в конце. На перераспределении он даже удобен — карта работает как белый список, и всё, что не перечислено, не уходит. Но если вы рассчитывали на «пропустить остальное», добавляйте пустое
permit последним правилом.Хорошая привычка: никогда не писать голый
redistribute без route-map. Секунда экономии сейчас против вечера отладки потом.Что здесь ломается
Двустороннее перераспределение на двух точках стыка. Петля из предыдущего раздела. Самая дорогая ошибка темы.
Забыли, что дистанция eBGP меньше, чем у OSPF. Родной маршрут молча вытесняется чужим, трафик идёт в обратную сторону.
default-information originate always без оснований. Домен получает умолчание к роутеру, у которого выхода нет. Чёрная дыра, которую не видно ни в одном протоколе.Умолчание пытались внести через
redistribute static. Не уходит: для маршрута по умолчанию нужна отдельная команда.Одинаковая метрика с двух ASBR при типе E2. Домен выбирает точку входа не по близости, трафик уезжает через дальний стык.
Полная таблица BGP, внесённая в OSPF. Кладёт домен целиком. Внутрь отдают умолчание, а не интернет.
Как проверять
show ip route — начинать здесь. Буква в начале строки говорит, какой протокол принёс маршрут, скобки вида [110/20] — это дистанция и метрика. Тип внешнего маршрута тут не пишется: все маршруты OSPF помечены одной буквой O.show ip ospf route — таблица глазами OSPF, и уже здесь видно N E1 или N E2: внешний маршрут и его тип.show ip route 10.1.0.0 — подробности по конкретной сети: источник, дистанция, метрика, next-hop, время в таблице. Первая команда при разборе «почему выбрался не тот маршрут».show ip ospf database external — что именно ASBR внёс в домен и с какой метрикой. Если сети здесь нет — перераспределение не сработало, искать надо на самом ASBR, а не по сети.show ip ospf border-routers — кто вообще выступает ASBR. Лишний ASBR в этом списке — частая разгадка внезапной петли.show route-map TO-OSPF — сработали ли правила. Счётчик 0 означает, что match не совпал ни с чем и уходит либо всё, либо ничего.И общий приём: перераспределение проверяют с обеих сторон. Ушло из одного протокола — не значит пришло во второй.
Команды — шпаргалка
# в OSPF: connected, static, BGP
router ospf
redistribute connected route-map TO-OSPF
# первое слово — ОТКУДА берём маршруты;
# route-map с именем — через какой фильтр
redistribute static metric 100 metric-type 1
# metric — стартовая стоимость для чужих
# маршрутов; metric-type 1 (E1) складывает её
# с ценой пути внутри OSPF, 2 (E2) — нет
default-information originate # объявить маршрут по умолчанию отдельной
# командой: redistribute его не переносит
default-information originate always
# always — объявлять, даже если своего выхода
# наружу нет. Опасно: соберёте чужой трафик в
# тупик
# в BGP
router bgp 65001 # число — номер своей AS
redistribute ospf route-map TO-BGP # откуда брать и через какой фильтр
redistribute static
network 192.168.14.0/24 # обычно лучше перечислить сети явно, чем
# заливать их пачкой через redistribute
# фильтр и метка против обратного заноса
ip prefix-list LAN seq 5 permit 192.168.0.0/16 le 24
# seq — номер строки; le 24 — «маска не длиннее
# /24»: пустит /16…/24 и отсечёт мелочь
route-map TO-OSPF permit 10 # имя, действие, номер строки
match ip address prefix-list LAN # условие: какие префиксы подпадают
set metric 100 # что сделать с подошедшими: задать стоимость,
set metric-type type-1 # тип метрики
set tag 100 # и повесить метку-число, невидимую для сети,
# но заметную нашим же фильтрам
route-map TO-BGP deny 5 # deny — отбросить то, что совпало
match tag 100 # совпадение по метке: маршрут пришёл из BGP —
# обратно в BGP не пустим
route-map TO-BGP permit 10
match ip address prefix-list LAN
# поменять доверие к источнику
router bgp 65001
distance bgp 200 200 200 # три числа — административная дистанция для
# маршрутов eBGP, iBGP и локальных. Чем больше,
# тем менее охотно маршрут попадёт в таблицу
# проверка
show ip route # итоговая таблица со всеми источниками
show ip route 10.1.0.0 # подробности по одному маршруту: откуда, метрика
show ip ospf database external # внешние LSA: что мы сами занесли в OSPF
show ip ospf border-routers # где находятся ABR и ASBR
show route-map TO-OSPF # текст политики и счётчики совпаденийДальше — лабораторная работа «Redistribution: сшей OSPF с BGP и не устрой петлю»
Для неё нужен аккаунт: стенд поднимается персонально под вас — свои роутеры, свои конфиги, никто в них не мешает. Регистрация — почта и пароль.
Теория прочитана. Дальше — руками.
Личный стенд из настоящих роутеров разворачивается за секунды. Платформа проверяет не ответы на тесты, а состояние вашей сети: поднялись ли соседства, сошлись ли маршруты, ходит ли ping. Рядом — AI-наставник, который видит ваши конфиги и ведёт к решению, не выдавая готовое.