MikroTik Миграция OSPF настроек из 6 в 7

Как бы долго мы бы ни откладывали переход на новую версию RouterOSv7, но рано или поздно это необходимо будет сделать.

Задача данной статьи только для того, чтобы знать какие настройки зеркальны относительно версий, и в данной статье я не буду разбирать для чего каждая настройка, так как если вы читаете эту статью, то вы должны знать, для чего каждая настройка.

Для простоты понимания возьмём простую схему сети в виде кольца и настроим как-то маршрутизаторы на версии RouterOSv6.

Васильев Кирилл Простая схема сети для понимания.
Простая схема сети для понимания.

И так у нас простая схема “кольцо”, где каждый маршрутизатор имеет соединение со своими соседями “по левую и правую руку”, тем самым такая схема формирует кольцо из четырёх маршрутизаторов. В нашей схеме для транспортных сетей используется адресация 192.168.X.0/24, где X это просто порядковый номер по часовой стрелке от одного до четырёх.

Как было в RouterOS v6

На каждом маршрутизаторе создан loopback интерфейс на который назначен IP адрес с маской /32 и из префикса 172.31.255.0/24. Последний октет меняется в зависимости от номера маршрутизатора.

Пример настройки для маршрутизатора R1

/interface bridge 
add name=br-Lo
/ip address
add address=192.168.2.1/24 interface=ether2
add address=192.168.4.1/24 interface=ether3
add address=172.31.255.1/32 interface=br-Lo
/routing ospf instance
set [ find default=yes ] redistribute-connected=as-type-1 router-id=172.31.255.1
/routing ospf interface
add passive=yes
add interface=ether2 network-type=broadcast
add interface=ether3 network-type=broadcast
/routing ospf network
add area=backbone network=192.168.2.0/24
add area=backbone network=192.168.4.0/24

Разберём по порядку, чтобы не осталось вопросов в данной самой простой реализации и запуск протокола OSPF. Первым делом создаём loopback в данном действии не должно появиться вопросов, следующим шагом задаём адресацию на интерфейсах, ethernet интерфейсы соединяют маршрутизаторы между собой согласно нашему плану, четвёртый октет соответствует номеру маршрутизатору, задаётся адрес loopback он должен быть /32.

Далее изменяем instans ospf по умолчанию, который присутствует и имеет какие-то значения по умолчанию, мы указываем что router-id будет точно таким же как и адрес нашего loopback интерфейса, и устанавливаем редистрибуцию connected маршрутов, редистрибуция нам нужна для того, чтобы маршрутизаторы могли достучаться до адресов loopback-ов.

Следующим шагом создаем шаблон интерфейсов ospf. Шаблон позволит нам избежать ошибки и не запустить процесс ospf для отправки и приёма пакетов ospf (89-протокол) на интерфейсах адресация который попадает под префикс обозначенный в ospf network. Добавляем интерфейсы, которые обеспечивают связь между маршрутизаторами и так же в конце добавляем наши сети в backbone, тем самым непосредственно запускаем процесс ospf на интерфейсах.

Необходимо убедиться, что ospf работает

Вывод таблицы маршрутизации на маршрутизаторе R2

[admin@R2] > /ip route print 
Flags: X - disabled, A - active, D - dynamic, 
C - connect, S - static, r - rip, b - bgp, o - ospf, m - mme, 
B - blackhole, U - unreachable, P - prohibit 
 #      DST-ADDRESS        PREF-SRC        GATEWAY            DISTANCE
 0 ADo  172.31.255.1/32                    192.168.1.1             110
 1 ADC  172.31.255.2/32    172.31.255.2    br-Lo                     0
 2 ADo  172.31.255.3/32                    192.168.2.3             110
 3 ADo  172.31.255.4/32                    192.168.2.3             110
 4 ADC  192.168.1.0/24     192.168.1.2     ether2                    0
 5 ADC  192.168.2.0/24     192.168.2.2     ether3                    0
 6 ADo  192.168.3.0/24                     192.168.2.3             110
 7 ADo  192.168.4.0/24                     192.168.2.3             110

Как видите все необходимые intra-area маршруты добавились в таблицу маршрутизации, а также и внешний ext маршруты до loopback-ов добавлены в таблицу маршрутизации.

Обновление до RouterOS v7

Кто был у меня на курсах или знает меня лично, то знает, что я не люблю предустановленных производителем правил или процедур. Которые могут поменяться, поэтому я не буду использовать процедуру обновления конфигурации, а вместо этого руками настроем всё, что необходимо.

Предположим, что маршрутизатор R3 заменили на железку под управлением RouterOS v7 c этого и начнём и сразу будем разбивать на части с описанием, чего и почему так.

Настройка IP адресации и основы на R3

/interface bridge
add name=br-Lo
/ip address
add address=192.168.3.3/24 interface=ether3 
add address=192.168.2.3/24 interface=ether2 
add address=172.31.255.3 interface=br-Lo

Здесь нет смысла чего-либо объяснять, сразу продолжим.

Router ID

В RFC предложено использовать наименьший IP адрес на маршрутизаторе. Я категорически против такого подхода, ввиду того что, значение Router ID должно быть уникальной во всей AS. Подключенный lte модем в двух концах сети могут сломать всю сеть и по моей бы воли, я бы запретил динамически устанавливать данное значение, но слава богу я всего лишь потребитель, а не разработчик. По умолчанию в седьмой версии уже есть процесс выбора Router ID, но мы создадим свой, так как нам нужно ожидаемое поведение, а дефолтные правила не лучший кейс менять.

Создание записи Router Id в RouterOS v7

/routing id
add disabled=no id=172.31.255.3 name=br-Lo 

В седьмой версии, нельзя указать Router ID в instansce, теперь это вынесено в одеяльный раздел и в instance можно сослаться на конкретную запись, удобнее в том понимании, что если вы используете несколько протоколов например bgp и ospf чтобы внутренние Router ID в обоих протоколах совпадали для удобства, настройка вынесена в отдельную запись.

Ospf Instance

В седьмой версии отсутствует instance по умолчанию (и слава богу), его необходимо создать, начнём с самой простой реализации.

Создание Ospf Instance на R3 в RouterOS v7

/routing ospf instance
add name=ospf-v2-1 redistribute=connected router-id=br-Lo version=2 

Я добавил значение которое по умолчанию добавляется для наглядности. В RouterOS v7 вторая и третья версия ospf “в одном флаконе” поэтому при создании instance укажите необходимую версию и не забудьте указать наш Router ID, который мы создали в прошлом шаге, также укажите какие типов маршрутов необходимо отдать как внешние (redistribute), значений больше чем в шестой версии, но по смыслу я думаю всем всё будет понятно, возможно разберу в другой статье.

Ospf Area

Ох, сколько было потерянно трафика в multiarea сетях, из-за того, что в шестой версии была по умолчанию включена backbone area и она подставлялась по умолчанию при объявлении intra-area сети. Точно так же как и все шаги до этого, area необходимо создать и создавать мы будем backbone конечно, так как в нашей сети именно он нам необходим.

Создание Ospf Area на R3 в RouterOS v7

/routing ospf area
add area-id=0.0.0.0 instance=ospf-v2-1 name=ospf-1-backbone type=default

Даже нечего описывать не буду, все предельно понятно изменений логики, ноль.

Ospf Interface Template

А вот тут нас ждут нововведения и приличные, если взглянуть на шестую версию, там тоже был шаблон под именем all, то теперь в седьмой версии вы можете использовать интерфейс листы, согласитесь интерфейс листы это удобнее и элегантнее, но не всегда тут конечно вы всегда должны найти компромисс между удобство, элегантностью и функционалом.

Создание Interface List на R3

/interface list
add name=ospf-1-backbone
/interface list member
add interface=ether2 list=ospf-1-backbone
add interface=ether3 list=ospf-1-backbone

А теперь создадим шаблон на основе нашего листа. Обратите внимание вы можете указать несколько интерфейсов или несколько листов, а может и листы, и интерфейсы, и при этом, на тех интерфейсах адресация которых попадает под префикс или префиксы будет запущен протокол ospf. Так же в RouterOS v7 cost интерфейса по умолчанию равен единице (1) в отличие от шестой версии, где значения cost было десять (10). Также изменилось и значение priority для выбора DR и BDR в шестой версии было значение единица (1), а в седьмой 128, если вы крутили priority то имейте в виду.

Создание Interface Template на R3 в RouterOS v7

/routing ospf interface-template
add area=ospf-1-backbone interfaces=ospf-1-backbone networks=192.168.2.0/24,192.168.3.0/24 cost=10 priority=1

Если вам нужны разные cost на интерфейсах или priority, то объединение по листам уже вам не поможет, хотя можно объединить в листы по cost, но это надо посидеть и подумать, как с таким жить дальше. Вы можете и не указывать сети - это эквивалентно 0.0.0.0/0 и тогда протокол ospf будет запущен на всех интерфейсах, которые указаны в шаблоне.

Таблица маршрутизации RouterOS v7

[admin@R3] /ip/route> print 
Flags: D - DYNAMIC; A - ACTIVE; c, o, y - COPY; + - ECMP
Columns: DST-ADDRESS, GATEWAY, DISTANCE
     DST-ADDRESS      GATEWAY             DISTANCE
DAo+ 172.31.255.1/32  192.168.2.2%ether2       110
DAo+ 172.31.255.1/32  192.168.3.4%ether3       110
DAo  172.31.255.2/32  192.168.2.2%ether2       110
DAc  172.31.255.3/32  br-Lo                      0
DAo  172.31.255.4/32  192.168.3.4%ether3       110
DAo  192.168.1.0/24   192.168.2.2%ether2       110
DAc  192.168.2.0/24   ether2                     0
DAc  192.168.3.0/24   ether3                     0
DAo  192.168.4.0/24   192.168.3.4%ether3       110

Собственно всё, мы настроили конфигурацию руками так, чтобы она полностью повторяла конфигурацию из RouterOS v6

Мелочи и не только

Поехали дальше по мелочам.

Ospf Redistribute Type в RouterOS v7

Если вы не заметили, то ещё одно существенное различие, это отсутствует возможность установки типа внешнего маршрута type-1 (E1) или type-2 (E2), теперь в отличие от шестой версии мы можем устанавливать тип на разные маршруты, основываясь на различных параметрах фильтруемого маршрута, делается сие безумство с помощью фильтров.

Внешний маршрут от R3

[admin@R2] /ip route print detail where dst-address=172.31.255.3/32
Flags: X - disabled, A - active, D - dynamic, 
C - connect, S - static, r - rip, b - bgp, o - ospf, m - mme, 
B - blackhole, U - unreachable, P - prohibit 
 0 ADo  dst-address=172.31.255.3/32 gateway=192.168.2.3 
        gateway-status=192.168.2.3 reachable via  ether3 distance=110 scope=20 target-scope=10 
        ospf-metric=11 ospf-type=external-type-1 

Обратите внимание по умолчанию в седьмой версии внешние маршруты распространяются как type-1 (E1) и похоже (это не точно), что стартовая метрика ровна единице (1) во [.line-through]#всех# многих случаях (проверил только в static, default и connected маршрутах)

Добавим ещё один адрес на loopback, чтобы он был connected и попробуем “сделать красиво”

Добавляем connected маршрут на R3

[admin@R3] > /ip/address/add address=172.31.255.33 interface=br-Lo

Установка исходящего фильтра ospf в RouterOS v7

[admin@R3] > /routing/ospf/instance/set out-filter-chain=ospf-out ospf-v2-1

В отличие от шестой версии в седьмой фильтры по умолчанию имеют действие reject, поэтому все внешние маршруты от R3 после указания фильтра сразу попали под фильтр и исчезли со всех маршрутизаторов.

Отсутствует маршрут до loopback-а третьего маршрутизатора.

[admin@R2] > /ip route print 
Flags: X - disabled, A - active, D - dynamic, 
C - connect, S - static, r - rip, b - bgp, o - ospf, m - mme, 
B - blackhole, U - unreachable, P - prohibit 
 #      DST-ADDRESS        PREF-SRC        GATEWAY            DISTANCE
 0 ADo  172.31.255.1/32                    192.168.1.1             110
 1 ADC  172.31.255.2/32    172.31.255.2    br-Lo                     0
 2 ADo  172.31.255.4/32                    192.168.1.1             110
 3 ADC  192.168.1.0/24     192.168.1.2     ether2                    0
 4 ADC  192.168.2.0/24     192.168.2.2     ether3                    0
 5 ADo  192.168.3.0/24                     192.168.1.1             110
 6 ADo  192.168.4.0/24                     192.168.1.1             110

Конечно правильнее было подготовить фильтры заранее, и вместе с ними настроить ospf, но сейчас я не об этом, поэтому опустим данную информацию.

Создадим самый простой фильтр

Простейший фильтр разрешающий все маршруты в RouterOS v7

[admin@R3] /routing/filter/rule add chain=ospf-out rule=accept 

А наши маршруты полетели в сеть OSPF, но лично мне этого мало.

Поменяем метрику у разных маршрутов в RouterOS v7

/routing filter rule
add chain=ospf-out disabled=no rule="if (dst==172.31.255.3) {set ospf-ext-metric 100; accept}"
add chain=ospf-out disabled=no rule="if (dst==172.31.255.33) {set ospf-ext-metric 200; accept}"

И конечно проверим на R2

Таблица OSPF маршрутов на R2

[admin@R2] > /routing ospf route print 
 # DST-ADDRESS        STATE          COST         GATEWAY         INTERFACE     
 0 172.31.255.1/32    ext-1          30           192.168.1.1     ether2        
 1 172.31.255.2/32    imported-ext-1 20          
 2 172.31.255.3/32    ext-1          110          192.168.2.3     ether3        
 3 172.31.255.4/32    ext-1          21           192.168.1.1     ether2        
                                                  192.168.2.3     ether3        
 4 172.31.255.33/32   ext-1          210          192.168.2.3     ether3        
 5 192.168.1.0/24     intra-area     10           0.0.0.0         ether2        
 6 192.168.2.0/24     intra-area     10           0.0.0.0         ether3        
 7 192.168.3.0/24     intra-area     20           192.168.2.3     ether3        
 8 192.168.4.0/24     intra-area     20           192.168.1.1     ether2

Как видите, теперь это возможно, т.е. у нас появилась возможность тонко управлять маршрутной информацией.

Поменяем тип внешнего маршрута на type2 (E2) в RouterOS v7

[admin@R3] /routing/filter/rule> add chain=ospf-out rule="if (dst==172.31.255.33){set ospf-ext-type type2}" place-before=0

Закрепляем результат проверкой на R2

Таблица OSPF маршрутов на R2

[admin@R2] > /routing ospf route print 
 # DST-ADDRESS        STATE          COST         GATEWAY         INTERFACE     
 0 172.31.255.1/32    ext-1          30           192.168.1.1     ether2        
 1 172.31.255.2/32    imported-ext-1 20          
 2 172.31.255.3/32    ext-1          110          192.168.2.3     ether3        
 3 172.31.255.4/32    ext-1          21           192.168.1.1     ether2        
                                                  192.168.2.3     ether3        
 4 172.31.255.33/32   ext-2          200          192.168.2.3     ether3        
 5 192.168.1.0/24     intra-area     10           0.0.0.0         ether2        
 6 192.168.2.0/24     intra-area     10           0.0.0.0         ether3        
 7 192.168.3.0/24     intra-area     20           192.168.2.3     ether3        
 8 192.168.4.0/24     intra-area     20           192.168.1.1     ether2

Как видите теперь это возможно!

Мой дефолт

Я предпочитаю устанавливать дефолтный набор правил фильтров в шестой версии.

Набор правил фильтров aka Vasilev Kirill

/routing filter
add action=accept chain=ospf-in prefix=172.16.0.0/12 prefix-length=24
add action=accept chain=ospf-in prefix=172.16.0.0/12 prefix-length=32
add action=accept chain=ospf-in prefix=10.0.0.0/8 prefix-length=24
add action=accept chain=ospf-in prefix=192.168.0.0/16 prefix-length=24
add action=discard chain=ospf-in
add action=accept chain=ospf-out prefix=172.16.0.0/12 prefix-length=24
add action=accept chain=ospf-out prefix=172.16.0.0/12 prefix-length=32
add action=accept chain=ospf-out prefix=10.0.0.0/8 prefix-length=24
add action=accept chain=ospf-out prefix=192.168.0.0/16 prefix-length=24
add action=discard chain=ospf-out

Данные правила защищают маршрутизатор от ошибок на других маршрутизаторах, так же и защищают вашу сеть от ошибок на маршрутизаторе, на котором данные фильтры установлены. По большой части разрешается на вход и выход 24-е маршруты из трёх публичных внутренних BOGON сетей, а также в дополнение разрешается на вход и выход адреса loopback-ов, которые я обычно делаю в 172.16… сети.

Давайте сделаем то же самое, но под синтаксис RouterOS v7

.aka Vasilev Kirill в RouterOS v7

/routing filter rule
add chain=ospf-out disabled=no rule="if (dst-len==24 && dst==172.16.0.0/12) {accept}"
add chain=ospf-out disabled=no rule="if (dst-len==32 && dst==172.16.0.0/12) {accept}"
add chain=ospf-out disabled=no rule="if (dst-len==24 && dst==192.168.0.0/16) {accept}"
add chain=ospf-out disabled=no rule="if (dst-len==24 && dst==10.0.0.0/8) {accept}"
add chain=ospf-in disabled=no rule="if (dst-len==24 && dst==172.16.0.0/12) {accept}"
add chain=ospf-in disabled=no rule="if (dst-len==32 && dst==172.16.0.0/12) {accept}"
add chain=ospf-in disabled=no rule="if (dst-len==24 && dst==192.168.0.0/16) {accept}"
add chain=ospf-in disabled=no rule="if (dst-len==24 && dst==10.0.0.0/8) {accept}"

Обратите внимание. Что фильтры на instance по умолчанию не указаны, надо указывать явным образом, также так как в RouterOS v7 фильтры по умолчанию имеют действие reject, то отпадает необходимость использовать запрещающие правила в конце.

Подсматриваем

Конечно, без понимания, кто куда, как и что прислал или отправил в ospf тяжело, вот сейчас и попробуем разобраться.

Состояние интерфейсов OSPF в RouterOS v7

[admin@R3] /routing/ospf/interface print detail 
Flags: D - dynamic 
 0 D address=192.168.2.3%ether2 area=ospf-1-backbone state=bdr network-type=broadcast dr=192.168.2.2 cost=10 priority=1 retransmit-interval=5s 
     transmit-delay=1s hello-interval=10s dead-interval=40s 

 1 D address=192.168.3.3%ether3 area=ospf-1-backbone state=bdr network-type=broadcast dr=192.168.3.4 cost=10 priority=1 retransmit-interval=5s 
     transmit-delay=1s hello-interval=10s dead-interval=40s 

.LSDB OSPF в RouterOS v7

[admin@R3] /routing/ospf/lsa/print
Flags: S - self-originated, F - flushing, W - wraparound; D - dynamic 
 0  D instance=ospf-v2-1 type="external" originator=172.31.255.1 id=172.31.255.1 sequence=0x80000006 age=136 checksum=0xC8D7 body=
        options=E
        netmask=255.255.255.255
        forwarding-address=0.0.0.0
        metric=20 type-1
        route-tag=0

 1 SD instance=ospf-v2-1 type="external" originator=172.31.255.3 id=172.31.255.3 sequence=0x80000003 age=1187 checksum=0xD17D body=
        options=E
        netmask=255.255.255.255
        forwarding-address=0.0.0.0
        metric=100 type-1
        route-tag=0

 2  D instance=ospf-v2-1 type="external" originator=172.31.255.4 id=172.31.255.4 sequence=0x80000006 age=142 checksum=0xD9D3 body=
        options=E
        netmask=255.255.255.255
        forwarding-address=0.0.0.0
        metric=1 type-1
        route-tag=0

 3 SD instance=ospf-v2-1 type="external" originator=172.31.255.3 id=172.31.255.33 sequence=0x80000003 age=719 checksum=0x1438 body=
        options=E
        netmask=255.255.255.255
        forwarding-address=0.0.0.0
        metric=200 type-2
        route-tag=0
...

Состояние смежности между соседями OSPF в RouterOS v7

[admin@R3] /routing/ospf/neighbor/print 
Flags: V - virtual; D - dynamic 
 0  D instance=ospf-v2-1 area=ospf-1-backbone address=192.168.2.2 priority=1 router-id=172.31.255.2 dr=192.168.2.2 bdr=192.168.2.3 state="Full" state-changes=6 
      adjacency=1h25m23s timeout=37s 

 1  D instance=ospf-v2-1 area=ospf-1-backbone address=192.168.3.4 priority=128 router-id=172.31.255.4 dr=192.168.3.4 bdr=192.168.3.3 state="Full" state-changes=6 
      adjacency=1h25m22s timeout=39s 

Таблица маршрутизации OSPF в RouterOS v7

[admin@R3] /routing/route/print detail where ospf
Flags: X - disabled, F - filtered, U - unreachable, A - active; 
c - connect, s - static, r - rip, b - bgp, o - ospf, d - dhcp, v - vpn, m - modem, a - ldp-address, l - ldp-mapping, y - copy; H - hw-offloaded; 
+ - ecmp, B - blackhole 
 Ao + afi=ip4 contribution=active dst-address=172.31.255.1/32 routing-table=main gateway=192.168.2.2%ether2 immediate-gw=192.168.2.2%ether2 distance=110 
       scope=20 target-scope=10 belongs-to="OSPF route" 
       ospf.metric=40 .tag=0 .type=ext-type-1 
       debug.fwp-ptr=0x20282300 

 Ao + afi=ip4 contribution=active dst-address=172.31.255.1/32 routing-table=main gateway=192.168.3.4%ether3 immediate-gw=192.168.3.4%ether3 distance=110 
       scope=20 target-scope=10 belongs-to="OSPF route" 
       ospf.metric=40 .tag=0 .type=ext-type-1 
       debug.fwp-ptr=0x202822A0 

 Ao   afi=ip4 contribution=active dst-address=172.31.255.2/32 routing-table=main gateway=192.168.2.2%ether2 immediate-gw=192.168.2.2%ether2 distance=110 
       scope=20 target-scope=10 belongs-to="OSPF route" 
       ospf.metric=30 .tag=0 .type=ext-type-1 
       debug.fwp-ptr=0x20282300 

 Ao   afi=ip4 contribution=active dst-address=172.31.255.4/32 routing-table=main gateway=192.168.3.4%ether3 immediate-gw=192.168.3.4%ether3 distance=110 
       scope=20 target-scope=10 belongs-to="OSPF route" 
       ospf.metric=11 .tag=0 .type=ext-type-1 
       debug.fwp-ptr=0x202822A0 

 Ao   afi=ip4 contribution=active dst-address=192.168.1.0/24 routing-table=main gateway=192.168.2.2%ether2 immediate-gw=192.168.2.2%ether2 distance=110 
       scope=20 target-scope=10 belongs-to="OSPF route" 
       ospf.metric=20 .type=intra 
       debug.fwp-ptr=0x20282300 

 Ao   afi=ip4 contribution=active dst-address=192.168.4.0/24 routing-table=main gateway=192.168.3.4%ether3 immediate-gw=192.168.3.4%ether3 distance=110 
       scope=20 target-scope=10 belongs-to="OSPF route" 
       ospf.metric=20 .type=intra 
       debug.fwp-ptr=0x202822A0 

Память OSPF в RouterOS v7

[admin@R3] /routing/stats/process print detail where tasks=ospf
Flags: A - abandoned 
 2   tasks=ospf private-mem-blocks=512.0KiB shared-mem-blocks=256.0KiB pss=597.0KiB rss=2492.0KiB vms=18.7MiB id=ospf pid=115 rpid=1 process-time=210ms 
     kernel-time=540ms max-busy=10ms max-calc=10ms

Убить процесс OSPF в RouterOS v7

[admin@R3] /routing/stats/process kill [find tasks=ospf]

Надеюсь я вам помог лучше узнать OSPF в RouterOS v7.