NetLab Academy

Сетевые лаборатории в браузере

Войти Начать бесплатно

Теория: Перераспределение маршрутов между протоколами

Как сшить OSPF, BGP и статику в одну сеть и не устроить петлю: административная дистанция, метрика заново, типы E1 и E2, метки против обратного заноса и фильтры, без которых redistribute писать не стоит. Прочитайте материал, а затем пройдите тест — следующий пункт курса откроется после верных ответов.

Зачем сшивать протоколы между собой

В учебной сети протокол один. В настоящей их почти всегда несколько, и причины у этого скучные, а не архитектурные: купили компанию с чужой сетью, провайдер отдаёт маршруты только по BGP, на площадке стоит железка, которая умеет один OSPF, а часть сетей вообще прописана статикой и переписывать её некогда.

Каждый протокол ведёт свою собственную базу и про соседние не знает ничего. OSPF не видит маршрутов BGP, BGP не видит статики. Чтобы маршруты перешли из одной базы в другую, нужен роутер, который стоит на стыке и явно скажет: «всё, что я знаю оттуда, объявляй здесь». Это и есть перераспределение (redistribution).

Настраивается оно одной строкой, и именно поэтому тема опасная: команда простая, а последствия — самые тяжёлые в курсе. Большинство аварий уровня «сеть работала годами и вдруг легла целиком» начинались с одной такой строки.

Административная дистанция: кто победит, если маршрут пришёл дважды

Как только протоколов больше одного, до одной и той же сети роутер может узнать двумя путями. Метрики сравнивать бессмысленно: cost 30 у OSPF и три перехода AS у BGP — величины из разных вселенных. Поэтому сначала сравнивается административная дистанция: насколько вообще доверяем источнику. Меньше — доверяем больше.

connected      0
static         1
eBGP          20
OSPF         110
IS-IS        115
RIP          120
iBGP         200
Обратите внимание на строку eBGP — 20, она стоит выше OSPF. Это выглядит безобидно ровно до раздела про петли: маршрут, вернувшийся из BGP, вытеснит родной маршрут OSPF просто потому, что источнику больше доверия. Здесь начинаются самые запутанные аварии перераспределения.

Дистанция — величина локальная. Она нигде не передаётся, живёт в пределах одного роутера и меняется вручную, если стандартный порядок доверия не подходит.

Метрика не переносится — её назначают заново

У OSPF метрика — cost, обратно пропорциональный полосе. У RIP — число переходов, максимум 15. У BGP метрики в привычном смысле нет вовсе, есть набор атрибутов. Перевести одно в другое невозможно, поэтому при перераспределении метрика не конвертируется, а назначается заново — одинаковая для всех пришедших маршрутов.

Это называют начальной метрикой (seed metric). При вносе в OSPF по умолчанию здесь ставится 20, и все внешние маршруты становятся равнозначными: и соседняя подсеть, и сеть на другом конце страны получают одну и ту же цифру.

Последствие практическое. Если внешние маршруты вносят две разные точки стыка, а метрика у обеих одинаковая, выбор между ними будет определяться уже не близостью, а внутренней метрикой до ASBR — и то не всегда. Разумная привычка: задавать метрику руками, осмысленно разводя точки входа.

Внешние маршруты в OSPF: E1 против E2

OSPF помечает всё принесённое снаружи как внешний маршрут и различает два типа, которые ведут себя по-разному:

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

Из OSPF в BGP — вносим свои внутренние сети в объявления наружу. Работает, но так почти не делают: в BGP предпочитают перечислять свои сети явно, командами network. Причина простая — redistribute ospf отдаст наружу всё, что появится в OSPF, включая то, что появится там завтра и о чём никто не подумает. Явный список меняется только руками.

Из BGP в OSPF — вносим маршруты интернета внутрь. Так делать не надо почти никогда: полная таблица BGP — это сотни тысяч префиксов, и OSPF от них ляжет вместе с роутерами. Внутрь отдают маршрут по умолчанию, и этого достаточно: пусть внутренние роутеры знают одно — «всё незнакомое неси на границу».

Осмысленный случай для BGP→OSPF — это когда внутрь нужно занести несколько конкретных префиксов, например сети партнёра. Тогда это делается с обязательным фильтром по списку, а не целиком.

Петля перераспределения — главная авария темы

Схема, которая ломает сети. Две точки стыка нашего 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 на свои сети закрывает всю эту историю целиком, и ставить его надо на обеих границах: одна незакрытая — и дыра остаётся.
На выход: отдаём только перечисленное явно, а не всё, что оказалось в протоколе.
Как своя же сеть возвращается чужим маршрутом и разворачивает трафик
10.1.0.0/24сеть в нашем OSPF
роутер Aпервый стык
AS 65100партнёр · своя статика на нашу сеть
роутер Bвторой стык, тоже наш
что роутер B знает про 10.1.0.0/24
Ни один протокол здесь не сломался: OSPF отдал маршрут, партнёр объявил свой, роутер выбрал источник с меньшей дистанцией — каждый сделал ровно то, что должен. Поэтому такие аварии и ищут долго: искать нечего, всё работает как задумано.

Метка (tag) — защита там, где номеров AS нет

На границе с BGP от обратного заноса защищает фильтр по префиксам: номера AS дают понять, чей маршрут откуда пришёл. А вот между двумя IGP — OSPF и RIP, например — номеров 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 на перераспределении

Тот же механизм, что и в политиках BGP, только применяется не к соседу, а к команде 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. Секунда экономии сейчас против вечера отладки потом.

Что здесь ломается

Голый redistribute без фильтра. Уходит всё, включая служебные и управляющие сети. Работает — до первой лишней сети, попавшей туда, где её быть не должно.

Двустороннее перераспределение на двух точках стыка. Петля из предыдущего раздела. Самая дорогая ошибка темы.

Забыли, что дистанция 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-наставник, который видит ваши конфиги и ведёт к решению, не выдавая готовое.

Начать бесплатно → бета открыта, доступ бесплатный