STP, RSTP и MSTP на MikroTik — защита от петель
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, и т.д.) размножаются экспоненциально:
- Коммутатор A получает broadcast и отправляет его на все порты
- Коммутатор B получает этот broadcast с двух сторон (основной и резервный линк)
- Коммутатор B отправляет оба кадра на все остальные порты
- Кадры возвращаются на коммутатор A и снова рассылаются
За 1-2 секунды трафик в петле насыщает все линки до предела. Это называется broadcast storm. Симптомы:
- Все устройства в сети теряют связь
- Коммутаторы показывают 100% загрузку портов
- CPU коммутаторов загружен на 100%
- MAC-таблицы постоянно перезаписываются (MAC flapping)
STP решает эту проблему, логически отключая избыточные линки.
STP (IEEE 802.1D)
Классический Spanning Tree Protocol работает по следующему алгоритму:
- Выбор Root Bridge — коммутатор с наименьшим Bridge Priority (а при равенстве — с наименьшим MAC-адресом) становится корневым
- Определение Root Port — на каждом не-корневом коммутаторе выбирается порт с кратчайшим путём к Root Bridge
- Определение Designated Port — на каждом сегменте выбирается один порт для пересылки трафика к Root Bridge
- Блокировка остальных портов — все избыточные порты переводятся в состояние 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):
| Значение Priority | Hex | Описание |
|---|---|---|
| 0 | 0x0000 | Максимальный приоритет (Primary Root) |
| 4096 | 0x1000 | Secondary Root (backup) |
| 8192 | 0x2000 | Третий по приоритету |
| 32768 | 0x8000 | Значение по умолчанию |
| 61440 | 0xF000 | Минимальный приоритет |
Для основного коммутатора (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 Gbps | 2 | 2000 |
| 1 Gbps | 4 | 20000 |
| 100 Mbps | 19 | 200000 |
| 10 Mbps | 100 | 2000000 |
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 Bridgeroot-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— является ли порт edgepoint-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, сеть не работает.
Причины:
- protocol-mode=none на одном из коммутаторов. Если один коммутатор не участвует в STP — он не отправляет BPDU. Другие коммутаторы могут получить BPDU с неожиданных направлений и заблокировать все порты.
[admin@MikroTik] ># Проверьте режим на всех коммутаторах /interface/bridge print where protocol-mode=none
- Конфликт версий 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) не пересылают трафик ни аппаратно, ни программно.
/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