OSPF — динамическая маршрутизация
OSPF в RouterOS 7
OSPF (Open Shortest Path First) — протокол динамической маршрутизации на основе состояния каналов (link-state), работающий внутри одной автономной системы. В RouterOS 7 реализация OSPF полностью переработана и интегрирована в единый Routing Daemon.
OSPFv2 и OSPFv3
- OSPFv2 — маршрутизация IPv4-сетей (RFC 2328)
- OSPFv3 — маршрутизация IPv6-сетей (RFC 5340), а также поддержка IPv4 через Address Families
Ключевые концепции
- Router ID — уникальный 32-битный идентификатор роутера в домене OSPF (обычно совпадает с IP-адресом loopback-интерфейса)
- Area — логическая группа роутеров и сетей. Area 0 (0.0.0.0) — обязательная backbone-область, все остальные области должны быть подключены к ней
- LSA (Link-State Advertisement) — пакеты, описывающие топологию сети:
- Type 1 (Router LSA) — описывает каналы роутера внутри области
- Type 2 (Network LSA) — генерируется DR для broadcast-сегмента
- Type 3 (Summary LSA) — маршруты между областями, генерируются ABR
- Type 4 (ASBR Summary) — путь до ASBR
- Type 5 (External LSA) — внешние маршруты, импортированные в OSPF
- Type 7 (NSSA External) — внешние маршруты в NSSA-областях
- DR/BDR — Designated Router и Backup DR избираются в broadcast-сегментах для уменьшения числа adjacency. Выбор определяется приоритетом интерфейса (priority) и Router ID
- Cost — метрика маршрута, рассчитываемая как reference-bandwidth / interface-bandwidth. Чем ниже cost, тем предпочтительнее маршрут
Single-Area vs Multi-Area
В простых сетях (до 20-30 роутеров) достаточно одной области (Area 0). Для крупных сетей с филиалами применяется Multi-Area дизайн, который ограничивает распространение LSA, уменьшает размер LSDB и ускоряет конвергенцию при изменениях топологии.
Базовая настройка (Single Area)
Простейший сценарий: два роутера в одной backbone-области 0.0.0.0, связанные через Ethernet.
Схема сети
# R1 (10.0.0.1) ── ether1 ── (10.0.0.2) R2
# LAN: 192.168.1.0/24 LAN: 192.168.2.0/24Схема
Конфигурация R1
# Создаём OSPF instance
/routing/ospf/instance
add name=ospf-main router-id=10.0.0.1 version=2
# Создаём backbone area
/routing/ospf/area
add name=backbone instance=ospf-main area-id=0.0.0.0
# Добавляем интерфейсы в OSPF
/routing/ospf/interface-template
add area=backbone networks=10.0.0.0/30 type=ptp
add area=backbone networks=192.168.1.0/24 passive
# Назначаем IP-адреса
/ip/address
add address=10.0.0.1/30 interface=ether1
add address=192.168.1.1/24 interface=bridge-lanR1 — RouterOS CLI
Конфигурация R2
# Создаём OSPF instance
/routing/ospf/instance
add name=ospf-main router-id=10.0.0.2 version=2
# Создаём backbone area
/routing/ospf/area
add name=backbone instance=ospf-main area-id=0.0.0.0
# Добавляем интерфейсы
/routing/ospf/interface-template
add area=backbone networks=10.0.0.0/30 type=ptp
add area=backbone networks=192.168.2.0/24 passive
# Назначаем IP-адреса
/ip/address
add address=10.0.0.2/30 interface=ether1
add address=192.168.2.1/24 interface=bridge-lanR2 — RouterOS CLI
Multi-Area OSPF
В крупных корпоративных сетях с филиалами применяется Multi-Area дизайн. Каждый филиал помещается в отдельную OSPF-область, что ограничивает распространение LSA и упрощает управление.
Схема сети
┌─────────────────┐
│ Area 0 │
│ (Backbone) │
│ │
│ ABR-1 ABR-2 │
│ 10.0.0.1 10.0.0.2│
└──┬────┬────┬────┘
│ │ │
┌────────────┘ │ └────────────┐
│ │ │
┌──────┴──────┐ ┌─────┴──────┐ ┌──────┴──────┐
│ Area 1 │ │ Area 2 │ │ Area 3 │
│ Москва │ │ Казань │ │ Новосибирск │
│ 192.168.10 │ │ 192.168.20 │ │ 192.168.30 │
│ BR-MSK │ │ BR-KZN │ │ BR-NSK │
│ 10.1.1.2 │ │ 10.2.2.2 │ │ 10.3.3.2 │
└─────────────┘ └────────────┘ └─────────────┘
# Транспортные сети между ABR и филиалами:
# ABR-1 ↔ BR-MSK: 10.1.1.0/30
# ABR-1 ↔ BR-KZN: 10.2.2.0/30
# ABR-2 ↔ BR-NSK: 10.3.3.0/30
# Backbone link: 10.0.0.0/30 (ABR-1 ↔ ABR-2)Сетевая диаграмма
Конфигурация ABR-1 (Area Border Router)
ABR-1 подключён к backbone (Area 0), а также является граничным роутером для Area 1 (Москва) и Area 2 (Казань).
# OSPF instance
/routing/ospf/instance
add name=ospf-main router-id=10.0.0.1 version=2
# Определяем все области
/routing/ospf/area
add name=backbone instance=ospf-main area-id=0.0.0.0
add name=area-msk instance=ospf-main area-id=0.0.0.1
add name=area-kzn instance=ospf-main area-id=0.0.0.2
# Интерфейсы backbone
/routing/ospf/interface-template
add area=backbone networks=10.0.0.0/30 type=ptp
# Интерфейсы Area 1 (Москва)
add area=area-msk networks=10.1.1.0/30 type=ptp
# Интерфейсы Area 2 (Казань)
add area=area-kzn networks=10.2.2.0/30 type=ptp
# IP-адреса
/ip/address
add address=10.0.0.1/30 interface=ether1 comment="backbone to ABR-2"
add address=10.1.1.1/30 interface=ether2 comment="to BR-MSK"
add address=10.2.2.1/30 interface=ether3 comment="to BR-KZN"ABR-1 — RouterOS CLI
Конфигурация ABR-2
# OSPF instance
/routing/ospf/instance
add name=ospf-main router-id=10.0.0.2 version=2
# Области
/routing/ospf/area
add name=backbone instance=ospf-main area-id=0.0.0.0
add name=area-nsk instance=ospf-main area-id=0.0.0.3
# Интерфейсы
/routing/ospf/interface-template
add area=backbone networks=10.0.0.0/30 type=ptp
add area=area-nsk networks=10.3.3.0/30 type=ptp
# IP-адреса
/ip/address
add address=10.0.0.2/30 interface=ether1 comment="backbone to ABR-1"
add address=10.3.3.1/30 interface=ether2 comment="to BR-NSK"ABR-2 — RouterOS CLI
Конфигурация филиала Москва (BR-MSK)
/routing/ospf/instance
add name=ospf-main router-id=10.1.1.2 version=2
/routing/ospf/area
add name=area-msk instance=ospf-main area-id=0.0.0.1
/routing/ospf/interface-template
add area=area-msk networks=10.1.1.0/30 type=ptp
add area=area-msk networks=192.168.10.0/24 passive
/ip/address
add address=10.1.1.2/30 interface=ether1
add address=192.168.10.1/24 interface=bridge-lanBR-MSK — RouterOS CLI
Конфигурация филиала Казань (BR-KZN)
/routing/ospf/instance
add name=ospf-main router-id=10.2.2.2 version=2
/routing/ospf/area
add name=area-kzn instance=ospf-main area-id=0.0.0.2
/routing/ospf/interface-template
add area=area-kzn networks=10.2.2.0/30 type=ptp
add area=area-kzn networks=192.168.20.0/24 passive
/ip/address
add address=10.2.2.2/30 interface=ether1
add address=192.168.20.1/24 interface=bridge-lanBR-KZN — RouterOS CLI
Конфигурация филиала Новосибирск (BR-NSK)
/routing/ospf/instance
add name=ospf-main router-id=10.3.3.2 version=2
/routing/ospf/area
add name=area-nsk instance=ospf-main area-id=0.0.0.3
/routing/ospf/interface-template
add area=area-nsk networks=10.3.3.0/30 type=ptp
add area=area-nsk networks=192.168.30.0/24 passive
/ip/address
add address=10.3.3.2/30 interface=ether1
add address=192.168.30.1/24 interface=bridge-lanBR-NSK — RouterOS CLI
Stub и NSSA Areas
Stub и NSSA области используются для уменьшения размера таблицы маршрутизации на филиальных роутерах, ограничивая типы LSA, которые передаются в область.
Stub Area
В stub-области блокируются внешние маршруты (Type 5 LSA). Вместо них ABR инжектирует маршрут по умолчанию (default route). Подходит для филиалов, которым не нужны маршруты из других протоколов маршрутизации.
# На ABR — объявляем Area 1 как stub
/routing/ospf/area
add name=area-msk instance=ospf-main area-id=0.0.0.1 type=stub
# На филиальном роутере — тоже stub
/routing/ospf/area
add name=area-msk instance=ospf-main area-id=0.0.0.1 type=stubStub Area — RouterOS CLI
Totally Stubby Area
Расширение stub-области: блокируются и Type 3 Summary LSA (межобластные маршруты). Филиальный роутер получает только маршрут по умолчанию от ABR. Минимальная нагрузка на LSDB.
# На ABR — totally stubby (no-summary блокирует Type 3 LSA)
/routing/ospf/area
set area-msk type=stub no-summary=yes
# На филиальном роутере — обычный stub
/routing/ospf/area
set area-msk type=stubTotally Stubby — RouterOS CLI
NSSA (Not-So-Stubby Area)
NSSA позволяет филиалу импортировать внешние маршруты (например, от локального провайдера интернета) через Type 7 LSA, при этом внешние маршруты из backbone (Type 5) по-прежнему блокируются. Идеально для филиалов с локальным интернет-выходом.
# На ABR
/routing/ospf/area
add name=area-kzn instance=ospf-main area-id=0.0.0.2 type=nssa
# На филиальном роутере (BR-KZN)
/routing/ospf/area
add name=area-kzn instance=ospf-main area-id=0.0.0.2 type=nssa
# Редистрибуция static через output filter
/routing/filter/rule
add chain=ospf-nssa-out rule="if (protocol static) { accept }"
add chain=ospf-nssa-out rule="reject"
/routing/ospf/instance
set ospf-main out-filter-chain=ospf-nssa-out
# Статический маршрут к провайдеру
/ip/route
add dst-address=0.0.0.0/0 gateway=203.0.113.1 comment="local ISP"NSSA — RouterOS CLI
Настройка филиалов
Полный пример конфигурации филиального роутера с учётом всех практических аспектов: OSPF-область, default route, cost, passive-интерфейсы и аутентификация.
Полная конфигурация филиала
# === OSPF Instance ===
/routing/ospf/instance
add name=ospf-branch router-id=10.1.1.2 version=2
# === Area (stub — для минимизации LSDB) ===
/routing/ospf/area
add name=area-branch instance=ospf-branch area-id=0.0.0.1 type=stub
# === Interface templates ===
/routing/ospf/interface-template
# WAN-канал к ABR (point-to-point, cost настроен вручную)
add area=area-branch networks=10.1.1.0/30 type=ptp cost=100 priority=0
# LAN — passive (анонсируем сеть, но не ищем соседей)
add area=area-branch networks=192.168.10.0/24 passive
# Management VLAN
add area=area-branch networks=172.16.10.0/24 passive
# === Аутентификация (MD5) ===
/routing/ospf/interface-template
set [find networks=10.1.1.0/30] auth=md5 auth-id=1 auth-key="S3cureK3y!Br@nch1"
# === IP-адреса ===
/ip/address
add address=10.1.1.2/30 interface=ether1 comment="WAN to ABR"
add address=192.168.10.1/24 interface=bridge-lan comment="LAN"
add address=172.16.10.1/24 interface=vlan-mgmt comment="Management"Филиал — полная конфигурация
Инжекция Default Route на ABR
Для stub-областей ABR автоматически инжектирует default route. Для обычных областей нужно настроить вручную:
# На ABR: инжекция default route в area
/routing/ospf/instance
set ospf-main originate-default=if-installed
# Убедитесь, что на ABR есть default route
/ip/route
add dst-address=0.0.0.0/0 gateway=203.0.113.1ABR — Default Route
Настройка Cost интерфейса
Cost определяет предпочтительность маршрута. Рекомендуемые значения:
- 10 — 1 Gbps Ethernet (прямое подключение)
- 100 — WAN-канал 100 Mbps
- 1000 — VPN-туннель через интернет (резервный)
- 10000 — медленный или ненадёжный канал
Аутентификация
OSPF поддерживает аутентификацию соседей для защиты от подмены маршрутной информации:
# MD5-аутентификация
/routing/ospf/interface-template
set [find networks=10.1.1.0/30] auth=md5 auth-id=1 auth-key="MySecretKey123"
# SHA-аутентификация (более надёжная)
/routing/ospf/interface-template
set [find networks=10.1.1.0/30] auth=sha256 auth-id=1 auth-key="SHA256SecureKey!2026"Аутентификация — RouterOS CLI
Фильтрация маршрутов
Фильтрация позволяет контролировать, какие маршруты передаются между областями и импортируются из других источников.
Area Range (суммаризация)
ABR может суммировать маршруты из области в один агрегированный маршрут, уменьшая размер таблицы маршрутизации в backbone:
# Суммаризация маршрутов Area 1 в один /16
/routing/ospf/area/range
add area=area-msk range=192.168.10.0/24 advertise=yes cost=50
# Скрыть подсети — анонсировать только суммарный маршрут
add area=area-kzn range=192.168.20.0/24 advertise=yes
# Полностью скрыть подсети области (не анонсировать)
add area=area-nsk range=192.168.30.0/24 advertise=noArea Range — RouterOS CLI
Фильтры маршрутов (Routing Filter Rules)
# Фильтр: принимать только определённые сети от OSPF
/routing/filter/rule
add chain=ospf-in rule="if (dst in 192.168.0.0/16 && dst-len >= 24) { accept }"
add chain=ospf-in rule="if (dst == 0.0.0.0/0) { accept }"
add chain=ospf-in rule="reject"
# Применяем фильтр к OSPF instance
/routing/ospf/instance
set ospf-main in-filter-chain=ospf-inRoute Filter — RouterOS CLI
Редистрибуция маршрутов в OSPF
# Редистрибуция connected-сетей в OSPF
/routing/filter/rule
add chain=ospf-out rule="if (protocol connected) { accept }"
add chain=ospf-out rule="reject"
# Редистрибуция connected + static
/routing/filter/rule
add chain=ospf-out rule="if (protocol connected) { accept }"
add chain=ospf-out rule="if (protocol static) { accept }"
add chain=ospf-out rule="reject"
# Точечный фильтр — только определённые static маршруты
/routing/filter/rule
add chain=ospf-out rule="if (protocol connected) { accept }"
add chain=ospf-out rule="if (protocol static && dst == 10.99.0.0/16) { accept }"
add chain=ospf-out rule="reject"
# Применяем фильтр к OSPF instance
/routing/ospf/instance
set ospf-main out-filter-chain=ospf-outРедистрибуция ROS7 — RouterOS CLI
OSPF через VPN туннели
При подключении филиалов через интернет OSPF запускается поверх VPN-туннелей (WireGuard, GRE, L2TP). Это обеспечивает автоматическое переключение при отказе каналов.
OSPF через WireGuard
# Шаг 1: Настроен WireGuard туннель (wg-branch1)
# ABR: 10.255.1.1/30, филиал: 10.255.1.2/30
# Шаг 2: Добавляем WireGuard-интерфейс в OSPF
/routing/ospf/interface-template
add area=area-msk networks=10.255.1.0/30 type=ptp cost=1000 priority=0
# Cost 1000 — высокий, чтобы прямой канал был предпочтительнееWireGuard + OSPF — RouterOS CLI
OSPF через GRE
# Создаём GRE-туннель
/interface/gre
add name=gre-branch2 remote-address=198.51.100.10 local-address=198.51.100.1
/ip/address
add address=10.255.2.1/30 interface=gre-branch2
# Добавляем в OSPF
/routing/ospf/interface-template
add area=area-kzn networks=10.255.2.0/30 type=ptp cost=1000GRE + OSPF — RouterOS CLI
Резервирование: два туннеля с разным cost
# Основной канал — WireGuard через ISP1 (cost 100)
/routing/ospf/interface-template
add area=area-msk networks=10.255.1.0/30 type=ptp cost=100
# Резервный канал — GRE через ISP2 (cost 1000)
add area=area-msk networks=10.255.3.0/30 type=ptp cost=1000
# При падении основного канала трафик автоматически
# переключится на резервный GRE-туннельРезервирование — RouterOS CLI
BFD для быстрого обнаружения отказов
OSPF по умолчанию обнаруживает потерю соседа за 40 секунд (dead-interval). BFD (Bidirectional Forwarding Detection) сокращает это время до миллисекунд:
# Включаем BFD на OSPF-интерфейсе
/routing/ospf/interface-template
set [find networks=10.255.1.0/30] use-bfd=yes
# Настройка BFD (интервалы в миллисекундах)
/routing/bfd/configuration
add min-tx=200ms min-rx=200ms multiplier=3 disabled=no
# Проверка BFD-сессий
/routing/bfd/session/printBFD — RouterOS CLI
Мониторинг и отладка
Основные команды мониторинга
# Просмотр OSPF-соседей
/routing/ospf/neighbor/print
# Детальная информация о соседях
/routing/ospf/neighbor/print detail
# Просмотр OSPF-интерфейсов
/routing/ospf/interface/print
# База данных LSA
/routing/ospf/lsa/print
# Только Type 3 (Summary) LSA
/routing/ospf/lsa/print where type=summary
# OSPF-маршруты в таблице маршрутизации
/ip/route/print where ospf
# Статистика OSPF instance
/routing/ospf/instance/print detail
# Статистика маршрутизации
/routing/stats/printМониторинг — RouterOS CLI
Логирование OSPF
# Включаем подробные логи OSPF
/system/logging
add topics=ospf action=memory
add topics=ospf,!raw action=disk
# Просмотр логов
/log/print where topics~"ospf"Логирование — RouterOS CLI
Типичные проблемы
Сосед застрял в состоянии ExStart/Exchange
Причина: несовпадение MTU на интерфейсах. OSPF проверяет MTU в Database Description пакетах.
# Проверяем MTU на интерфейсах
/interface/print detail where name=ether1
# Установка одинакового MTU (пример для GRE)
/interface/gre
set gre-branch2 mtu=1400
# Или отключение проверки MTU в OSPF (не рекомендуется)
# В RouterOS 7 это делается через dont-check-mtu в interface-templateMTU fix — RouterOS CLI
Ошибка аутентификации
В логах: ospf authentication failure from X.X.X.X. Проверьте совпадение auth-key и auth-id на обоих роутерах:
# Проверяем текущие настройки аутентификации
/routing/ospf/interface-template/print detail where auth=md5Auth check — RouterOS CLI
Соседство не устанавливается
Чек-лист:
- Совпадает ли Area ID на обоих концах?
- Совпадает ли тип области (stub/nssa/normal)?
- Совпадает ли hello-interval и dead-interval?
- Есть ли IP-связность между роутерами?
- Не блокирует ли firewall OSPF-пакеты (протокол 89)?
# Разрешаем OSPF в firewall
/ip/firewall/filter
add chain=input protocol=ospf action=accept comment="Allow OSPF"
add chain=forward protocol=ospf action=acceptFirewall — RouterOS CLI