16.03.2016

Маршрутизация. OSPF в Mikrotik RouterOS

По Вики: OSPF(англ. Open Shortest Path First) — протокол динамической маршрутизации, основанный на технологии отслеживания состояния канала (link-state technology) и использующий для нахождения кратчайшего пути алгоритм Дейкстры.


Для чего нужен OSPF и как применять его на сетях, построенных на Mikrotik RouterOS, мы и рассмотрим в этой статье.


Все, кто работал с сетями, имеющими более одной подсети (провайдеры, компании с филиалами, несколько vlan и т.д.) знают о необходимости существования маршрутов из одной сети в другую. Иначе пакеты в соединении будут просто улетать на шлюз по умолчанию и дропаться где-то в интернете.


Для тех же, кто с этим не знаком, поясню. Представьте, что мы внезапно захотели попасть из Челябинска в Киев, не имя при этом ни карты, ни навигатора. Поедем по указателям - не зря же их ставили.
def3152d41f310537ded5b5e85f98024.jpg
Таким образом посмотрев на 10-20-100 укзателей мы рано или поздно доберемся до Киева - пакет от отправителя ушел к адресату. Сделали там все свои дела и захотели обратно домой в Челябинск - приложение обработало пакет и отправило ответ инициатору соединения. Но дорогу то мы не помним (в пакете нет никаких данных о прохождении пути. На самом деле есть намеки на это, но с помощью них нельзя восстановить путь пакета). Не беда - поедем по указателям.
d-3.jpg
Так же как и в первый раз мы каким-то образом вернемся в точку, из которой выехали. Причем, очень важно то, что вернуться мы можем по другим дорогам - на каких то начали укладывать асфальт за время нашего пребывания в Киеве и поставили знаки объезда, где-то просто затор и мы решили объехать по менее нагруженным трассам. Но мы все равно доберемся до места, пусть и затратив большее время.


Итак, мы, инкапсулированные в автомобиль - это данные, инкапсулированные в IP-пакет. Перекрестки на дороге - маршрутизаторы, подключенные к разным сетям (дорогам). А указатели на перекрестках - таблицы маршрутизации отдельных маршрутизаторов, знающие куда повернуть, чтобы попасть в ту или иную точку. И если в одну сторону мы доедем по указателям, а в другую указателей не будет, то пиши пропало - до исходной точки не доберемся. Значит, маршруты до общающихся сетей должны быть прописаны на обеих сторонах. И очень важно понимать, что дорог-маршрутов может быть несколько. И если один перекресток-маршрутизатор в ремонте, то предыдущий может послать нас в объезд, но сначала он должен узнать, что его сосед сломался. И если мы ездим по разным дорогам, значит и время пинга у нас будет разное.


Итак, с маршрутами разобрались. Теперь поговорим о дорожниках, ставящих указатели.


Статические указатели на дорогах - хорошо. Но расстояние между Челябинском и Киевом 2400 км. А значит и указателей должно быть не меньше 24 - по одному на каждые 100 км. И если на одном из перекрестков идет ремонт, необходимо внести изменения на два смежных указателя. А вероятность одновременного ремонта на 24 перекрестах весьма высока. То есть нужна отдельная бригада дорожников, меняющих указатели.


Было бы неплохо соединить все указатели в  сеть и позволить им самим оценивать ситуацию на своих участках и передевать эти данные между собой. К сожалению великие и ужасные службы обслуживания дорог об этом ещё не додумались, да и вряд ли это надо - деньги то пилить не получится. А вот айтишники придумали технологии, позволяющие динамически изменять таблицы маршрутизации и обмениваться этой информацией. Эти технологии называются Протоколы Динамической Маршрутизации. И один из них - OSPF, предназначенный для обмена информацией внутри одной автономной системы - AS.


Термины и работа OSPF хорошо описаны в вики микротика. Но я осмелюсь кое-что повторить и перефразировать.
Допустим, есть следующая сеть.
Как видим, к сети 172.16.1.0 можно попасть двумя путями: через R2  и через связку R3+R4. Cost’ы, написанные возле каждого линка задают стоимость линка, своеобразный аналог параметра distance в ip-route. Чем ниже значение cost’а, тем выше вероятность того, что трафик пойдет по этому пути. Но как видно на следующем рисунке суммарная стоимость обоих маршрутов к сети 172.16.1.0 составляет 20. Так по какому же пути пойдет трафик?
500px-Sp-tree.png
В таком случае в таблице маршрутизации увидим примерно такую картину - к одной сети имеем два шлюза. И трафик должен пойти через оба шлюза. В этом случае мы можем управлять тем, куда пойдет трафик. Называется эта технология Policy Based Routing, но тема управления трафиком выходит за рамки этой статьи.
Сделать, чтобы OSPF “заработал” в Mikrotik RouterOS очень просто - нужно лишь добавить в backbone на каждом роутере в Routing - OSPF - Networks все ваши сети, между которыми вы хотите динамическую маршрутизацию и “оно заработает”.


Но мы ведь хотим управлять процессом. Тот, кто не хочет управлять дальше может не читать. Остальным - добро пожаловать!


Рассматривать будем сеть, типичную для организации с несколькими филиалами. Имеем центральный офис (Headquarter на схеме, для краткости будем звать его ЦО) с сетью 192.168.0.0/24 (что я, кстати, не рекомендую при дефолтных настройках OSPF. Почему - скажу ниже). В ЦО расположены все основные элементы инфраструктуры - контроллер домена, сервер удаленного доступа, почтовый сервер и т.д. Все филиалы должны иметь доступ ко всем этим сервисам.


Несколько филиалов (Branche на схеме, для краткости - СП - Структурное Подразделение) с адресами 192.168.X.0/24. Между ЦО и каждым СП шифрованный туннель SSTP (или любой другой VPN)  - адреса в туннелях из подсети 192.168.255.0/24 (192.168.255.10 - ЦО, 192.168.255.1 - СП1, 192.168.255.2 - СП2, ...). Между филиалами связь не нужна, т.к. все службы в ЦО. Когда филиалов 3, нам легко добавить 3 маршрута на роутер в ЦО и по одному на каждый из роутеров СП. Итого 6 движений мышкой. А что если СП у нас не 3, а 33 и необходимы маршруты от каждого каждому, а ещё есть подрядчики с доступом к нескольким СП? Тут и приходит на помощь OSPF.




Кому надо “быстро и пофиг как оно работает”, могут пойти по схеме, предложенной выше - добавить в backbone все свои сети.


Почему именно backbone? Backbone в переводе с английского - хребет, позвоночник. OSPF оперирует понятиями Area (область), Autonomous System (AS, автономная система). AS - все сети, которые принадлежат вам и между которыми может работать ваш протокол динамической маршрутизации. Area - часть этой сети. На картинке ниже показана одна AS с тремя Area, одна из которых - backbone (Area 0 с ID 0.0.0.0). Каждая Area имеет свой ID, похожий на IP адрес. Backbone всегда имеет ID 0.0.0.0. Все области в OSPF должны иметь линк с backbone. Иначе ничего работать не будет.
slide1.jpg


В нашем примере мы решили долго не думать и загнать все в backbone. По большому счету это ничем не грозит и работать будет. Но если провайдер отдает одному из ваших филиалов частный адрес из 192.168.0.0/16 (192.168.18.27/29, например), то в вашей таблице маршрутизации появится сеть провайдера. И если кто-то с другой стороны провайдера использует такие же настройки (или просто указал маршрут к вашим сетям), то он сможет беспрепятственно попасть в вашу сеть. А уж случайно это сделали или намеренно - узнаете когда данные из вашей БД всплывут в интернете.


В этом случае можно использовать авторизацию на каждом интерфейсе Routing - OSPF - Interfaces.
Или указать, что интерфейс, смотрящий к провайдеру будет в пассивном режиме.


Теперь поговорим о том, как сделать “правильно” - не вещать свои сети куда попало и позволить грамотно траблшутить работу OSPF.
Как мы говорили выше, каждая область имеет свой ID. Также и каждый участник OSPF имеет свой ID. По умолчаню он выставляется автоматически и выбирается из IP адресов, присвоенных интерфейсам роутера. Но нам надо проставить его в ручную, чтобы была какая-то логика в именовании и мы всегда знали откуда пришел запрос. Ставится это в Routing - OSPF - Instances - Router ID.


В нашей схеме имеется несколько областей. Как мы выяснили, основная область, соединяющая все остальные - backbone. Именно в этой области летают пакеты от одного роутера к другому, позволяющие обмениваться маршрутной информацией. Значит, этой областью должны быть туннели, соединяющие СП и ЦО, что видно на рисунке ниже.



Таким образом, нам необходимо выделить на каждом маршрутизаторе по две зоны - backbone и свою локальную сеть. На примере ЦО:
routing ospf area add name=Area0 area-id=192.168.0.0
routing ospf network add area=Area0 network=192.168.0.0/24
routing ospf network add area=backbone network=192.168.255.0/24


И точно так же на остальных маршрутизаторах, только заменив Area-ID, Area name и network на свои.


Теперь на каждом маршрутизаторе можем увидеть маршруты ко всем остальным сетям с буквами D и o в описании, что означает, что эти маршруты D - динамические (прилетели в резудльтате работы протоколов динамической маршрутизации) и o - из протокола  OSPF.
SP2_2.PNG

Таким образом мы произвели простую и надежную настройку протокола динамической маршрутизации. У OSPF ещё имеется куча дополнительных настроек, таких как приоритет роутера, стоимость интерфейса, время определения состояний и многое, многое другое. Это позволяет очень гибко настроить маршрутизацию под свои нужды, но тема эта очень обширная и выходит за рамки этого и так очень растянувшегося поста. Если читатели проявят желание, то в будущем можно будет подробно расписать (почти) все нюансы применения OSPF.


Картинки с wiki.mikrotik.com, blog.globalknowledge.com и других ресурсов, а также свои скриншоты и схемы, нарисованные с помощью сервиса draw.io


Статья написана мной для lanmarket.ua

28 комментариев:

  1. Этот комментарий был удален автором.

    ОтветитьУдалить
  2. Спасибо за дельную статью.
    Есть хедофис и примерно с десяток бранчей. Все пока живёт на циске, но каналы расширяются и циски не справляются. Апгрейд цисок весьма затратное дело. Решил переползать на Микротик. Но тут нет dmvpn, что печально. Почесал репу, решил в центре юзать l2tp сервер с ipsec. На бранчах клиенты. За маршрутизацию отвечает ospf. В каждой точке два ISP, соответственно будет два туннеля на центр. Вот тут и возникает вопрос с областями ospfными. Мне эти две туннельных сети запхать в бекбон, но на резервных туннельных интерфейсах больше поставить стоимость? Или как-то по другому...

    ОтветитьУдалить
    Ответы
    1. Именно так! Не забудьте только на обратной стороне (на стороне VPN-сервера) стоимость прибавить, чтобы трафик ходил предсказуемо в обе стороны.

      Удалить
  3. Добрый день. Может кто подскажет, где можно найти пример хотя бы самой простой настройки ospf между microTik и CISCO, для начала? А то поднимаю OSPF на microTik приходят маршруты, а на CISCO нет.

    ОтветитьУдалить
    Ответы
    1. Примеры были на хабре. А Mikrotik у вас маршруты то отдает? Поставьте вместо Cisco Mikrotik и проверьте работоспособность. А когда будете уверены - меняйте один микротик на Cisco.

      Удалить
  4. Анонимный31.01.2017, 12:09

    Добрый день!
    Можно поподробнее про вот это:
    Но если провайдер отдает одному из ваших филиалов частный адрес из 192.168.0.0/16 (192.168.18.27/29, например), то в вашей таблице маршрутизации появится сеть провайдера

    ОтветитьУдалить
    Ответы
    1. Мы занесли в backbone всю 192.168.0.0/16, значит любая подсеть из 192.168.0.0/16, подключенная к нашим роутерам, будет анонсироваться ко всем нашим роутерам.

      То есть, если вдруг провайдер отдает вам адрес 192.168.0.123/24, то эта подсеть (192.168.0.0/24) будет анонсироваться на все ваши девайсы.
      Чтобы этого не происходило, нужно либо уменьшат бэкбон, либо использовать роутинг фильтры.

      Понятно объяснил?

      Удалить
  5. http://lanmarket.ua/stats/protokol-dinamicheskoy-marshrutizacii-OSPF украли статью у вас :(

    ОтветитьУдалить
    Ответы
    1. Спасибо за внимание и предупреждение, но эта статья писалась мной для них, о чем я написал в последней строчке. У нас был договор, что после публикации на их ресурсе я могу размещать текст у себя.
      Получилось так, что ко мне народу больше заходит по этой теме =)

      Удалить
  6. Спасибо за статью! А если использовать openvpn (ip или ether)тунель, какой тип ospf использовать point to point, broadcast?

    ОтветитьУдалить
    Ответы
    1. c ether точно broadcast. А в ip не уверен. Не работал с OVPN. Если там линк точка-точка создается , то point-to-point. Скорее всего, так оно и есть.

      Удалить
  7. Анонимный10.07.2017, 12:56

    почему-то ospf не анонсирует сеть когда когда активируется резервный vpn (gprs). Полагаю из-за плохого коннекта. играюсь с таймаутами в ospf интерфейс, без толку. Хотя соседи видны. но сеть не анонсирует. на других точках, где gprs по лучше такой проблемы не замечено

    ОтветитьУдалить
    Ответы
    1. Слишком мало данных. Непонятно что и куда анонсируете и при чем тут GPRS.
      В GPRS интерфейс и не должно анонсироваться при правильной архитектуре.

      Удалить
    2. есть ISP1 - eth1, белый адрес.
      есть ISP2 через usb 4g-модем. модем работает как роутер с белым адресом. А микротик получает от него адрес вида 192.168.1.2
      Так вот по этим двум канал проброшены туннели в ГО. gre over ipsec. настроена ospf, где доступ в локальную сеть ГО идет через эти два туннеля.
      Столкнулся с проблемой, когда падает isp 1, то через тоннель резервного канала (4g-модем) не строится маршрут в локалку ГО. Объектов много, не везде такая проблема, в основном там, где gprs медленный, но тем не менее, стабильный (войти тимвьювером на машину можно)

      Удалить
  8. Анонимный25.07.2017, 0:08

    А если существует вариант когда нужна связанность всех со всеми? Какие изменение нужно внести в конфигурацию?

    И еще вопрос - адрес backbone сети выбирается произвольный? (понятно что он должен быть одинаковый на всех роутерах)

    ОтветитьУдалить
    Ответы
    1. Адреса в backbone - любые. ID backbone обязательно должен быть 0.0.0.0
      Связность всех со всеми: нужно либо на всех роутерах включить Redistribute-connected, либо добавить сети, необходимые к анонсированию в OSPF Networks. Но это не очень правильно. Нужно смотреть на конкретную конфигурацию. Если пришлете подробную схему с описанием, то постараюсь помочь.

      Удалить
  9. А. Дмитрий01.08.2017, 3:44

    Можно поподробнее про адреса backbone пожалуйста. Что это за адреса, по каким принципам назначаются, и у Вас "name=Area0 area-id=192.168.0.0", а тут Вы говорите "ID backbone обязательно должен быть 0.0.0.0" ???

    ОтветитьУдалить
    Ответы
    1. А. Дмитрий01.08.2017, 3:54

      дошло Area0 локальная сеть, просто в других местах Area0 обычно backbone, но все таки не совсем понятно что это за адреса, например если 2 маршрутизатора соеденены IPsec

      Удалить
    2. Адреса backbone - те адреса, которые будут в backbone, адреса в других областях - те, которые участвуют в OSPF, но не backbone. Принципов адресации не существует, просто добавляете в опорную область ip-адреса интерфейсов, которые участвуют в backbone.
      Объяснил как смог. Если непонятно - пишите, попробую объяснить по-другому.

      Удалить
  10. Анонимный05.09.2017, 3:10

    Добрый день. Хочу настроить ospf между офисами, в данный момент в центральном офисе поднят сервер pptp и клиенты из трех остальных офисов подключаются как pptp клиенты, есть два интернет провайдера, оба настроены на переключение через netwatch, хочу сделать что бы при падении интернет канала связь вообще не терялась (по vpn). Какой минимальный набор действий в ospf? Спасибо.

    ОтветитьУдалить
    Ответы
    1. 1. В instance ставите redistribute-connected=as-type-1
      2. В networks добавляете подсети туннелей

      Но учтите, что это самая простая конфигурация. Можете что-то ненужное переслать. Но попробовать можно, конечно

      Удалить
  11. Здравствуйте!
    Помогите советом. Имею несколько роутеров объединенных в сеть. Один из них имеет выход в интернет. Каждый роутер выступает в качестве VPN-сервера и к нему подключаются другие устройства по допустим ppppoe.Ай пи адреса pppoe эти устройства получают из одного пула.На каждом роутере в таблице маршрутизации для каждого IP адреса получаемого по pppoe прописан статический маршрут. Так как у меня часто меняется местоположение подключаемых устройств, постоянно приходится изменять маршруты в таблицах. Хочу попробовать динамическую маршрутизацию. Добавил интерфейсы роутеров соединенные между собой в backbone, на каждом роутере создал area с id той локальной сети что есть на этом роутере. В таблице маршрутизации все маршруты появились.пинги ходят. А как быть с теми кто по pppoe подключается? Их в отдельную area? Разделить на подсети пул выдаваемый по VPN не представляется возможным.

    ОтветитьУдалить
    Ответы
    1. В instance укажите redistribute connected as-type-1

      Удалить
  12. Анонимный16.10.2017, 19:50

    В Вашем примере (последняя схема) в центральном офисе будет несколько туннелей с адресами в сети 192.168.255.0 и все они создадут шлюзы в эту сеть, работать причем будет только последний, как это предполагается разруливать?

    ОтветитьУдалить
    Ответы
    1. Не понял вопроса. Можно поподробнее?

      Удалить
  13. Анонимный16.10.2017, 22:38

    Уже сам понял. Надо каждый туннельчик в /30 сети делать, а бэкбоне своей сетью должен охватывать их все.

    ОтветитьУдалить
    Ответы
    1. Можно даже в /32. Когда указываете в ppp profile требуемый пул. Тогда каждый туннельчик будет в /32 и сэкономите кучу адресов. Естественно, если у вас PPP туннели. С GRE такое не прокатит (хотя там тоже нюансы типа /31)

      Удалить
  14. Этот комментарий был удален автором.

    ОтветитьУдалить