# OSPF - Open Shortest Path First _Протоколы · LinuxLab Knowledge Base_ **TL;DR:** **OSPF** - link-state IGP внутри одной автономной системы. Каждый роутер знает полную топологию (LSDB) и независимо считает кратчайшие пути алгоритмом Dijkstra. Сходимость секунды. ## Что такое link-state В отличие от distance-vector (RIP, EIGRP), где сосед просто говорит «до prefix X через меня метрика 5», link-state работает иначе: 1. Каждый роутер описывает **только свои локальные линки** в LSA (Link State Advertisement) 2. Все LSA flood'ятся по area без изменений 3. Каждый роутер собирает у себя одинаковую **LSDB** (Link State Database) - полная карта area 4. Локально считает SPF (Dijkstra) → таблица [routing-table](/kb/routing-table.md) Главное: все видят одинаковую топологию, нет распространения слухов через промежуточных, нет count-to-infinity петель. ## Соседства (adjacency) OSPF слышит соседей **multicast 224.0.0.5** (ALL-OSPF-ROUTERS) на каждом включённом интерфейсе. Hello каждые 10s (Ethernet) или 30s (NBMA). Состояния соседства: ``` Down → Init → 2-Way → ExStart → Exchange → Loading → Full ``` - **Down/Init** - Hello ещё не получили или односторонний - **2-Way** - оба видят друг друга, но обмен LSDB ещё не делали (на broadcast-сети все non-DR соседи остаются в 2-Way) - **ExStart/Exchange/Loading** - синхронизация LSDB - **Full** - синхронизация завершена, можно использовать В рабочей сети все нужные соседи **должны быть Full** (или 2-Way с не-DR). `show ip ospf neighbor` через [cmd-vtysh](/kb/cmd-vtysh.md). ## Area Большую сеть OSPF делит на **area** - изолированные домены flooding'а. - **Area 0** - backbone, обязателен. Все остальные area подключаются к 0. - **Area N** - non-backbone, может быть stub/totally-stubby для уменьшения LSDB - **ABR** (Area Border Router) - стоит между area, summarize'ит маршруты - **ASBR** (AS Boundary Router) - редистрибьютит во внешний мир (BGP, static) Если у вас < ~50 роутеров - одной Area 0 хватит. Иерархия даёт смысл на сотнях узлов. ## Типы LSA (упрощённо) | Type | Имя | Что описывает | |------|-----|---------------| | 1 | Router LSA | свои линки внутри area | | 2 | Network LSA | broadcast-сегмент (генерит DR) | | 3 | Summary LSA | prefix из соседнего area (генерит ABR) | | 4 | ASBR Summary | как достать ASBR | | 5 | External LSA | редистрибьютнутые внешние prefix'ы | | 7 | NSSA External | то же что type-5 но в NSSA-area | В `show ip ospf database` видно все LSA в LSDB. ## DR / BDR на broadcast-сетях На Ethernet-сегменте с N роутерами было бы N×(N-1)/2 adjacencies. Чтобы избежать flood-storm выбирают **DR** (Designated Router) и **BDR** (Backup). Все остальные строят Full только с DR/BDR. - DR election: highest **priority** (по умолчанию 1), tie-breaker - Router ID - На p2p-линках (типа `/30`) DR не нужен - там и так один сосед Если у вас loopback с большим IP и priority 0 - соберёте OSPF быстрее и предсказуемее. ## Минимальная конфигурация (FRR) ``` router ospf ospf router-id 1.1.1.1 network 10.0.0.0/30 area 0 network 192.168.10.0/24 area 0 ``` Что делает `network`: на каждом интерфейсе чей IP попадает в этот prefix - включается OSPF (рассылается Hello, prefix анонсируется в LSA type 1). Альтернатива (новее): per-interface конфигурация: ``` interface eth0 ip ospf area 0 ``` Так точнее - не зависит от текущего IP интерфейса. ## Типичные грабли - **MTU mismatch** между соседями → застряли в `ExStart`. Решение: одинаковый MTU или `ip ospf mtu-ignore`. - **Hello/Dead интервалы** не совпадают → соседи не видят друг друга. OSPF требует **точного совпадения** Hello и Dead. - **Auth mismatch** (если включён MD5/key-chain) → silent drop. - **Subnet mask mismatch** на broadcast-сегменте → не идёт 2-Way. - **passive-interface** забыли поставить на интерфейсе к клиентам → они получают Hello от вас (не страшно, но шумно и потенциально опасно). ## OSPF vs BGP в одной сети - **OSPF** - внутри AS, быстрая сходимость, лимит ~500 prefix'ов в одной area без проблем - **BGP** ([bgp](/kb/bgp.md)) - между AS или для transit'а большого числа prefix'ов Классическая схема: OSPF несёт loopback'и роутеров (next-hop'ы), BGP - клиентские prefix'ы. Это снимает с OSPF нагрузку и оставляет BGP политику. ## Команды ```bash vtysh -c 'show ip ospf neighbor' ``` Список соседей и их состояние - должны быть Full ```bash vtysh -c 'show ip ospf interface brief' ``` На каких интерфейсах работает OSPF, area, DR/BDR ```bash vtysh -c 'show ip ospf database' ``` LSDB - все LSA которые знает этот роутер ```bash vtysh -c 'show ip ospf route' ``` Маршруты посчитанные SPF - до того как попали в RIB ```bash tcpdump -i any -n proto ospf ``` Наблюдать Hello и LSU прямо в сети (multicast 224.0.0.5/6) ## См. также - [BGP - Border Gateway Protocol](/kb/bgp.md) - [Routing table](/kb/routing-table.md) - [IPv4-адресация и CIDR](/kb/ipv4-addressing.md) - [vtysh - CLI к FRR (BGP/OSPF)](/kb/cmd-vtysh.md)