Mikrotik и OSPF. С чем пришлось столкнуться и как мы это побороли

в 6:36, , рубрики: mikrotik, ospf, Сетевые технологии, системное администрирование, метки: ,

Доброго времени суток. Сегодня хотелось бы рассказать о том, что не давало нам жить, взрывало нам мозг долгое время — Mikrotik и OSPF.
Mikrotik сама по себе неплохая железка, с низкой стоимостью, кучей возможностью, но к сожалению, не без недостатков.
У нас следующая схема сети:
Mikrotik и OSPF. С чем пришлось столкнуться и как мы это побороли

ROU1 — Cisco c3845
ROU2 — Cisco c3845
МТ1 — Mikrotik 1100Ahx2
МТ2 — Mikrotik 1100Ahx2
c3550 — Cisco c3550
GW68 — MikroTik RB751U-2HnD
GW69 — MikroTik RB751U-2HnD

На ROU1 и ROU2 у нас туннели до MT1 и до MT2 (IPSec пропущу), заведен процесс OSPF для backbone. Отдается подсеть 10.0.0.0/19:

Конфигурация ROU1 и ROU2
#ROU1
interface Tunnel100641
description # XXX_IRK64_YYY #
ip address 172.20.64.1 255.255.255.252
ip access-group DMZ_IN in
ip access-group DMZ_OUT out
ip mtu 1450
ip ospf network point-to-point
ip ospf cost 10
ip ospf mtu-ignore
ip ospf 1 area 0.0.0.0
tunnel source 194.x.x.x
tunnel mode ipip
tunnel destination 195.x.x.x

router ospf 1
router-id 255.255.255.255
redistribute ospf 100 metric-type 1 subnets route-map OSPF_100_to_BB
network 172.20.64.0 0.0.0.3 area 0.0.0.0

#ROU2
interface Tunnel100642
description # XXX_IRK64_YYY#
ip address 172.20.64.5 255.255.255.252
ip access-group DMZ_IN in
ip access-group DMZ_OUT out
ip mtu 1450
ip ospf network point-to-point
ip ospf cost 40
ip ospf mtu-ignore
ip ospf 1 area 0.0.0.0
tunnel source 109.x.x.x
tunnel mode ipip
tunnel destination 85.x.x.x

router ospf 1
router-id 255.255.255.254
redistribute ospf 100 metric-type 1 subnets route-map OSPF_100_to_BB
network 172.20.64.4 0.0.0.3 area 0.0.0.0

На MT1 и MT2 адреса туннелей соответственно 172.20.64.2 и 172.20.64.6. Area backbone там уже есть по умолчанию.

Конфигурация MT1 и MT2

#MT1

#Создадим туннель
/interface ipip add comment=YYY_VL03_ROU1 disabled=no local-address=195.x.x.x mtu=1450 name=ipip_yyy_vl03_rou1 remote-address=194.x.x.x

#Повесим на него адрес
/ip address add address=172.20.64.2/30 comment=YYY_VL03_XXX interface=ipip_yyy_vl03_rou1

#Поправим instance, добавив фильтры и id
/routing ospf instance set [ find default=yes ] in-filter=ospf-default-in out-filter=ospf-default-out redistribute-other-ospf=as-type-1 router-id=30.0.64.1

#Добавим подсеть в area backbone
/routing ospf network add area=backbone comment=«Backbone Network VL» network=172.20.64.0/30

#Сделаем фильтры
/routing filter add action=accept chain=ospf-default-out prefix=10.0.64.0/19
/routing filter add action=accept chain=ospf-default-out prefix=172.20.64.0/19
/routing filter add action=discard chain=ospf-default-out
/routing filter add action=accept chain=ospf-default-in prefix=10.0.0.0/19
/routing filter add action=accept chain=ospf-default-in prefix=172.20.0.0/19
/routing filter add action=discard chain=ospf-default-in

#Создадим интефейс OSPF
/routing ospf interface add authentication-key=0 interface=ipip_yyy_vl03_rou1 network-type=point-to-point priority=255

#MT2

#Создадим туннель
/interface ipip add comment=YYY_VL03_ROU2 disabled=no local-address=85.x.x.x mtu=1450 name=ipip_yyy_vl03_rou2 remote-address=109.x.x.x

#Повесим на него адрес
/ip address add address=172.20.64.6/30 comment=YYY_VL03_ROU2 interface=ipip_yyy_vl03_rou2

#Поправим instance, добавив фильтры и id
/routing ospf instance set [ find default=yes ] in-filter=ospf-default-in out-filter=ospf-default-out redistribute-other-ospf=as-type-1 router-id=30.0.64.2

#Добавим подсеть в area backbone
/routing ospf network add area=backbone comment=«Backbone Network VL» network=172.20.64.4/30

#Сделаем фильтры
/routing filter add action=accept chain=ospf-default-out prefix=10.0.64.0/19
/routing filter add action=accept chain=ospf-default-out prefix=172.20.64.0/19
/routing filter add action=discard chain=ospf-default-out
/routing filter add action=accept chain=ospf-default-in prefix=10.0.0.0/19
/routing filter add action=accept chain=ospf-default-in prefix=172.20.0.0/19
/routing filter add action=discard chain=ospf-default-in

#Создадим интефейс OSPF
/routing ospf interface add authentication-key=0 cost=40 interface=ipip_yyy_vl03_rou2 network-type=point-to-point priority=200

Но у нас должна быть еще связь между МТ1 и МТ2 напрямую.
Для этого у нас используется новая area IRK. Cisco c3550 у нас не только свитч, он у нас корневое устройство, на нем заведены все вланы, через него проброшены провайдеры, на нем создан vrf и т.д. (если будет интересно, то потом опишу всю организацию сети)
Создадим на c3550 area IRK и два vlan для соединения с MT1 и MT2. Area IRK — это главная область РУ — регионального узла, в которой работают все подключенные к РУ роутеры.

Конфигурация c3550

interface Vlan66
description # MGM 1 VLAN #
ip address 172.20.64.98 255.255.255.252
ip policy route-map test
ip ospf cost 10
ip ospf hello-interval 5
ip ospf dead-interval 10
ip ospf priority 100
!
interface Vlan67
description # MGM 2 VLAN #
ip address 172.20.64.102 255.255.255.252
ip ospf cost 10
ip ospf hello-interval 5
ip ospf dead-interval 10
ip ospf priority 50

router ospf 100
router-id 10.0.64.0
log-adjacency-changes
redistribute connected metric-type 1 subnets
redistribute static metric-type 1 subnets
network 172.20.64.96 0.0.0.3 area 10.0.64.0
network 172.20.64.100 0.0.0.3 area 10.0.64.0

#Два нульроута

ip route 10.0.64.0 255.255.224.0 Null0 250
ip route 172.20.64.0 255.255.224.0 Null0 250

Теперь примем на МТ1 и МТ2 эти vlan, и заведем новый ospf instance и area, добавим линк между MT1 и МТ2 и навешаем адрес.

Конфигурация MT1 и MT2

#МТ1
#Принимаем vlan
/interface vlan add interface=ether1 l2mtu=1594 name=vlan_66_mgm vlan-id=66

#Создаем area
/routing ospf area add area-id=10.0.64.0 instance=IRK name=IRK

#Создаем instance
/routing ospf instance add distribute-default=if-installed-as-type-1 name=IRK redistribute-other-ospf=as-type-1 redistribute-static=as-type-1 router-id=10.0.64.1

#Вешаем IP
/ip address add address=172.20.64.97/30 comment=MGM_Interface interface=vlan_66_mgm
/ip address add address=172.20.64.105/30 comment=MT-MT_Interface interface=ether2

#Добавляем подсети в area IRK
/routing ospf network add area=IRK network=172.20.64.96/30
/routing ospf network add area=IRK network=172.20.64.104/30

#Создаем ospf interface
/routing ospf interface add dead-interval=10s hello-interval=5s interface=vlan_66_mgm network-type=broadcast priority=255

#МТ2
#Принимаем vlan
/interface vlan add interface=ether1 l2mtu=1594 name=vlan_67_mgm vlan-id=67

#Создаем area
/routing ospf area add area-id=10.0.64.0 instance=IRK name=IRK

#Создаем instance
/routing ospf instance add distribute-default=if-installed-as-type-1 name=IRK redistribute-other-ospf=as-type-1 redistribute-static=as-type-1 router-id=10.0.64.2

#Вешаем IP
/ip address add address=172.20.64.101/30 comment=MGM_Interface interface=vlan_67_mgm
/ip address add address=172.20.64.106/30 comment=MT-MT_Interface interface=ether2

#Добавляем подсети в area IRK
/routing ospf network add area=IRK network=172.20.64.100/30
/routing ospf network add area=IRK network=172.20.64.104/30

#Создаем ospf interface
/routing ospf interface add dead-interval=10s hello-interval=5s interface=vlan_67_mgm network-type=broadcast priority=200

Вроде ничего не забыл, что мы получили:

1. У нас есть два туннеля до центральных роутеров, с каждого микротика по одному.
2. Cost 10 и 40 соответственно. То есть при живом основном роутере (провайдере) MT1, роут из backbone 10.0.0.0/19 мы получим через туннель до ROU1, при мертвом через туннель до ROU2
3. У нас есть прямой линк между MT1 и MT2, для того чтобы не гонять трафик всегда через c3550.

Настроили, поставили. Все работает:

#MT1
ADo dst-address=10.0.0.0/19 gateway=172.20.64.1 gateway-status=172.20.64.1 reachable via ipip_yyy_vl03_rou1 distance=110 scope=20 target-scope=10 ospf-metric=40 ospf-type=external-type-1

#MT2
ADo dst-address=10.0.0.0/19 gateway=172.20.64.105 gateway-status=172.20.64.105 reachable via ether2 distance=110 scope=20 target-scope=10 ospf-metric=50 ospf-type=external-type-1

На МТ2 роут до 10ки через ether2, как в принципе и должно быть.

Проблема №1:

Однажды, на МТ1 умирает провайдер. Подсеть 10.0.0.0/19 становится доступна через туннель до ROU2, все как должно быть:

#MT2
ADo dst-address=10.0.0.0/19 gateway=172.20.64.5 gateway-status=172.20.64.5 reachable via ipip_yyy_vl03_rou2 distance=110 scope=20 target-scope=10 ospf-metric=70 ospf-type=external-type-1

НО! Как только оживает провайдер на МТ1, мы видим следующее:

#MT1
ADo dst-address=10.0.0.0/19 gateway=172.20.64.1 gateway-status=172.20.64.1 reachable via ipip_yyy_vl03_rou1 distance=110 scope=20 target-scope=10 ospf-metric=40 ospf-type=external-type-1

#MT2
ADo dst-address=10.0.0.0/19 gateway=172.20.64.5 gateway-status=172.20.64.5 reachable via ipip_yyy_vl03_rou2 distance=110 scope=20 target-scope=10 ospf-metric=70 ospf-type=external-type-1

Видим, что каждый роутер глядит в свой туннель. Что нас совсем не устраивает. Перезагружаем МТ2. Он начинает получать роут через ether2 от МТ1. Непорядок.

В качестве временного решения, мы завели на ROU1 и ROU2 все area из региональных узлов. Все работало очень красиво, пока однажды наши циски не сказали: too many routing processes

И мы опять вернулись к проблеме с backbone. Долгие битвы с саппортом ни к чему не приводят, но в один прекрасный момент получаем ответ, что микротик при перераспределение роутов между эриями (в данном случае роут из backbone перераспределяется через IRK),
начинает некорректно инсталлировать роуты. И мы получаем картину, что каждый роутер смотрит в свой туннель.
Тогда решение приходит само:
Добавляем IP на ether2, вносим новую подсеть в backbone.

#MT1
/ip address add address=172.20.64.121/30 comment=«MT-MT BB» interface=ether2
/routing ospf network add area=backbone network=172.20.64.120/30

#Запрещаем перераспределять роут через IRK
/routing filter add action=discard chain=ospf-in prefix=10.0.0.0/19

#MT2
/ip address add address=172.20.64.122/30 comment=«MT-MT BB» interface=ether2
/routing ospf network add area=backbone network=172.20.64.120/30

#Запрещаем перераспределять роут через IRK
/routing filter add action=discard chain=ospf-in prefix=10.0.0.0/19

И получаем, что роут 10.0.0.0/19 не перераспределяется через чужую эрию, а принимается в пределах одной. Фуф, одну проблему победили.

Сейчас для рассмотрения второй проблемы, приведем конфиг GW, конфиг на МТ1 и МТ2 я опущу, там нет ничего сложного.

На рисунке у нас есть GW68 и GW69, я приведу настройки только для одного и в сокращении:

На Mikrotik 751:
ether2 — резервный провайдер
ether3 — основной провайдер
ether5 — LAN
Возникнет вопрос, почему не ether2 основной провайдер. Сделали сначала ether1 — основной провайдер, но оказалось, что порт какой-то полусофтовый и производительность IPSec была совсем никакая, просто перенесли на ether3, чтоб сильно не править конфиг.

Конфигурация GW68

#Создаем туннели
/interface ipip add comment=X_GW64_X disabled=no local-address=195.x.x.x mtu=1440 name=ipip_x_gw64_x remote-address=195.x.x.x
/interface ipip add comment=Y_GW64_Y disabled=no local-address=87.x.x.x mtu=1440 name=ipip_y_gw64_y remote-address=85.x.x.x

#Создадим bridge, объединим wifi ap и ether5
/interface bridge add l2mtu=1594 name=bridge_private
/interface bridge port add bridge=bridge_private interface=ether5
/interface bridge port add bridge=bridge_private interface=wlan_private

#Создадим DHCP
/ip pool add name=10.0.68.0 ranges=10.0.68.64-10.0.68.160
/ip dhcp-server add address-pool=10.0.68.0 disabled=no interface=bridge_private name=10.0.68.0
/ip dhcp-server network add address=10.0.68.0/24 dns-server=10.0.64.14,10.0.3.6 domain=partner.ru gateway=10.0.68.1

#Повесим IP
/ip address add address=10.0.68.1/24 comment=LAN interface=bridge_private
/ip address add address=172.20.68.2/30 comment=X_GW64_X interface=ipip_x_gw64_x
/ip address add address=172.20.68.6/30 comment=Y_GW64_Y interface=ipip_y_gw64_y
/ip address add address=195.x.x.x/30 comment=X interface=ether3
/ip address add address=87.x.x.x/30 comment=Y interface=ether2

#Добавим роуты до адресов МТ1 и МТ2 через шлюзы провайдеров
/ip route add check-gateway=ping comment=Route_over_Y_to_Y distance=1 dst-address=85.x.x.x/32 gateway=1.1.1.1
/ip route add check-gateway=ping comment=Route_over_X_to_X distance=1 dst-address=195.x.x.x/32 gateway=2.2.2.2

#Добавим area и instance, network и ospf interface
/routing ospf instance set [ find default=yes ] disabled=yes
/routing ospf instance add name=IRK router-id=10.0.68.1
/routing ospf area add area-id=10.0.64.0 instance=IRK name=IRK
/routing ospf network add area=IRK network=172.20.68.0/30
/routing ospf network add area=IRK network=172.20.68.4/30
/routing ospf network add area=IRK network=10.0.68.0/24
/routing ospf interface add authentication=md5 authentication-key=0 interface=ipip_x_gw64_x network-type=point-to-point priority=0
/routing ospf interface add authentication=md5 authentication-key=0 cost=40 interface=ipip_y_gw64_y network-type=point-to-point priority=0
/routing ospf interface add authentication=md5 authentication-key=0 interface=bridge_private network-type=broadcast passive=yes

Как все работает:

GW68 устанавливает два туннеля до МТ1 и до МТ2, каждый через своего провайдера. На микротике нет дефолта, адреса МТ1 и МТ2 прописаны статиками.
На туннеле до MT1 стоит cost 10, на туннеле до МT2 cost 40. Как только туннель оживает, мы получаем дефолт и все роуты с МТ1 через OSPF. Весь трафик завернут на МТ1. Как только основной провайдер отваливается,
по истечению таймера OSPF, становятся активными роуты через туннель до МТ2.

Проблема 2:

При живом основном канале, мы видим в логе GW68

20:12:26 route,ospf,info Database Description packet has different master status flag
20:12:26 route,ospf,info new master flag=false

В этот момент у нас трафик сам по себе начинает бежать через туннель до MT2. Туннель до МТ1 живой, а трафик бежит через туннель до МТ2. А так как на магазинах обычно резерв помегабайтный,
то мы получаем высасывание денег без каких-либо на то причин.
Чтобы вернуть все в туннель до МТ1 необходимо было на МТ1 выключить и опять включить туннель до GW68. Причем эта проблема возникала только в некоторых городах, и не на всех роутерах.
На форуме микротика, в тех. поддержке никто нам не помог. Однажды мой коллега, пытаясь поднять туннель MT1-Juniper SRX-650, вооружился кучей алкоголя, сниффером и дебаггером:)
И отлаживая IPSec, наткнулся на ошибки авторизации OSPF микротика. Мы отключили авторизацию на интерфейсах OSPF и вуаля, проблема сама собой исчезла.
Как там проходит авторизация, где сбой, сейчас не помнит ни он, ни я. Но вопрос решен. Почему где-то работало отлично и с авторизацией, я не могу сказать.

С микротиком можно только гадать на кофейной гуще, так как каждый ответ саппорта — новый вопрос, каждая новая прошивка дарит новую проблему:)

Автор: xyyx

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js