MIkrotik. OSPF на примере 4 роутеров

В этой статье мы будем использовать MIkroTik с RouterOS версии 7.2 для изучения протокола динамической маршрутизации OSPF.

Введение

Протокол 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).

Состояния соседства:

  1. Down — самое первое состояние, когда роутер ещё не начал посылать Hello пакеты для поиска соседей.
  2. Init — как только роутер отправляет свой первый Hello пакет соседу, то он переходит в состояние Init и начинает ждать Hello пакеты от соседей.
  3. TwoWay — в этом состоянии соседи могут остаться, но только в broadcast среде и если их больше трёх. При установке соседских отношений роутеры отправляют сообщение hello друг другу два раза. Первый раз чтобы нащупать соседа, а второй раз, чтобы сообщить соседу о том, что его заметили и с ним хотят дружить. Во втором hello пакете роутер посылает Router ID соседа. И если роутер видит в этом пакете свой Router ID, то он переходит в TwoWay. Другими словами, в этом состоянии роутер знает, что сосед про него знает. Также в этом состоянии проходят выборы за роль DR и BDR (об этом ниже).
  4. Exstart – здесь роутеры договариваются о том, кто первый начнет обмен. Для этого из двух соседей выбирается главный роутер (master), и второстепенный (slave). Главным становится тот роутер, у которого Router ID больше.
  5. Exchange – роутеры начинают обмениваться DBD пакетами. При этом master посылает DBD первым, то есть сообщает, какие у него есть соседи.
  6. Loading – переход в это состояние происходит тогда, когда роутер осознает, что в его LSDB не хватает части маршрутной информации. То есть соседа он уже знает, нужно узнать какие сети обслуживает сосед и какие у него есть соседи, и какие сети есть у соседей. В этом состояние роутер отсылает LSR запросы. И в ответ он получает LSU ответы, и наполняет свою базу LSDB.
  7. 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 .