mikrotik-wiki.ru
Главная
Загрузка...

STP, RSTP и MSTP на MikroTik — защита от петель

RouterOS 7.xInterfaces11 мин330 мар. 2026 г.
TelegramVK

STP, RSTP и MSTP на MikroTik — защита от петель в сети

Switching loops (петли коммутации) — одна из самых разрушительных проблем в Ethernet-сетях. Один лишний кабель между двумя коммутаторами может за секунды вызвать broadcast storm, который положит всю сеть. Spanning Tree Protocol (STP) и его улучшенные версии RSTP и MSTP автоматически обнаруживают петли и блокируют избыточные пути, сохраняя при этом резервные линки для отказоустойчивости. В этом руководстве разберём работу STP/RSTP/MSTP на MikroTik, настроим приоритеты, edge-порты, BPDU Guard и научимся диагностировать проблемы.

Описание

Почему петли опасны

В Ethernet-сетях нет встроенного механизма TTL (Time to Live), как в IP. Если кадр попадает в петлю — он будет циркулировать бесконечно, порождая копии. Broadcast-кадры (ARP, DHCP Discover, и т.д.) размножаются экспоненциально:

  1. Коммутатор A получает broadcast и отправляет его на все порты
  2. Коммутатор B получает этот broadcast с двух сторон (основной и резервный линк)
  3. Коммутатор B отправляет оба кадра на все остальные порты
  4. Кадры возвращаются на коммутатор A и снова рассылаются

За 1-2 секунды трафик в петле насыщает все линки до предела. Это называется broadcast storm. Симптомы:

  • Все устройства в сети теряют связь
  • Коммутаторы показывают 100% загрузку портов
  • CPU коммутаторов загружен на 100%
  • MAC-таблицы постоянно перезаписываются (MAC flapping)

STP решает эту проблему, логически отключая избыточные линки.

STP (IEEE 802.1D)

Классический Spanning Tree Protocol работает по следующему алгоритму:

  1. Выбор Root Bridge — коммутатор с наименьшим Bridge Priority (а при равенстве — с наименьшим MAC-адресом) становится корневым
  2. Определение Root Port — на каждом не-корневом коммутаторе выбирается порт с кратчайшим путём к Root Bridge
  3. Определение Designated Port — на каждом сегменте выбирается один порт для пересылки трафика к Root Bridge
  4. Блокировка остальных портов — все избыточные порты переводятся в состояние Blocking

Состояния портов в STP:

СостояниеОписаниеПересылка данныхИзучение MAC
BlockingПорт заблокирован для предотвращения петлиНетНет
ListeningПорт участвует в выборах STPНетНет
LearningПорт изучает MAC-адресаНетДа
ForwardingПорт активен, пересылает трафикДаДа
DisabledПорт административно отключёнНетНет

Главный недостаток STP — медленная сходимость. При изменении топологии (падение линка, добавление нового коммутатора) STP проходит через все состояния последовательно. Listening → Learning → Forwarding занимает 30-50 секунд. Всё это время сеть частично неработоспособна.

RSTP (IEEE 802.1w)

Rapid Spanning Tree Protocol — усовершенствованная версия STP с быстрой сходимостью. Время переключения — 1-3 секунды вместо 30-50.

Ключевые отличия от STP:

  • Новые роли портов: Alternate (резерв для Root Port) и Backup (резерв для Designated Port)
  • Proposal/Agreement механизм — коммутаторы согласовывают роли напрямую, без ожидания таймеров
  • Edge Port — порт, подключённый к конечному устройству, мгновенно переходит в Forwarding
  • Обратная совместимость — RSTP автоматически переключается на STP при обнаружении STP-соседа

Роли портов в RSTP:

РольОписание
RootПорт с лучшим путём к Root Bridge (один на каждом не-корневом коммутаторе)
DesignatedПорт, ответственный за пересылку трафика в данном сегменте к Root Bridge
AlternateРезервный порт, готовый заменить Root Port при его отказе
BackupРезервный порт для Designated Port (оба на одном коммутаторе)

RSTP — рекомендуемый протокол для большинства сетей MikroTik. Он включён по умолчанию в RouterOS 7.

MSTP (IEEE 802.1s)

Multiple Spanning Tree Protocol добавляет концепцию экземпляров (instances) STP. Каждый экземпляр обслуживает одну или несколько VLAN и может иметь свою собственную топологию Spanning Tree.

Зачем это нужно:

В RSTP все VLAN используют одно и то же дерево. Если у вас есть два uplink между коммутаторами и 10 VLAN — один uplink будет активен, второй заблокирован. Весь трафик всех VLAN идёт через один линк.

MSTP позволяет распределить VLAN по разным экземплярам:

  • Instance 1 (VLAN 10, 20, 30) — активен uplink A, резервный uplink B
  • Instance 2 (VLAN 40, 50, 60) — активен uplink B, резервный uplink A

В результате оба линка используются, нагрузка балансируется между ними.

MSTP использует понятие MST Region — группа коммутаторов с одинаковой конфигурацией MSTP (имя региона, ревизия, маппинг VLAN → Instance). Коммутаторы с разной конфигурацией считаются принадлежащими к разным регионам и взаимодействуют через CIST (Common and Internal Spanning Tree).

Когда использовать MSTP:

  • Более 2 uplink между коммутаторами
  • Большое количество VLAN
  • Необходимость балансировки нагрузки между uplink
  • Сеть с 10+ коммутаторами

Когда RSTP достаточно:

  • Небольшая сеть (2-5 коммутаторов)
  • 1-2 VLAN
  • Простая топология без избыточных линков

Настройка

Настройка RSTP

Базовая настройка RSTP на MikroTik:

[admin@MikroTik] >
/interface/bridge set bridge-LAN protocol-mode=rstp

В RouterOS 7 rstp является режимом по умолчанию. Если вы создаёте новый bridge — RSTP уже включён.

Настройка Bridge Priority

Bridge Priority определяет, какой коммутатор станет Root Bridge. Чем меньше значение — тем выше приоритет. Значение задаётся кратно 4096 (0x1000):

Значение PriorityHexОписание
00x0000Максимальный приоритет (Primary Root)
40960x1000Secondary Root (backup)
81920x2000Третий по приоритету
327680x8000Значение по умолчанию
614400xF000Минимальный приоритет

Для основного коммутатора (Root Bridge):

[admin@MikroTik] >
/interface/bridge set bridge-LAN priority=0x4000

Для резервного коммутатора:

[admin@MikroTik] >
/interface/bridge set bridge-LAN priority=0x8000

Рекомендация: всегда явно назначайте Root Bridge. Если оставить значения по умолчанию (32768) — Root выбирается по MAC-адресу. Это приводит к непредсказуемым результатам: старый коммутатор с меньшим MAC может стать Root, хотя он подключён к сети через медленный линк.

Настройка стоимости портов

Стоимость порта (path cost) влияет на выбор Root Port — порт с наименьшей суммарной стоимостью до Root Bridge становится Root Port:

[admin@MikroTik] >
/interface/bridge/port set [find interface=sfp-sfpplus1] path-cost=2000
/interface/bridge/port set [find interface=ether1] path-cost=20000

Стандартные значения стоимости:

Скорость линкаСтоимость (802.1D)Стоимость (802.1w)
10 Gbps22000
1 Gbps420000
100 Mbps19200000
10 Mbps1002000000

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

Настройка Edge Port

Edge port — это порт, к которому подключено конечное устройство (компьютер, принтер, IP-телефон), а не другой коммутатор. Edge-порт мгновенно переходит в состояние Forwarding, не дожидаясь сходимости STP:

[admin@MikroTik] >
/interface/bridge/port set [find interface=ether2] edge=yes
/interface/bridge/port set [find interface=ether3] edge=yes
/interface/bridge/port set [find interface=ether4] edge=yes
/interface/bridge/port set [find interface=ether5] edge=yes

Важно: edge-порты должны быть настроены только на портах подключения конечных устройств. Если на edge-порт придёт BPDU (от коммутатора), RouterOS автоматически снимет edge-статус и порт начнёт участвовать в STP.

Автоматическое определение edge:

[admin@MikroTik] >
/interface/bridge/port set [find interface=ether2] auto-edge=yes

auto-edge=yes (по умолчанию включено в RouterOS 7) автоматически определяет, является ли порт edge. Если на порту не обнаружены BPDU — он считается edge. Однако это занимает время при загрузке. Для предсказуемого поведения лучше установить edge=yes вручную на access-портах.

Настройка point-to-point

Point-to-point порт — это порт, подключённый напрямую к другому коммутатору (а не к shared media). На point-to-point портах RSTP использует быстрый Proposal/Agreement механизм:

[admin@MikroTik] >
/interface/bridge/port set [find interface=sfp-sfpplus1] point-to-point=yes

По умолчанию auto-point-to-point=yes — RouterOS определяет тип соединения по дуплексу (full-duplex = point-to-point).

BPDU Guard

BPDU Guard защищает от несанкционированного подключения коммутатора к access-порту. Если на порт с BPDU Guard приходит BPDU-кадр — порт мгновенно блокируется:

[admin@MikroTik] >
/interface/bridge/port set [find interface=ether2] bpdu-guard=yes
/interface/bridge/port set [find interface=ether3] bpdu-guard=yes
/interface/bridge/port set [find interface=ether4] bpdu-guard=yes

Когда BPDU Guard срабатывает, порт переходит в состояние disabled и в лог записывается предупреждение. Для восстановления порта:

[admin@MikroTik] >
# Посмотреть заблокированные порты
/interface/bridge/port print where status=disabled

# Разблокировать порт
/interface/bridge/port set [find interface=ether2] bpdu-guard=no
/interface/bridge/port set [find interface=ether2] bpdu-guard=yes

Или использовать автоматическое восстановление — порт разблокируется через заданное время, если BPDU больше не приходят. В RouterOS это реализуется через скрипт по расписанию.

Рекомендация: включайте BPDU Guard на всех access-портах (подключение компьютеров, принтеров, IP-телефонов). Это предотвращает случайные петли от неуправляемых коммутаторов, которые пользователи подключают самостоятельно.

Настройка MSTP

MSTP требует более сложной конфигурации. Все коммутаторы в одном MST Region должны иметь одинаковые параметры:

[admin@MikroTik] >
# Имя и ревизия региона — должны совпадать на всех коммутаторах
/interface/bridge set bridge-LAN protocol-mode=mstp \
  region-name=MyNetwork region-revision=1

# Создаём экземпляры MST и привязываем VLAN
/interface/bridge/msti add bridge=bridge-LAN identifier=1 \
  vlan-mapping=10,20,30 priority=0x4000

/interface/bridge/msti add bridge=bridge-LAN identifier=2 \
  vlan-mapping=40,50,60 priority=0x8000

На втором коммутаторе — инвертируем приоритеты для балансировки:

[admin@MikroTik] >
/interface/bridge set bridge-LAN protocol-mode=mstp \
  region-name=MyNetwork region-revision=1

/interface/bridge/msti add bridge=bridge-LAN identifier=1 \
  vlan-mapping=10,20,30 priority=0x8000

/interface/bridge/msti add bridge=bridge-LAN identifier=2 \
  vlan-mapping=40,50,60 priority=0x4000

В результате:

  • VLAN 10, 20, 30 используют первый коммутатор как Root → трафик идёт через uplink A
  • VLAN 40, 50, 60 используют второй коммутатор как Root → трафик идёт через uplink B

Полный пример: сеть из трёх коммутаторов с RSTP

Топология:

code
         [Core Switch - CRS326]
         /  bridge priority=0x4000  \
   sfp1 /                            \ sfp2
       /                              \
[Access SW1 - hAP ax3]        [Access SW2 - hAP ax3]
  priority=0x8000               priority=0x8000
  ether1(uplink)                ether1(uplink)
  ether2-5(access)              ether2-5(access)

Core Switch (CRS326):

[admin@MikroTik] >
/interface/bridge add name=bridge1 protocol-mode=rstp priority=0x4000

/interface/bridge/port
  add bridge=bridge1 interface=sfp-sfpplus1 path-cost=2000 point-to-point=yes
  add bridge=bridge1 interface=sfp-sfpplus2 path-cost=2000 point-to-point=yes
  add bridge=bridge1 interface=ether1 edge=yes bpdu-guard=yes
  add bridge=bridge1 interface=ether2 edge=yes bpdu-guard=yes

Access Switch 1 (hAP ax3):

[admin@MikroTik] >
/interface/bridge add name=bridge1 protocol-mode=rstp priority=0x8000

/interface/bridge/port
  add bridge=bridge1 interface=ether1 point-to-point=yes
  add bridge=bridge1 interface=ether2 edge=yes bpdu-guard=yes
  add bridge=bridge1 interface=ether3 edge=yes bpdu-guard=yes
  add bridge=bridge1 interface=ether4 edge=yes bpdu-guard=yes
  add bridge=bridge1 interface=ether5 edge=yes bpdu-guard=yes

Проверка

Информация о Bridge и Root

[admin@MikroTik] >
/interface/bridge print detail

Ключевые поля:

  • designated-root — Bridge ID текущего Root Bridge
  • root-path-cost — стоимость пути до Root Bridge (0 = мы и есть Root)
  • root-port — через какой порт мы достигаем Root Bridge

Мониторинг портов

[admin@MikroTik] >
/interface/bridge/port monitor [find]

Вывод показывает для каждого порта:

  • role — текущая роль (root-port, designated-port, alternate-port, backup-port, disabled-port)
  • status — текущее состояние (forwarding, learning, blocking, disabled)
  • edge — является ли порт edge
  • point-to-point — тип соединения
  • designated-bridge — Bridge ID соседа на этом порту
  • designated-cost — стоимость пути у соседа
[admin@MikroTik] >
/interface/bridge/port monitor 0

Детальная информация о конкретном порте.

Проверка MSTP instances

[admin@MikroTik] >
/interface/bridge/msti print

Показывает настроенные MST-экземпляры и привязку VLAN.

Просмотр истории изменений топологии

[admin@MikroTik] >
/log print where topics~"bridge"

В логе фиксируются события STP: смена Root Bridge, изменение ролей портов, срабатывание BPDU Guard.

Проверка BPDU-статистики

[admin@MikroTik] >
/interface/bridge/port print stats

Показывает количество отправленных и полученных BPDU на каждом порту. Порт, не получающий BPDU — edge или отключён от коммутаторов.

Типичные ошибки

Все порты в состоянии Blocking

Симптом: после включения STP/RSTP ни один порт не переходит в Forwarding, сеть не работает.

Причины:

  1. protocol-mode=none на одном из коммутаторов. Если один коммутатор не участвует в STP — он не отправляет BPDU. Другие коммутаторы могут получить BPDU с неожиданных направлений и заблокировать все порты.
[admin@MikroTik] >
# Проверьте режим на всех коммутаторах
/interface/bridge print where protocol-mode=none
  1. Конфликт версий STP. Если часть сети работает на STP, а часть на RSTP — RSTP автоматически переключается в режим совместимости, но это может вызвать длительную сходимость.

Неправильный Root Bridge

Симптом: трафик идёт через медленный или неоптимальный коммутатор.

Причина: Root Bridge выбран по MAC-адресу (все коммутаторы с priority по умолчанию 32768). Старый или бюджетный коммутатор случайно стал Root.

Решение:

[admin@MikroTik] >
# На желаемом Root Bridge установите наименьший priority
/interface/bridge set bridge-LAN priority=0x4000

# На всех остальных — оставьте по умолчанию или выше
/interface/bridge set bridge-LAN priority=0x8000

Проверьте результат:

[admin@MikroTik] >
/interface/bridge print detail

Поле designated-root должно указывать на Bridge ID коммутатора с priority 0x4000.

Edge port на uplink к коммутатору

Симптом: периодические кратковременные петли и broadcast storm при перезагрузке коммутатора.

Причина: uplink-порт к другому коммутатору настроен как edge=yes. Edge-порт мгновенно переходит в Forwarding, не дожидаясь BPDU. Если на порту появляется соединение раньше, чем приходит BPDU — на несколько секунд возникает петля.

Решение:

[admin@MikroTik] >
# Uplink-порты НЕ должны быть edge
/interface/bridge/port set [find interface=sfp-sfpplus1] edge=no auto-edge=no

# Edge — только для конечных устройств
/interface/bridge/port set [find interface=ether2] edge=yes

Пользователь подключил неуправляемый коммутатор

Симптом: в сети появилась петля, broadcast storm, потеря связи.

Причина: сотрудник подключил дешёвый коммутатор (без STP) двумя кабелями к разным портам MikroTik.

Предотвращение:

[admin@MikroTik] >
# BPDU Guard на всех access-портах
/interface/bridge/port set [find edge=yes] bpdu-guard=yes

BPDU Guard заблокирует порт при обнаружении BPDU от управляемого коммутатора. Для неуправляемых коммутаторов (без STP) дополнительно помогает:

  • Port Isolation — запретить обмен между access-портами напрямую
  • Storm Control — ограничить broadcast-трафик на порту
[admin@MikroTik] >
# Storm Control (ограничение broadcast на портах)
/interface/bridge/port set [find interface=ether2] \
  broadcast-flood=no unknown-multicast-flood=no

MSTP: разные region-name на коммутаторах

Симптом: MSTP-экземпляры не балансируют нагрузку, все VLAN идут через один линк.

Причина: region-name и/или region-revision не совпадают на коммутаторах. Они считаются разными MST Region и взаимодействуют через CIST (как один экземпляр STP).

Решение:

[admin@MikroTik] >
# На КАЖДОМ коммутаторе должны совпадать:
/interface/bridge set bridge-LAN \
  region-name=MyNetwork \
  region-revision=1

# И маппинг VLAN → Instance должен быть идентичным

STP и Hardware Offloading

Некоторые switch-чипы поддерживают STP/RSTP на аппаратном уровне (Marvell в CRS3xx). В этом случае BPDU обрабатываются чипом, обеспечивая быструю сходимость. На чипах Atheros STP работает программно — BPDU проходят через CPU.

При HW offloading с STP проверьте:

[admin@MikroTik] >
/interface/bridge/port print detail

Если hw-offload=yes и role=designated-port / root-port — всё работает корректно. Заблокированные порты (alternate-port) не пересылают трафик ни аппаратно, ни программно.

[admin@MikroTik] >
/interface/bridge set bridge-LAN protocol-mode=rstp
/interface/bridge set bridge-LAN priority=0x4000
/interface/bridge set bridge-LAN priority=0x8000
/interface/bridge/port set [find interface=sfp-sfpplus1] path-cost=2000
/interface/bridge/port set [find interface=ether1] path-cost=20000
/interface/bridge/port set [find interface=ether2] edge=yes
/interface/bridge/port set [find interface=ether3] edge=yes
/interface/bridge/port set [find interface=ether4] edge=yes
/interface/bridge/port set [find interface=ether5] edge=yes
/interface/bridge/port set [find interface=ether2] auto-edge=yes
/interface/bridge/port set [find interface=sfp-sfpplus1] point-to-point=yes
/interface/bridge/port set [find interface=ether2] bpdu-guard=yes
/interface/bridge/port set [find interface=ether3] bpdu-guard=yes
/interface/bridge/port set [find interface=ether4] bpdu-guard=yes
# Посмотреть заблокированные порты
/interface/bridge/port print where status=disabled

# Разблокировать порт
/interface/bridge/port set [find interface=ether2] bpdu-guard=no
/interface/bridge/port set [find interface=ether2] bpdu-guard=yes
# Имя и ревизия региона — должны совпадать на всех коммутаторах
/interface/bridge set bridge-LAN protocol-mode=mstp \
  region-name=MyNetwork region-revision=1

# Создаём экземпляры MST и привязываем VLAN
/interface/bridge/msti add bridge=bridge-LAN identifier=1 \
  vlan-mapping=10,20,30 priority=0x4000

/interface/bridge/msti add bridge=bridge-LAN identifier=2 \
  vlan-mapping=40,50,60 priority=0x8000
/interface/bridge set bridge-LAN protocol-mode=mstp \
  region-name=MyNetwork region-revision=1

/interface/bridge/msti add bridge=bridge-LAN identifier=1 \
  vlan-mapping=10,20,30 priority=0x8000

/interface/bridge/msti add bridge=bridge-LAN identifier=2 \
  vlan-mapping=40,50,60 priority=0x4000
[Core Switch - CRS326]
         /  bridge priority=0x4000  \
   sfp1 /                            \ sfp2
       /                              \
[Access SW1 - hAP ax3]        [Access SW2 - hAP ax3]
  priority=0x8000               priority=0x8000
  ether1(uplink)                ether1(uplink)
  ether2-5(access)              ether2-5(access)
/interface/bridge add name=bridge1 protocol-mode=rstp priority=0x4000

/interface/bridge/port
  add bridge=bridge1 interface=sfp-sfpplus1 path-cost=2000 point-to-point=yes
  add bridge=bridge1 interface=sfp-sfpplus2 path-cost=2000 point-to-point=yes
  add bridge=bridge1 interface=ether1 edge=yes bpdu-guard=yes
  add bridge=bridge1 interface=ether2 edge=yes bpdu-guard=yes
/interface/bridge add name=bridge1 protocol-mode=rstp priority=0x8000

/interface/bridge/port
  add bridge=bridge1 interface=ether1 point-to-point=yes
  add bridge=bridge1 interface=ether2 edge=yes bpdu-guard=yes
  add bridge=bridge1 interface=ether3 edge=yes bpdu-guard=yes
  add bridge=bridge1 interface=ether4 edge=yes bpdu-guard=yes
  add bridge=bridge1 interface=ether5 edge=yes bpdu-guard=yes
/interface/bridge print detail
/interface/bridge/port monitor [find]
/interface/bridge/port monitor 0
/interface/bridge/msti print
/log print where topics~"bridge"
/interface/bridge/port print stats
# Проверьте режим на всех коммутаторах
/interface/bridge print where protocol-mode=none
# На желаемом Root Bridge установите наименьший priority
/interface/bridge set bridge-LAN priority=0x4000

# На всех остальных — оставьте по умолчанию или выше
/interface/bridge set bridge-LAN priority=0x8000
/interface/bridge print detail
# Uplink-порты НЕ должны быть edge
/interface/bridge/port set [find interface=sfp-sfpplus1] edge=no auto-edge=no

# Edge — только для конечных устройств
/interface/bridge/port set [find interface=ether2] edge=yes
# BPDU Guard на всех access-портах
/interface/bridge/port set [find edge=yes] bpdu-guard=yes
# Storm Control (ограничение broadcast на портах)
/interface/bridge/port set [find interface=ether2] \
  broadcast-flood=no unknown-multicast-flood=no
# На КАЖДОМ коммутаторе должны совпадать:
/interface/bridge set bridge-LAN \
  region-name=MyNetwork \
  region-revision=1

# И маппинг VLAN → Instance должен быть идентичным
/interface/bridge/port print detail
Interfaces / STP, RSTP и MSTP на MikroTik — защита от петель