MIkrotik. OSPF на примере 4 роутеров
Введение
Протокол OSPF (Open Shortest Path First) — это протокол динамической маршрутизации, который ищет кратчайший путь (маршрут) используя алгоритм Дейкстры . Перед тем, как начать обмен маршрутной информацией между роутерами, им необходимо установить соседские отношения. Для этого между роутерами должна быть IP связность.
OSPF — это масштабируемый протокол и если нужно объединить много роутеров в одну автономную систему эти роутеры можно поделить на зоны (Area). Но в статье это не рассматривается.
Для обмена маршрутной информацией используются специально выделенные мультикастовые адреса:
- 224.0.0.5
- 224.0.0.6
То-есть для работы OSPF мультикаст должен быть разрешен.
Схема сети (broadcast)
У нас есть 4 роутера и все они находятся в одном широковещательном домене (broadcast), например подключены к одному коммутатору. Эти роутеры обслуживают некоторые локальные сети. И мы с помощью OSPF создадим таблицы маршрутизации на каждом роутере MikroTik, так чтобы из каждой подсети можно было попасть в каждую подсеть.

Вся настройка OSPF в MikroTik у нас находится в меню /Routing/OSPF.
Создание инстанса OSPF
Вначале на вкладке Instances создаём на каждом роутере свой инстанс:

Можно ничего не менять, а можно указать RouterID. Он указывается в виде похожем на ip адрес, но это не ip адрес, это идентификатор роутера. И соседские роутеры знают друг друга по этим идентификаторам. Если появятся два роутера с одинаковыми идентификаторами, то роутеры запутаются. В OSPF каждый роутер должен иметь уникальный номер. Я на первом роутере указываю 0.0.0.1, на втором 0.0.0.2 и так далее.
Если бы мы не указали на каждом роутере свой Router ID, то роутеры бы автоматически назначили его себе, взяв какой-нибудь из своих ip адресов. Но лучше задать Router ID вручную, а не доверять глупой железке.
Создание зоны OSPF
Дальше переходим на вкладку Areas и создаём новую зону OSPF. Здесь ничего не меняем, на каждом роутере всё оставляем по умолчанию:

В этой статье я не рассказываю про деление автономной системы на зоны и объединение зон. И так как зона у нас одна, то создаём её по умолчанию.
Указываем интерфейсы которые будут участвовать в обмене OSPF
Переходим на вкладку Interface Templates и создаём шаблоны. В шаблоне обязательно нужно указать интерфейс. Дополнительно можно указать определённую подсеть, маршрут к которой будет передаваться по OSPF на остальные роутеры. Также нужно указать тип сети, если роутеры находятся в одном широковещательном домене (как у нас), то указывается broadcast. А если они соединены по типу точка-точка (патч-кордами или L3_VPN-ами), то тип сети будет ptp (peer-to-peer).
Также, если интерфейс обслуживает локальную сеть, где находятся только конечные устройства пользователей, то нужно поставить галочку Passive, чтобы в эту локалку не отправлялись OSPF пакеты. А шаблон делаем, для того чтобы опубликовать эту сеть в OSPF.
А если вам к определённым сетям, за определёнными интерфейсами не нужно передавать маршруты. И эти интерфейсы не должны участвовать в OSPF, то просто не создавайте для этих интерфейсов шаблоны.
Вот пример моих настроек на первом роутере:

Интерфейс ether2 у меня идет в широковещательный домен, по которому будет происходить обмен OSPF пакетами. Поэтому я указываю тип сети Broadcast и не ставлю галочку Passive.
Интерфейс ether3 у меня обслуживает локальную сеть, маршрут к которой я хочу опубликовать. Но я не хочу пускать туда OSPF трафик. Поэтому я ставлю галочку Passive. Тип сети Broadcast, так как интерфейс обслуживает локальную сеть, а не одно устройство.
Все остальные настройки оставляю по умолчанию. И создаю по 2 таких шаблона на каждом роутере.
Просмотр соседей OSPF
Чтобы убедиться что всё работает перейдите на вкладку Neighboards:

Соседство определяется состоянием (State). Если оно полное (Full), значит все в порядке и роутеры начали обмениваться маршрутами. Ещё одним рабочим состоянием является TwoWay (двухстороннее соединение), но только для Broadcast соединения.
Дело в том, что в Broadcast соединении происходит выбор главного маршрутизатора — DR и резервного главного маршрутизатора BDR. А все остальные роутеры называют DROTHER. Вот между DROTHER будет состояние не Full а TwoWay и они не будут между собой обмениваться маршрутной информацией.
А если у вас тип сети PTP, то все роутеры будут иметь соседство Full.
Немного теории (основные понятия и состояния соседства)
В самом начале роутеры с включенным и настроенном OSPF начинают искать соседей. Затем с найденными соседями устанавливаются соседские отношения. При этом роутеры договариваются о том как будет происходить обмен информацией о маршрутах.
И так у нас сейчас OSPF работает в broadcast (ethernet) среде. И алгоритм при этом немного отличается от работы в среде peer-to-peer. Главным отличаем работы в broadcast — является процесс выборов DR и BDR.
Основные понятия:
- LSDB — база данных маршрутной информации.
- Hello пакет — используется для обнаружения соседей, построения соседских отношений и мониторинга доступности соседа.
- DBD пакет — проверяет синхронизацию базы данных (LSDB) между роутерами. С помощью DBD роутер сообщает, какие у него есть соседи.
- LSR — запрос определенных записей из LSDP соседа. То есть роутер получает DBD от соседа и понимает что у его соседа есть ему неизвестные соседи. И чтобы понять как до них добраться и какие у них есть опубликованные сети, роутер запрашивает эту информацию с помощью LSR запроса.
- LSU — отправка определенных записей из LSDB в ответ на запрос (LSR).
Состояния соседства:
- Down — самое первое состояние, когда роутер ещё не начал посылать Hello пакеты для поиска соседей.
- Init — как только роутер отправляет свой первый Hello пакет соседу, то он переходит в состояние Init и начинает ждать Hello пакеты от соседей.
- TwoWay — в этом состоянии соседи могут остаться, но только в broadcast среде и если их больше трёх. При установке соседских отношений роутеры отправляют сообщение hello друг другу два раза. Первый раз чтобы нащупать соседа, а второй раз, чтобы сообщить соседу о том, что его заметили и с ним хотят дружить. Во втором hello пакете роутер посылает Router ID соседа. И если роутер видит в этом пакете свой Router ID, то он переходит в TwoWay. Другими словами, в этом состоянии роутер знает, что сосед про него знает. Также в этом состоянии проходят выборы за роль DR и BDR (об этом ниже).
- Exstart – здесь роутеры договариваются о том, кто первый начнет обмен. Для этого из двух соседей выбирается главный роутер (master), и второстепенный (slave). Главным становится тот роутер, у которого Router ID больше.
- Exchange – роутеры начинают обмениваться DBD пакетами. При этом master посылает DBD первым, то есть сообщает, какие у него есть соседи.
- Loading – переход в это состояние происходит тогда, когда роутер осознает, что в его LSDB не хватает части маршрутной информации. То есть соседа он уже знает, нужно узнать какие сети обслуживает сосед и какие у него есть соседи, и какие сети есть у соседей. В этом состояние роутер отсылает LSR запросы. И в ответ он получает LSU ответы, и наполняет свою базу LSDB.
- Full – после того, как база данных LSDB у соседей синхронизовалась, роутеры переходят в это состояние.
Немного теории (что такое DR и BDR и зачем нужно голосование)
Когда у вас широковещательная среда (broadcast). То каждый OSPF роутер должен синхронизировать свою базу LSDB с базами других роутеров. В такой среде может быть очень много OSPF роутеров. Ни как у нас 4, а например 100. И представьте что 100 роутеров начнут синхронизацию каждый с каждым. Это очень серьёзно нагрузить broadcast среду.
Разработчики OSPF решили что в broadcast среде обмен маршрутной информацией будет происходить не каждый с каждым, а каждый с главным. И этот главный будет передавать свою большую LSDB всем остальным. Такой главный роутер назвали DR (designated router).
Но если что-то случится с DR, то все соседские отношения рухнут. Чтобы этого не произошло в процессе выборов выбирают ещё BDR (backup designated router). BDR точно также как и DR наполняет свою базу LSDB, но не распространяет её. Но если что-то случится с DR, то он его заменит его.
А роутеры которые не стали DR и BDR называют DROTHER. Роутеры DROTHER имеют статус соседства FULL с роутерами DR и BDR (то есть кидают LSR и получают LSU). А соседство двух роутеров DROTHER описывается состоянием TwoWay (синхронизации не происходит). Вот поэтому в broadcast среде, где больше трёх роутеров, можно наблюдать соседство TwoWay и при этом всё корректно работает.
Посмотрим таблицу маршрутизации
После прочтения теории, если вы её осилили, вернёмся к нашей сети и посмотрим какие маршруты мы получили по протоколу OSPF:

То есть теперь мы можем получить доступ ко всем подсетям.
Схема сети (точка — точка)
Теперь немного изменим условия. Допустим эти 4 роутера не в одном широковещательном домене а соединены по типу точка-точка (ptp). Например патч-кордами, или L3_VPN. При этом, у меня, каждый роутер соединён с каждым другим роутером:

Изменяем Interface Templates
Заходим на каждый роутер, и отключаем шаблон, который был для broadcast (в моём случае это ether2). И затем создаём новые шаблоны для соединений по типу peer-to-peer (в моём случае это vpn). Получается вот так:

Это проделывается на всех роутерах.
Просмотр соседей OSPF
Затем перейдём на вкладку Neighbors, чтобы посмотреть соседей OSPF и их состояния:

В этом случае (ptp), чтобы все работало, состояния должно быть Full и никакими другими. Так как здесь не идет голосования и нет DR и BDR роутеров.
Посмотрим таблицу маршрутизации
После того, как мы убедились в полном соседстве наших роутеров, посмотрим на таблицу маршрутизации на первом роутере:

Теперь у нас есть доступ ко всем подсетям, через vpn соединения.
Перестройка маршрутов
И так из первой подсети (192.168.1.0/24) в четвертую (192.168.4.0/24) и пятую подсеть (192.168.5.0/24) пакеты пойдут через l2tp-in4.
Как только упадет VPN между 1 и 4 роутером, маршруты перестроятся:

Теперь в 4 и 5 подсеть с первого роутера пакеты пойдут через l2tp-in2 и l2tp-in3 используя ECMP. То есть половина соединений пойдет через R2, а половина через R3. И периодически такие соединения будут перестраиваться, что не совсем правильно.
Когда мы создавали Interface Templates мы не меняли параметр Cost. Поэтому у нас цена каждого соединения равна единицы. Вот как это выглядит, если потеряно соединение R1 с R4:

То есть кратчайшем путём от первой подсети к пятой подсети будет через R1 — R2 — R4 или через R1- R3 — R4. И эти пути равны. А так как у нас два равноценных пути, то в работу вступает ECMP.
Чтобы это исправить, нужно на роутере R1 в Interface Templates увеличить стоимость (Cost) перехода к R3:

Теперь наша схема изменится:

Теперь кратчайшем путём от первой подсети к пятой подсети будет через R1 — R2 — R4, а путь R1- R3 — R4 будет дороже.
Чтобы в этом убедиться посмотрим таблицу маршрутизации:

Видим что действительно пакеты в 4 и 5 подсети пойдут через R2 (l2tp-in2).
Итог
Мы узнали как настроить на роутерах MikroTik обмен маршрутной информацией с помощью протокола OSPF.
Узнали что для этого нужно:
- Создать инстанс (Instances)
- В нем указать RouterID для каждого роутера
- Создать зону (Area)
- Создать шаблон для интерфейса (Interface Templates)
- Указать интерфейс
- Если нужно, указать подсети
- Указать тип соединения
- Если нужно, поменять параметр Cost
- Если нужно, поставить галочку Passive
- Проследить за соседями (Neighbors) и посмотреть какие маршруты прилетели к нам по OSPF (IP / Routes)
Также вы узнали что OSPF работает по мультикасту и нужна IP связность. А также в различных средах (broadcast / ptp) алгоритм установки соседских отношений может отличаться.
Вы узнали что в broadcast среде роутеры выбирают себе DR и BDR, и обмениваются маршрутной информацией только через DR, а не каждый с каждым.
Если понравилась статья, подпишись на мой канал в VK или Telegram .