L3 OSPF — визуализированный
OSPF (Open Shortest Path First) — стандарт де-факто динамической маршрутизации внутри enterprise-сетей. Открытый (не привязан к вендору), быстрый, устойчивый к петлям. Если на собеседовании на сетевика спрашивают один протокол глубоко — это почти всегда OSPF. Разберём его так, чтобы ты не зубрил, а понимал, что происходит — с пакетами, состояниями и реальными конфигами.
«Инцидент, 03:20. После ночных работ по включению jumbo frames на ядре филиал „Северный“ потерял все маршруты головного офиса. Роутер филиала видит соседа: show ip ospf neighbor — состояние EXSTART уже 40 минут. Дежурный перезагрузил OSPF-процесс — состояние снова доходит до EXSTART и замирает». Знакомая сетевику картина: соседство «почти поднялось» и застряло. Перезагрузки не помогут — EXSTART-залипание имеет ровно одну типовую причину, и она напрямую связана с ночными работами. Какую — поймёшь из раздела о состояниях соседства, а в плейбуке закроем инцидент за 10 минут вместо 40.
- Идея link-state: каждый роутер строит полную карту сети
- Три таблицы OSPF: соседей, LSDB (карта), маршрутов
- 5 типов пакетов OSPF и как они выглядят «на проводе»
- Hello-протокол: что должно совпасть, чтобы сложилось соседство
- Состояния соседства Down → Full и где они застревают
- Обмен базой: DBD → LSR → LSU → LSAck по шагам
- Типы сетей (broadcast, P2P, NBMA) и зачем DR/BDR
- SPF/Дейкстра — как из карты получается дерево кратчайших путей
- Areas, backbone area 0, ABR/ASBR, типы LSA и типы областей
- Cost-метрика, таймеры, аутентификация, суммаризация
- Полный конфиг multi-area + troubleshooting-флоучарт
- OSPFv3 для IPv6 и мост в DevOps
Link-state против distance-vector: OSPF — link-state, он не верит соседям на слово, а собирает полную карту и считает сам. AD 110: OSPF-маршрут проиграет статике (AD 1), но побьёт RIP (120) — при равной длине префикса. Порядок выбора LPM → AD → метрика никуда не делся: метрикой OSPF станет cost, сумма стоимостей интерфейсов по пути. И помни про floating static — она страхует именно OSPF-маршруты.
1. Главная идея: link-state и полная карта
Distance-vector протоколы (RIP) работают «по слухам»: сосед сказал «до сети X — 3 хопа», ты поверил. Ты не видишь топологию, только чужие пересказы — отсюда медленная сходимость и петли.
OSPF работает иначе. Каждый роутер рассылает описание своих линков (это LSA — Link-State Advertisement). Все LSA собираются в общую базу — LSDB (Link-State Database). В итоге у каждого роутера в области идентичная полная карта сети. Затем каждый сам запускает алгоритм Дейкстры (SPF) и считает кратчайшие пути до всех сетей — от себя. Как навигатор, у которого есть вся карта города, а не пересказ «поверни где-то там».
2. Пять типов пакетов OSPF
OSPF не использует TCP/UDP — он работает прямо поверх IP, protocol 89. Пять типов сообщений:
| Тип | Имя | Зачем |
|---|---|---|
| 1 | Hello | найти соседей и поддерживать соседство |
| 2 | DBD (Database Description) | «оглавление» моей LSDB — что у меня есть |
| 3 | LSR (Link-State Request) | «пришли мне вот эти LSA, которых у меня нет» |
| 4 | LSU (Link-State Update) | сами LSA (полезная нагрузка топологии) |
| 5 | LSAck | подтверждение получения LSA (надёжность) |
Hello-пакет «на проводе» (упрощённый разбор Wireshark):
3. Hello: как находятся соседи
OSPF шлёт Hello-пакеты на multicast-адрес 224.0.0.5 со всех включённых интерфейсов.
Так роутеры обнаруживают друг друга. Но соседство (adjacency) сложится только, если на обоих
совпадает ряд параметров — иначе они «видят», но не «дружат». Это топ-источник проблем у джунов.
| Параметр | Должен совпадать? |
|---|---|
| Area ID | ✅ да — иначе соседства не будет |
| Subnet / маска на линке | ✅ да — должны быть в одной подсети |
| Hello / Dead интервалы | ✅ да — иначе flap |
| Authentication | ✅ да, если включена |
| Stub-флаг области | ✅ да |
| MTU | ✅ да — застрянет в ExStart/Exchange |
| Router-ID | ❌ должен быть уникальным, не совпадать |
router-id) → иначе самый высокий IP на
loopback → иначе самый высокий IP на активном интерфейсе. Всегда задавай вручную и стабильным
(например 1.1.1.1) — иначе после перезагрузки RID может «прыгнуть» и сломать соседства.
4. Состояния соседства: Down → Full
Соседство проходит через ряд состояний. Здоровое соседство заканчивается на Full (или 2-Way для не-DR на multi-access). Если «застряло» — состояние подсказывает, где искать проблему:
Обмен базой: DBD → LSR → LSU → LSAck
После 2-Way (или ExStart) соседи синхронизируют LSDB. Это и есть «движок» OSPF:
5. Типы сетей и DR/BDR
OSPF ведёт себя по-разному в зависимости от типа сети на интерфейсе:
| Тип сети | DR/BDR? | Где |
|---|---|---|
| Broadcast | ✅ да | Ethernet-сегмент (по умолчанию) |
| Point-to-Point | ❌ нет | линк между двумя роутерами (serial, /30, /31) |
| Non-broadcast (NBMA) | ✅ да (вручную) | Frame Relay, старые WAN |
| Point-to-Multipoint | ❌ нет | hub-and-spoke |
На сети с множественным доступом (Ethernet-сегмент, где несколько роутеров на одном свитче) каждый роутер
дружил бы с каждым — это N×(N−1)/2 соседств и лавина LSA. Чтобы этого избежать, выбирается
DR (Designated Router) и BDR (резерв). Все остальные (DROther) дружат только
с DR/BDR и общаются через них на адрес 224.0.0.6. Один центр вместо хаоса «все со всеми».
Кто становится DR:
- Сначала — наибольший OSPF priority на интерфейсе (по умолчанию 1;
0= «никогда не DR»). - При равенстве — наибольший Router-ID.
- Выборы не вытесняющие: новый роутер с большим priority не «свергнет» действующий DR. DR меняется только при его пропаже.
6. SPF / Дейкстра — из карты в дерево путей
Когда LSDB синхронизирована, каждый роутер запускает алгоритм Дейкстры: ставит себя в корень и строит дерево кратчайших путей (SPT) до всех сетей, суммируя cost по дороге. Лучшие пути попадают в таблицу маршрутизации.
7. Areas: иерархия и backbone
Если все роутеры в одной области, LSDB растёт, и каждый пересчёт SPF при любом изменении нагружает всех. Решение — разбить сеть на области (areas). Внутри области — детальная карта; между областями передаётся уже суммированная информация. Изменение в одной области не запускает полный SPF в других.
Главное правило: есть backbone — area 0, и все остальные области должны подключаться к ней. Роутер на стыке областей — ABR (Area Border Router). Роутер, который вносит в OSPF внешние маршруты (из BGP, статики, другого протокола) — ASBR (Autonomous System Boundary Router).
8. Типы LSA и типы областей — обзорно, но понятно
Не нужно зубрить все. Нужно понимать, кто что описывает:
| LSA | Кто генерит | Что описывает |
|---|---|---|
| Type 1 (Router) | каждый роутер | свои линки внутри области |
| Type 2 (Network) | DR | multi-access сегмент |
| Type 3 (Summary) | ABR | сети другой области (между областями) |
| Type 4 (ASBR Summary) | ABR | как добраться до ASBR |
| Type 5 (External) | ASBR | внешние маршруты (редистрибуция) |
| Type 7 (NSSA External) | ASBR в NSSA | внешние в stub-подобной области |
Типы областей — зачем
Чтобы маленькие края сети не тащили тяжёлые внешние LSA, область можно сделать «урезанной». Достаточно понимать идею: stub — не пускаем Type 5 (внешние), вместо них default route; totally stubby (Cisco) — не пускаем ещё и Type 3 (межобластные); NSSA — stub, но со своим ASBR (Type 7). Это оптимизация, на собесе достаточно объяснить «зачем».
9. Метрика — cost по полосе
OSPF считает стоимость пути как сумму cost исходящих интерфейсов. Cost по умолчанию =
reference-bandwidth / bandwidth интерфейса, reference по умолчанию 100 Мбит/с.
| Интерфейс | Cost при reference 100 Мбит/с | Cost при reference 100 Гбит/с |
|---|---|---|
| 10 Мбит/с | 10 | 10000 |
| 100 Мбит/с | 1 | 1000 |
| 1 Гбит/с | 1 (!) | 100 |
| 10 Гбит/с | 1 (!) | 10 |
| 100 Гбит/с | 1 (!) | 1 |
auto-cost reference-bandwidth 100000 (или больше) на всех роутерах одинаково.
10. Полный конфиг multi-area (Cisco)
Сценарий: R1 в area 1, R2 — ABR (area 1 + area 0), R3 в area 0.
Проверка соседства и маршрутов:
Таймеры и аутентификация
11. Troubleshooting — флоучарт
12. OSPFv3 для IPv6 — кратко
Для IPv6 есть OSPFv3 (RFC 5340). Та же логика (link-state, areas, DR/BDR, SPF), но:
работает по link-local адресам, настраивается на интерфейсе (ipv6 ospf 1 area 0), а не через
network, и может переносить и IPv4, и IPv6 (address families). Учить отдельно почти не нужно — знаешь
OSPFv2, понимаешь и v3.
13. Мост в DevOps
Прямо OSPF в облаке ты почти не встретишь (там маршрутизацию делает провайдер/VPC). Но:
- В underlay дата-центров и у провайдеров OSPF/IS-IS — повседневность.
- Принцип link-state («полная карта → SPF») встречается в дизайне распределённых систем и в том, как Kubernetes-CNI распространяют маршруты.
- Понимание «соседство, состояние, сходимость, MTU ломает обмен» переносится 1-в-1 на отладку любых протоколов, включая BGP в Calico и туннели.
14. Вопросы с собеседования
15. Частые ошибки джунов
16. Плейбук: «EXSTART в 3:20» — закрываем ночной инцидент
Возвращаемся к филиалу «Северный»: после включения jumbo frames соседство циклится в EXSTART. Дежурный уже потратил 40 минут на перезагрузки. Правильные 10 минут выглядят так:
DOWN/INIT — не слышат друг друга (ACL, area, таймеры);
2-WAY навсегда — норма для не-DR на broadcast;
EXSTART/EXCHANGE — в 9 случаях из 10 несовпадение MTU:
Hello маленький и проходит, а большие DBD-пакеты с описанием базы — нет. Сосед виден,
обмен не начинается — ровно наша картина.show interface gi0/1 | include MTU с обеих сторон — 9000 против 1500.%OSPF-4-BADLSATYPE-подобный шум
или просто циклы Neighbor Down: Dead timer expired. debug ip ospf adj
покажет «Nbr has larger interface MTU».mtu 9000 на филиальской стороне (если железо умеет) или откат ядра на 1500
до планового апгрейда филиала. Костыль на крайний случай: ip ospf mtu-ignore
на интерфейсе — соседство поднимется, но риск остаётся: большие LSU могут молча теряться.
Костыль применяй осознанно и с тикетом на устранение.show ip ospf neighbor → FULL;
show ip route ospf — маршруты ГО вернулись;
пинг критичных сервисов из филиала. В отчёт: «Причина — рассинхрон MTU после включения
jumbo frames (ядро 9000, филиал 1500): OSPF DBD-обмен блокировался, соседство циклилось
в EXSTART. MTU выровнен, регламент работ дополнен пунктом „менять MTU одновременно
с обеих сторон стыка“».17. Мини-лаба: OSPF своими глазами
router ospf 1 + network … area 0 (или ospf на интерфейсах).
Смотри: show ip ospf neighbor (кто с кем FULL), show ip ospf database
(одинаковая LSDB на всех трёх — проверь!), show ip route ospf (метка «O»).shutdown). Сколько пингов потерялось? OSPF заметил обрыв,
разослал обновлённые LSA, все пересчитали SPF — трафик поехал в обход за секунды.
Теперь верни линк — путь вернётся на кратчайший. Это та самая динамика, ради которой
отказались от статики.interface gi0/0 → mtu 1400. Смотри,
как соседство падает и застревает в EXSTART (show ip ospf neighbor — состояние
мигает EXSTART/DOWN). Полечи двумя способами: выровняй MTU обратно, а потом попробуй
ip ospf mtu-ignore — прочувствуй разницу между решением и костылём.18. Словарик урока
| Термин | По-английски | Смысл в одну строку |
|---|---|---|
| Состояние каналов | link-state | каждый роутер знает полную карту; маршруты считает сам, а не верит соседям |
| База состояний | LSDB, link-state database | «карта города»: одинакова у всех роутеров области — это святое |
| Анонс LSA | link-state advertisement | кирпичик LSDB: «я такой-то, мои линки такие-то, cost такой-то» |
| Приветствие | Hello | поиск и поддержание соседей: multicast 224.0.0.5, таймеры 10/40 c |
| Соседство | adjacency, FULL | отношения обмена базой; FULL = базы синхронны |
| Идентификатор роутера | router-id, RID | уникальное «имя» в OSPF; задавай руками, иначе прыгнет после ребута |
| DR / BDR | designated router | «старший» multi-access-сегмента: все синхронизируются через него, не full-mesh |
| Алгоритм SPF | shortest path first, Дейкстра | из общей карты — дерево кратчайших путей от себя до всех сетей |
| Стоимость | cost = reference/bandwidth | метрика интерфейса; reference-bandwidth поднимай одинаково на всех! |
| Область | area, backbone area 0 | граница видимости LSA; все области обязаны касаться area 0 |
| Пограничные роутеры | ABR / ASBR | стык областей (нога в area 0) / вброс внешних маршрутов (из BGP, статики) |
| Тупиковая область | stub / totally stub / NSSA | области-«умные дыры»: вместо внешних маршрутов — default от ABR |
| Суммаризация | summarization | ABR/ASBR сворачивает префиксы: меньше LSA — стабильнее и быстрее SPF |
| Пассивный интерфейс | passive-interface | сеть анонсируется, но Hello не шлётся — стандарт для хостовых портов |
| Залипание EXSTART | EXSTART/EXCHANGE stuck | подпись несовпадения MTU: Hello проходит, DBD — нет |
19. Задачи на понимание
Задача 1. Соседи в 2-WAY и дальше не идут. На P2P-линке это авария, а на Ethernet-сегменте из 5 роутеров — возможно, норма. Объясни разницу.
На broadcast-сегменте полные соседства (FULL) строятся только с DR и BDR; между «рядовыми» (DROTHER) — ровно 2-WAY, это штатно. На P2P DR/BDR не выбираются, соседство обязано дойти до FULL — залипание в 2-WAY там означает проблему (например, priority 0 с обеих сторон на неверно определённом типе сети).
Задача 2. Путь А→Б: гигабитный линк (cost 1) + гигабитный линк (cost 1) = 2. Прямой линк А→Б на 100 Мбит/с — тоже cost 1?! Reference-bandwidth по умолчанию 100 Мбит/с. Куда пойдёт трафик и как починить?
С дефолтным reference 100M и гигабит, и сотка получают cost 1 (меньше единицы не бывает) —
прямой медленный линк (cost 1) выиграет у быстрого пути (cost 2), и трафик поползёт через
100 Мбит/с. Лечение: auto-cost reference-bandwidth 100000 (100G) на всех
роутерах одинаково — теперь гигабит = 100, сотка = 1000, и SPF выберет быстрый путь.
Задача 3. Компания: ядро + 30 филиалов на медленных линках. Всё в одной area 0. Какие две проблемы это создаёт и как их решает иерархия областей?
1) Каждый флап любого филиального линка порождает LSA, которое разлетается всем 30+ роутерам, и все пересчитывают SPF — CPU и нестабильность. 2) LSDB огромная — память и время сходимости. Иерархия: филиалы по своим областям (stub/totally stub — им хватит default от ABR), ядро — area 0, на ABR — суммаризация филиальных префиксов. Флап внутри area 1 не заставляет area 2 пересчитывать SPF: межобластные изменения приходят «готовыми» Type-3 LSA.
Задача 4. Нужно подключить OSPF-домен к интернету: провайдер отдаёт default по BGP. Каким типом роутера станет твой граничный маршрутизатор и как филиалы узнают путь в интернет?
Граничный роутер станет ASBR: он вносит внешний (не-OSPF) маршрут в домен —
обычно командой default-information originate. По домену разойдётся Type-5 LSA
с default 0.0.0.0/0 (метка O*E2 в таблицах). Филиалы в stub-областях получат default
и без этого — от своего ABR, так устроена stub-область.
Задача 5. После замены коммутатора между двумя роутерами соседство поднимается до FULL, но каждые ~40 секунд падает с «Dead timer expired» и поднимается снова. Пинг между роутерами ходит. Твои гипотезы?
Hello ходят при установлении (unicast-часть и первые multicast прошли), но регулярные
multicast-Hello теряются — dead-таймер (40 с) истекает. Главный подозреваемый — новый
коммутатор режет или фильтрует multicast 224.0.0.5 (включён IGMP snooping
без querier, storm-control по multicast, или ACL). Проверка: debug ip ospf hello —
видно, что свои Hello уходят, чужие не приходят. Вторая гипотеза — односторонние потери
на линке (CRC), смотри счётчики из модуля 1.
Задача 6. Чем плох virtual-link и в какой ситуации он всё же оправдан?
Virtual-link — «удлинитель» area 0 через другую область: хрупкий (зависит от транзитной области), усложняет отладку, не любит аутентификацию по умолчанию — признанный костыль. Оправдан временно: слияние двух компаний, когда новая область физически не касается backbone, а перестроить топологию прямо сейчас нельзя. Ставится с тикетом «убрать при редизайне» — постоянное решение это перепроектировать связность до area 0.
- OSPF — link-state поверх IP proto 89: общая LSDB (карта) → каждый сам считает SPF/Дейкстру.
- Три таблицы: соседи → LSDB → маршруты. Пять пакетов: Hello, DBD, LSR, LSU, LSAck.
- Hello на 224.0.0.5; для соседства совпадают area, маска, Hello/Dead, auth, MTU.
- Застрял в Init — не видят взаимно; в ExStart/Exchange — MTU.
- DR/BDR — только на multi-access; priority, потом Router-ID; выборы не вытесняющие.
- SPF строит дерево минимальной суммы cost от себя до всех сетей.
- Иерархия: backbone area 0, все области к ней; ABR — стык областей, ASBR — внешние маршруты.
- Cost = reference / bandwidth. Обязательно поднимай reference-bandwidth одинаково везде.
- Задавай router-id вручную;
passive-interfaceна хостовых портах — практика и безопасность. - OSPFv3 — то же для IPv6, настраивается на интерфейсе.
OSPF безупречен внутри твоей сети: одна организация, одно доверие, одна цель — кратчайший путь. Но интернет — это 80 000+ независимых сетей (автономных систем), которые друг другу не доверяют и хотят не «кратчайшего», а выгодного: дешёвый транзит, платный пиринг, политика. Кратчайший путь тут никого не волнует. Для этого мира нужен другой протокол — BGP, самый важный протокол интернета. Следующий модуль — флагман трека: как AS договариваются, как выбирается best-path и как одна ошибка в анонсе кладёт пол-интернета.