Настройка сети в Hyper-V с помощью Powershell

Настройка сети в Hyper-V с помощью Powershell может являться достаточно распространенным сценарием, ведь во многих случаях хост Hyper-V представляет из себя систему с интерфейсом Server Core. Факт однообразия конфигурации хостов виртуализации только способствует такому подходу.
В статье вы увидите пример решений одной из задач администрирования реальной инфраструктуры в продакшене.
Если вам интересна тематика Windows Server, рекомендую обратиться к тегу  Windows Server  на моем блоге.

Настройка сети в Hyper-V с помощью Powershell

Окружение

Что было: парк серверов виртуализации, которые нужно перенастроить. Конфигурация типовая, на каждом сервере одна встроенная сетевая карта с двумя интерфейсами.
  • Один интерфейс использовался для управления хостом;
  • На втором интерфейсе висел единственный виртуальный коммутатор, через который ВМ выходили наружу.
То есть достучаться до хоста можно было по одному единственному адресу.
Что нужно было сделать: на базе двух интерфейсов создать тиминг-группу, на базе этой тиминг-группы создать внешний виртуальный коммутатор и подключить к нему все ВМ.
Если интересуют детали реализации на уровне сетевого оборудования, то конечно же каждый из двух сетевых интерфейсов сервера планировалось что будет смотреть в отдельный коммутатор. То есть была цель реализовать избыточность на уровне сетевого оборудования.
Примечание: внимательный читатель спросит зачем все это нужно, если избыточности на уровне сетевых карт сервера нету. Все верно, но хоть что-то. На моей памяти коммутаторы выходили из строя значительно чаще, чем сетевые карты на серверах, так что есть смысл обеспечить резервирование хотя бы на таком уровне.

Последовательность операций

Коротко пройдемся по основным этапам настройки.

Удаление старого виртуального коммутатора

Вы не сможете удалить виртуальный коммутатор, если к нему будут подключены ВМ. Отключаем все адаптеры всех ВМ одной командой:
Теперь можно удалить виртуальный коммутатор:
Напомню, что в моем окружении на каждом сервере был только один vSwitch.

Сохранение сетевых настроек

На каждом сервере был всего лишь один адаптер со статическими сетевыми настройками, а потому можно их легко запомнить, чтобы потом назначить тиминг-адаптеру.
Сохраняем ip-адрес:
Маску подсети:
Шлюз (пришлось погуглить, чтобы дойти до такой конструкции)
Серверы DNS:
Все настройки сохранены.

Создание тиминг-группы

Создается одной командой:
Конструкция ( Get-NetAdapter -Physical ).Name возвращает список имен всех физических интерфейсов. Если ваша конфигурация отличается, вам стоит обратить внимание на этот момент.

Создание виртуального коммутатора

Тиминг-группа создана, можно на её основе создать виртуальный коммутатор:
Параметр -AllowManagementOS $true создаст виртуальный сетевой адаптер хоста.

Возвращение сетевых настроек

Тиминг-группа создана, виртуальный коммутатор на её основе тоже. После этого создался виртуальный сетевой адаптер хоста (имя по умолчанию vEthernet (External)), которому мы должны назначить ранее сохраненные сетевые настройки:
DNS-настройки восстанавливаются отдельно:
После завершения работы скрипта хост должен быть доступен по старому адресу.

Подключение адаптеров ВМ

Подключаем все адаптеры всех ВМ к единственному виртуальному коммутатору:
Далее самое интересное.

Настройка VLAN виртуальных машин

Порты коммутаторов, к которым подключен сервер, должны быть выставлены в trunk-режим. Каждой виртуальной машине выставим идентификатор VLAN:
Примечание: такой подход более гибкий. Каждой виртуальной машине вы можете выставить произвольный идентификатор VLAN.
Команда PowerShell выше эквивалентна ручному выставлению VLAN ID в настройках сетевого адаптера виртуальной машины:
Остался последний этап.

Настройка VLAN хоста

Установим идентификатор VLAN на виртуальном адаптере хоста:
Где $HostVlanId — идентификатор VLAN, который определен в этой переменной в самом начале скрипта.

Команда PwerShell выше эквивалентна ручному выставлению VLAN ID в настройках виртуального коммутатора.
Примечание: Внимание! При изменении этих настроек вы можете потерять соединение с хостом.
На этом работа скрипта завершена, доступ к хосту и всем ВМ должен восстановиться.