Эта статья была навеяна мне недавними беседами в Telegram-чатике среди матерых инженеров и поднятой темой про то, о чем не думают пока не столкнуться. Разговор пойдет о BPDU Filter на ESXi хостах. Для чего он нужен и от чего может спасти.
Начнем с того что такое BPDU. Bridged Protocol Data Units – это тип сетевого трафика, с помощью которого физические коммутаторы обмениваются между собой информацией о топологии STP. Что такое STP. Это протокол L2 уровня, предназначенный для ликвидации возможности сетевых штормов путем построения логического дерева начиная от ROOT коммутатора и ликвидации избыточных линков. Разбираться как работает STP детально мы не будем, для этого есть куча ресурсов с подробным описанием, а также прекрасный цикл статей — сети для самых маленьких.
У STP есть несколько состояний порта и в одном из них он может пересылать пакеты – Forwarding. Так вот что бы порт перешел в это состояние и начал пересылать пакеты требуется некоторое время, около 30-50 секунд после подключения линка. Все это время питание на порту присутствует, но порт фактически не работает, а слушает и отправляет BPDU.
Виртуальные коммутаторы vSphere не могут образовать петель в сети и способствовать созданию широковещательных штормов. Они не имеют STP процессов и не учавствуют в построении STP топологии. Соответственно и не работают с BPDU пакетами. Не могут быть их источниками.
При подключении ESXi аплинка к порту коммутатора, трафик с него не пойдет в сеть сразу, так как порт физического свича должен для этого перейти в FORWARDING, но хост считает, что аплинк в UP, так как есть питание на порту и шлет в него пакеты. И так как STP на виртуальных свитчах не работает, да и ждать пока порт подымется в FORWARDING долговато, поэтому в большинстве инфраструктур на портах коммутаторов, к которым подключены ESXi хосты настраивается PortFast. Эта настройка заводит порт сразу в FORWARDING. PortFast используется на портах, подключенных к конечным устройствам, которые не принимают участия в STP и соответственно не рассылают BPDU. Но не все так безоблачно. Иногда случается, что в такой порт по ошибке может быть подсоединен избыточный линк или другой коммутатор, который может привести к петле и шторму соответственно. В этом случае настраивают на таких портах BPDU Guard, функция которая положит порт в down если на него от подключенного устройства придет BPDU фрейм. Это нужно для исключения возможности подключения коммутатора в «неправильный» порт, еще зовется «защитой от дурака». Помня, что от виртуальных свитчей на борту ESXi хоста BPDU не дождешься мы, наверное, можем и расслабиться? Но на хосте могут работать виртуальные машины, которые так не думают.
VM может быть источником BPDU трафика. Причин тому может быть много – проделки злоумышленника, какой ни будь сетевой сервис, запущенный на виртуалке нерадивым админом в целях теста, либо еще что-нибудь. И вот наша VM изрыгает пачку BPDU пакетов, vSwitch пропихивает их на физические аплинки, а там порт коммутатора с настроенным BPDU Guard ловит их и стремительно отправляется в down. Так как на большинстве хостов аплинка два или больше, наш гипервизор видя, что один аплинк ушел в down, перенаправляет трафик «нехорошей» VM на оставшиеся. Но и они тут же отключаются тем же BPDU Guard-ом. Вуаля, хост изолирован и все VM на нем отрезаны от сети, или перезагружены в следствии реакции на Host Isolation.
Что бы ликвидировать возможность подобного инцидента и существует на ESXi BPDU Filter. Данная фича блокирует весь BPDU трафик, исходящий с виртуальных машин.
Включить этот фильтр можно в Advanced Settings хоста. Отвечает за него параметр Net.BlockGuestBPDU. Нужно установить 1 в значении параметра, 0 выключает фильтр. Особенности настройки:
- Включить BPDU Filter можно только на уровне хоста, поэтому если хостов много, включить его нужно на всех.
- BPDU Filter работает как на VDS так и на Standard vSwitch.
- По умолчанию BPDU Filter отключен.
- После включения хост перезагружать ненужно.
Вот теперь действительно можно расслабиться.