Прокол связующего дерева (Spanning Tree, STP) стал неотъемлемой частью практически любой сети средних размеров, не говоря уже о сетях крупных организаций. Этот прокол предназначен для борьбы с петлями в сетевой топологии. Конечно, тем кто в былые времена сдавал CCNA/CCNP/CCIE (хотя бы written) теоретическая и практическая часть представленного в статье материала должна быть хорошо знакома, причем практика знакома по оборудованию одной известной компании, которая уже нас покинула. Но тем, кто только начинает постигать сетевые технологии данная тема должна быть интересна.

При проведении различных курсов я обратил внимание на то, что у слушателей есть большой интерес к российским решениям, тем же российским Линуксам. Поэтому в статье в качестве практических примеров я буду использовать команды для настройки коммутаторов одного российского вендора. Тем более, что эти команды очень похожи на те, что использовал ушедший западный гигант на своем оборудовании.

Петли и их проблемы

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

Совершенно очевидно, что для доступа к каждому из них можно использовать два маршрута. Однако, на практике в каждый момент времени должен быть активен только один маршрут, иначе коммутатор сойдет с ума не зная, куда слать фреймы. Конечно, проблему можно решить без всякого STP, просто физически включив по одному кабелю между коммутаторами и убрав кабель между SW2 и SW3. Но если какие-нибудь “добрые” люди переедут этот кабель чем-нибудь тяжелым, то мы лишимся доступности части узлов. Поэтому борьба с петлями физическими отключениями кабелей автоматически лишает нас отказоустойчивости. А вот протокол Spanning Tree как раз позволяет при наличии избыточных подключений, на логическом уровне отключать некоторые из них для того, чтобы обеспечить единственный маршрут.

Когда немного штормит

Еще одной полезной функцией STP является возможность предотвращать широковещательные (broadcast) штормы. Чтобы понять, что это такое снова рассмотрим представленный выше рисунок.  Представим, что SW1 отправляет широковещательный кадр в SW2 и SW3. Оба коммутатора принимают кадр и пересылают его из каждого порта, кроме порта, на который был получен кадр. То есть, SW2 перенаправляет кадр в SW3, а SW3 получает этот кадр и пересылает его SW1, но SW1 затем снова перенаправляет кадр на SW2. Круг замкнулся. То же самое происходит и в противоположном направлении. Без STP эти фреймы зацикливались бы в бесконечном цикле. STP предотвращает циклы, переводя один из портов коммутатора в состояние блокировки.

Как работает связующее дерево

Итак, мы разобрались с тем, для чего предназначен STP и какие проблемы можно решить с его помощью. Теперь поговорим о том, как работает этот протокол. Для своей работы Spanning Tree строит базу данных, содержащую топологию сети.  Чтобы предотвратить зацикливания, STP переводит некоторые интерфейсы в состояние пересылки, а другие интерфейсы - в состояние блокировки.

После каждый коммутатор по умолчанию считает себя корневым и рассылает в режиме мультикаста  BPDU (BPDU (Bridge Protocol Data Units)) фреймы со всех своих портов. Эти фреймы получают все коммутаторы, на которых активирован STP.  Далее происходит выбор корневого (root) коммутатора. Этот коммутатор, который является по сути центром сети Spanning Tree. Порты этого коммутатора находятся в состоянии пересылки, то есть через них идет весь трафик.

Выбор корневого коммутатора основан на двух критериях. Первый это приоритет коммутатора. По умолчанию все коммутаторы имеют одинаковый приоритет. Однако, администратор может назначить бОльший приоритет например наиболее производительному коммутатору, и тогда он будет назначен корневым. Приоритет может иметь значение от 0 до 65535 и должен быть кратен 4096.

Но, если приоритеты у всех коммутаторов одинаковые, то тогда для выбора root используется второй критерий – MAC адреса. Тот коммутатор, который имеет наименьший MAC адрес становится корневым.

Все остальные коммутаторы, определяют наилучший путь для доступа к корневому коммутатору. Порт, используемый для подключения к корневому коммутатору (root port), переведен в состояние переадресации. А все остальные порты блокируются и не участвуют в пересылке фреймов.

При этом, в процессе построения STP сетевой топологии, порты могут находиться в одном из четырех состояний. До тех, пока не выбран корневой коммутатор, порты находятся в специальном состоянии прослушивания (Listening), когда передаются только BPDU. Фреймы с данными в таком состоянии не передаются и не принимаются. Данное состояния длиться в соответствии со значением Forward delay timer, по умолчанию это 15 секунд. Это время STP выделяет для выбора Root Bridge.

Далее порт переходит в состояние обучения (Learning) в котором фреймы с данными, приходящие на порт, изучаются и их МАС-адреса заносятся в таблицу МАС-адресов коммутатора. Но дальше эти фреймы никуда не отправляются, пересылаются по-прежнему только BPDU.

Наконец, состояние пересылки (Forwarding) которое является обычным состоянием для порта и в нем передаются фреймы с обычными данными.

Четвертое состояние это блокирование (Blocking) – в нем через порт не передаются никакие фреймы. Это состояние используется для исключения избыточности топологии.   

Таким образом, мы получаем сетевую топологию без петель. В случае, если root или какой-либо из коммутаторов станет недоступен, процесс пересчета Spanning Tree будет запущен заново, то есть при необходимости будет выбран новый корневой коммутатор и назначены новые порты, ведущие к нему.

Проблемы Spanning Tree

При выборе корневого коммутатора по МАС адресам может возникнуть проблема победы старого коммутатора. Дело в том, что очень часто старые коммутаторы имеют меньшие значения МАС адресов. Так, если у нас используется оборудование от одного вендора, то первые три октета в адресе могут оказаться одинаковыми и соответственно выбор будет делаться по последним трем октетам и победит коммутатор, произведенный раньше, потому, что его МАС окажется меньшим. Для предотвращения подобных ситуаций администратор может самостоятельно назначить высокий приоритет наиболее мощному коммутатору, для того, чтобы он всегда назначался корневым.

Настройка STP

В качестве примера посмотрим настройку Spanning Tree на коммутаторе Eltex. Для включения STP на коммутаторе воспользуемся командой:

(config)# spanning-tree enable

Замечу, что STP можно запустить в различных режимах, но подробнее о различных вариантах реализации Spanning Tree мы поговорим в следующей статье.

Если нас не устраивает задержка по умолчанию, то задать свое значение в секундах можно с помощью:

(config)# spanning-tree fdelay 20

Данной командой устанавливается значение таймера ожидания BPDU-пакета.

Задать приоритет коммутатора можно с помощью команды

(config)# spanning-tree priority 36864

Значение приоритета по умолчанию 32768.

Еще одна важная функция, которую неплохо бы настраивать при использовании STP это bpduguard. Эта функция защищает от приема поддельных BPDU, отправляемых злоумышленником. Подробнее об атаках и безопасности STP мы поговорим в следующих статьях. Но активировать этот механизм лучше сразу при запуске STP.

(config)# spanning-tree bpduguard enable

Заключение

В этой статье мы рассмотрели предназначение и основные принципы работы протокола Spanning Tree. В следующей статье мы поговорим о различных версиях данного протокола.

Ну и напоследок хочу порекомендовать вам бесплатный вебинар, где мои коллеги разберут основы протокола IPv6, сравнят его с IPv4, познакомят вас со структурой и принципами работы IPv6. Также вы на практике увидите, как настроить сеть для работы с этим протоколом.

Комментарии (6)


  1. oller
    01.08.2023 16:25

    А какой тип STP настраивается?

    MSTP? И как уживается с rpvst+?


  1. reticular
    01.08.2023 16:25

    после настройки STP обязательно проверьте как отрабатывается петля
    бывает сеть колбасит более 5 сек! критичен ли такой обрыв связи для ваших задач?
    может лучше OSPF?


    1. Pinkbyte
      01.08.2023 16:25

      OSPF безусловно лучше, но только если у вас все коммутаторы L3. Что чаще всего не так.


  1. Pochemuk
    01.08.2023 16:25

    Помнится, намучался я как-то с коммутаторами HPE. Хотя, в целом впечатление о них нормальное, но есть ньюанус:


    Достаточно старая сеть без всяких STP. Разделена на 2-3 подсети. Но для экономии оборудования используют общие коммутаторы, разделенные на Port-Based VLAN. Без всяких транков. Часть портов отведена одной подсети, часть другой.


    Т.е. как бы каждая отдельная логическая подсеть не имеет петель. А вот физически разные подсети могут образовывать петли. И образовывали.


    Т.к. в стеке протоколов STP ничего не знает про VLAN, то такую топологию он принимает за избыточную и часть портов блокирует, хотя они принадлежат разным VLAN и между ними трафика нет.


    Но это не сказывалось на старых коммутаторах TrendNET и некоторых других (ZyXEL, D-Link и пр). Потому что на них из коробки STP был выключен. А на HPE — включен. Стоило заменить старый "разделенный" коммутатор на HPE, как половина сети отваливалась.


    Матерился долго, пока не подсказал один пользователь здесь на Хабре отключить STP. У него у самого была такая проблема на пограничном Huawei, подсоединенном к разным провайдерам.


  1. eternalwayfarer
    01.08.2023 16:25

    (config)# spanning-tree fdelay 20

    Данной командой устанавливается значение таймера ожидания BPDU-пакета.

    Команда, судя по всему, предназначается для настройки параметра Forward delay, и отвечает он не за время ожидания BPDU, а за длительность состояний Listening и Learning.


  1. CherMet90
    01.08.2023 16:25

    Откуда информация, что команда spanning-tree bpduguard enable реагирует имменно на поддельные BPDU? Я так понимаю, что порт в этом режиме отреагрует на получение ЛЮБОГО BPDU и уйдет в err-disable