В этой статье мы будем использовать 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).
Состояния соседства:
- 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, а не каждый с каждым.