L3 OSPF — визуализированный

OSPF (Open Shortest Path First) — стандарт де-факто динамической маршрутизации внутри enterprise-сетей. Открытый (не привязан к вендору), быстрый, устойчивый к петлям. Если на собеседовании на сетевика спрашивают один протокол глубоко — это почти всегда OSPF. Разберём его так, чтобы ты не зубрил, а понимал, что происходит — с пакетами, состояниями и реальными конфигами.

Что узнаешь

1. Главная идея: link-state и полная карта

Distance-vector протоколы (RIP) работают «по слухам»: сосед сказал «до сети X — 3 хопа», ты поверил. Ты не видишь топологию, только чужие пересказы — отсюда медленная сходимость и петли.

OSPF работает иначе. Каждый роутер рассылает описание своих линков (это LSA — Link-State Advertisement). Все LSA собираются в общую базу — LSDB (Link-State Database). В итоге у каждого роутера в области идентичная полная карта сети. Затем каждый сам запускает алгоритм Дейкстры (SPF) и считает кратчайшие пути до всех сетей — от себя. Как навигатор, у которого есть вся карта города, а не пересказ «поверни где-то там».

Три таблицы OSPF
1. Neighbor table кто мои соседи show ip ospf neighbor 2. LSDB (карта) полная топология show ip ospf database 3. Routing table лучшие пути (SPF) show ip route ospf Hello → SPF/Дейкстра →
Соседи строят общую карту (LSDB), из карты алгоритм SPF считает лучшие маршруты.

2. Пять типов пакетов OSPF

OSPF не использует TCP/UDP — он работает прямо поверх IP, protocol 89. Пять типов сообщений:

ТипИмяЗачем
1Helloнайти соседей и поддерживать соседство
2DBD (Database Description)«оглавление» моей LSDB — что у меня есть
3LSR (Link-State Request)«пришли мне вот эти LSA, которых у меня нет»
4LSU (Link-State Update)сами LSA (полезная нагрузка топологии)
5LSAckподтверждение получения LSA (надёжность)

Hello-пакет «на проводе» (упрощённый разбор Wireshark):

── OSPF Hello (IP proto 89, dst 224.0.0.5) ── Version: 2 # OSPFv2 для IPv4 Type: 1 (Hello) Router ID: 1.1.1.1 Area ID: 0.0.0.0 # area 0 (backbone) Network Mask: 255.255.255.252 Hello Interval: 10 # должен совпасть с соседом! Dead Interval: 40 # должен совпасть! Designated Router: 10.0.12.1 Neighbor: 2.2.2.2 # «я тебя вижу» → это даёт 2-Way

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 выбирается так: вручную заданный (router-id) → иначе самый высокий IP на loopback → иначе самый высокий IP на активном интерфейсе. Всегда задавай вручную и стабильным (например 1.1.1.1) — иначе после перезагрузки RID может «прыгнуть» и сломать соседства.

4. Состояния соседства: Down → Full

Соседство проходит через ряд состояний. Здоровое соседство заканчивается на Full (или 2-Way для не-DR на multi-access). Если «застряло» — состояние подсказывает, где искать проблему:

Машина состояний соседства OSPF
Down Init 2-Way ExStart Exchange Loading Full видим Hello, но себя в нём нет застряли тут? проверь MTU! здоровое соседство Init/2-Way застряло → не совпадают Hello/Dead, area, auth, subnet. ExStart/Exchange застряло → почти всегда несовпадение MTU.
Запомни два диагностических факта: «застрял в Init» = не видят друг друга взаимно; «застрял в ExStart» = MTU.

Обмен базой: DBD → LSR → LSU → LSAck

После 2-Way (или ExStart) соседи синхронизируют LSDB. Это и есть «движок» OSPF:

Синхронизация LSDB между R1 и R2
R1 R2 DBD — «вот оглавление моей базы» DBD — «а вот моё» LSR — «пришли LSA, которых у меня нет» LSU — «держи запрошенные LSA» LSAck — «получил, спасибо» → базы идентичны → состояние Full
Дальше LSDB поддерживается инкрементально: новый/изменённый LSA «флудится» всем, каждый шлёт LSAck.

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 — хаос. С DR — звезда.
Без DR: каждый с каждым С DR: все через центр DR
DROther держат Full только с DR/BDR; между собой — состояние 2-Way (этого достаточно).

Кто становится DR:

На P2P-линках DR/BDR не выбираются — там всего два роутера, центр не нужен. DR/BDR — только для broadcast/NBMA сетей.

6. SPF / Дейкстра — из карты в дерево путей

Когда LSDB синхронизирована, каждый роутер запускает алгоритм Дейкстры: ставит себя в корень и строит дерево кратчайших путей (SPT) до всех сетей, суммируя cost по дороге. Лучшие пути попадают в таблицу маршрутизации.

SPF-дерево: R1 считает кратчайшие пути (cost на рёбрах)
R1 R2 R3 R4 10 1 10 5 3 До R4 лучший путь R1→R3→R4 = 1+5 = 6 (а не R1→R2→R4 = 20). SPF выбирает 6.
OSPF суммирует cost вдоль пути и выбирает минимальную сумму. Это и есть «shortest path first».

7. Areas: иерархия и backbone

Если все роутеры в одной области, LSDB растёт, и каждый пересчёт SPF при любом изменении нагружает всех. Решение — разбить сеть на области (areas). Внутри области — детальная карта; между областями передаётся уже суммированная информация. Изменение в одной области не запускает полный SPF в других.

Главное правило: есть backbone — area 0, и все остальные области должны подключаться к ней. Роутер на стыке областей — ABR (Area Border Router). Роутер, который вносит в OSPF внешние маршруты (из BGP, статики, другого протокола) — ASBR (Autonomous System Boundary Router).

Иерархия областей вокруг backbone (area 0)
Area 0 — Backbone Rb1 Rb2 ABR ABR Area 1 Area 2 (+ASBR) ASBR
Все области касаются area 0. ABR соединяет область с backbone, ASBR заносит внешние маршруты.

8. Типы LSA и типы областей — обзорно, но понятно

Не нужно зубрить все. Нужно понимать, кто что описывает:

LSAКто генеритЧто описывает
Type 1 (Router)каждый роутерсвои линки внутри области
Type 2 (Network)DRmulti-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 Мбит/с1010000
100 Мбит/с11000
1 Гбит/с1 (!)100
10 Гбит/с1 (!)10
100 Гбит/с1 (!)1
важная настройка При reference 100 Мбит/с и Gigabit, и 100G дают cost = 1 — OSPF их не различает! В современных сетях обязательно задавай auto-cost reference-bandwidth 100000 (или больше) на всех роутерах одинаково.

10. Полный конфиг multi-area (Cisco)

Сценарий: R1 в area 1, R2 — ABR (area 1 + area 0), R3 в area 0.

# === R1 (только area 1) === R1(config)# router ospf 1 R1(config-router)# router-id 1.1.1.1 R1(config-router)# auto-cost reference-bandwidth 100000 R1(config-router)# network 10.0.1.0 0.0.0.255 area 1 R1(config-router)# network 10.0.12.0 0.0.0.3 area 1 R1(config-router)# passive-interface gi0/0 # к хостам Hello не шлём # === R2 (ABR: area 1 ↔ area 0) === R2(config)# router ospf 1 R2(config-router)# router-id 2.2.2.2 R2(config-router)# auto-cost reference-bandwidth 100000 R2(config-router)# network 10.0.12.0 0.0.0.3 area 1 R2(config-router)# network 10.0.23.0 0.0.0.3 area 0 R2(config-router)# area 1 range 10.0.0.0 255.255.0.0 # суммаризация в area 0 # === R3 (area 0) === R3(config)# router ospf 1 R3(config-router)# router-id 3.3.3.3 R3(config-router)# auto-cost reference-bandwidth 100000 R3(config-router)# network 10.0.23.0 0.0.0.3 area 0

Проверка соседства и маршрутов:

R2# show ip ospf neighbor Neighbor ID Pri State Dead Time Address Interface 1.1.1.1 1 FULL/ - 00:00:34 10.0.12.1 Gi0/1 3.3.3.3 1 FULL/DR 00:00:38 10.0.23.2 Gi0/2

Таймеры и аутентификация

# таймеры (должны совпадать с соседом!) R1(config-if)# ip ospf hello-interval 10 R1(config-if)# ip ospf dead-interval 40 # аутентификация соседства (SHA на современных IOS) R1(config-if)# ip ospf authentication message-digest R1(config-if)# ip ospf message-digest-key 1 md5 SecretKey

11. Troubleshooting — флоучарт

«Соседство не поднимается» — куда смотреть
show ip ospf neighbor Соседа нет совсемL1/L2 up? IP в одной сети? ACL/multicast? Init / 2-Wayarea, Hello/Dead, auth, маска, stub-флаг ExStart / Exchange→ MTU mismatch (90% случаев) Full ✅соседство ок → смотри LSDB/маршруты Маршрутов нет, а соседство Full? → reference-bandwidth, суммаризация, тип области, фильтры.
Состояние соседа сразу сужает поиск. Это и есть методология, которую ценят на работе.
R1# show ip ospf neighbor # соседи и их состояние R1# show ip ospf interface brief # area, cost, тип сети, DR/BDR R1# show ip ospf database # LSDB — карта сети R1# show ip route ospf # что OSPF положил в таблицу R1# debug ip ospf adj # процесс соседства (осторожно в проде!)

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). Но:

14. Вопросы с собеседования

❓ Что должно совпадать у соседей OSPF?
Area ID, маска подсети на линке, Hello/Dead интервалы, аутентификация, stub-флаг области и MTU. Router-ID, наоборот, должен быть уникальным.
❓ Соседи застряли в ExStart/Exchange. Причина?
Почти всегда несовпадение MTU на линке. Обмен DBD не проходит. Проверь и выровняй MTU.
❓ Зачем DR/BDR и где их НЕ выбирают?
Чтобы на multi-access сегменте не было full-mesh соседств и лавины LSA — все общаются через DR. На P2P-линках DR/BDR не выбираются.
❓ Что такое ABR и ASBR?
ABR — роутер на границе областей (одна нога в area 0). ASBR — роутер, вносящий в OSPF внешние маршруты (редистрибуция из BGP/статики).

15. Частые ошибки джунов

ошибка 1 Соседство застряло в ExStart/Exchange. В 9 случаях из 10 — несовпадение MTU на линке.
ошибка 2 Соседи не поднимаются совсем (Init/Down). Разные area, разные Hello/Dead, mismatch auth, разные подсети на линке или ACL режет multicast 224.0.0.5.
ошибка 3 Reference-bandwidth по умолчанию. 1G и 100G выглядят одинаково (cost 1) — OSPF выбирает кривые пути. Задай большой reference на всех роутерах одинаково.
ошибка 4 Область не касается area 0. Все non-backbone области обязаны подключаться к backbone (напрямую или через virtual-link, что само по себе «костыль»).
ошибка 5 Не задан router-id. После перезагрузки RID «прыгнул» на другой IP → соседства пересоздались, маршруты флапнули. Всегда задавай router-id вручную.
Ключевое за этот урок