Настройка сети в Hyper-V с помощью Powershell может являться достаточно распространенным сценарием, ведь во многих случаях хост Hyper-V представляет из себя систему с интерфейсом Server Core. Факт однообразия конфигурации хостов виртуализации только способствует такому подходу.
В статье вы увидите пример решений одной из задач администрирования реальной инфраструктуры в продакшене.
Если вам интересна тематика Windows Server, рекомендую обратиться к тегу Windows Server на моем блоге.
Содержание
Настройка сети в Hyper-V с помощью Powershell
Если читать лень и хотите сразу получить скрипт, то пожалуйста – NetReconfigure(rev.1.0.0). Есть также расширенная версия, которая обрабатывает некоторые возможные ситуации – NetReconfigure(rev.1.0.1).
Но все же я советую прочесть хотя бы раздел ниже, чтобы понимать для чего предназначен сценарий.
Также не забудьте установить переменные в актуальные для вас значения.
Окружение
Что было: парк серверов виртуализации, которые нужно перенастроить. Конфигурация типовая, на каждом сервере одна встроенная сетевая карта с двумя интерфейсами.
- Один интерфейс использовался для управления хостом;
- На втором интерфейсе висел единственный виртуальный коммутатор, через который ВМ выходили наружу.
То есть достучаться до хоста можно было по одному единственному адресу.
Что нужно было сделать: на базе двух интерфейсов создать тиминг-группу, на базе этой тиминг-группы создать внешний виртуальный коммутатор и подключить к нему все ВМ.
Если интересуют детали реализации на уровне сетевого оборудования, то конечно же каждый из двух сетевых интерфейсов сервера планировалось что будет смотреть в отдельный коммутатор. То есть была цель реализовать избыточность на уровне сетевого оборудования.
Последовательность операций
Коротко пройдемся по основным этапам настройки.
Удаление старого виртуального коммутатора
Вы не сможете удалить виртуальный коммутатор, если к нему будут подключены ВМ. Отключаем все адаптеры всех ВМ одной командой:
1 |
Get-VM | Get-VMNetworkAdapter | Disconnect-VMNetworkAdapter |
Теперь можно удалить виртуальный коммутатор:
1 |
Get-VMSwitch | Remove-VMSwitch -Force |
Напомню, что в моем окружении на каждом сервере был только один vSwitch.
Сохранение сетевых настроек
На каждом сервере был всего лишь один адаптер со статическими сетевыми настройками, а потому можно их легко запомнить, чтобы потом назначить тиминг-адаптеру.
Сохраняем ip-адрес:
1 |
$IpAddress = ( Get-NetIPAddress | Where-Object IPAddress -Like $NetworkPrefix | Select-Object -First 1 ).IPAddress |
Маску подсети:
1 |
$PrefixLength = ( Get-NetIPAddress | Where-Object IPAddress -Like $NetworkPrefix | Select-Object -First 1 ).Prefixlength |
Шлюз (пришлось погуглить, чтобы дойти до такой конструкции)
1 |
$DefaultGateway = ( Get-WmiObject -Class Win32_IP4RouteTable | where { $_.destination -eq '0.0.0.0' -and $_.mask -eq '0.0.0.0' } | Sort-Object metric1 | select -First 1 nexthop, metric1, interfaceindex ).nexthop |
Серверы DNS:
1 |
$DnsServers = Get-DnsClientServerAddress -AddressFamily IPv4 | Select-Object –ExpandProperty ServerAddresses -Unique |
Все настройки сохранены.
Создание тиминг-группы
Создается одной командой:
1 |
New-NetLbfoTeam -Name $NicTeamName -TeamingMode SwitchIndependent -LoadBalancingAlgorithm HyperVPort -TeamMembers ( Get-NetAdapter -Physical ).Name -Confirm:$False |
Конструкция ( Get-NetAdapter -Physical ).Name возвращает список имен всех физических интерфейсов. Если ваша конфигурация отличается, вам стоит обратить внимание на этот момент.
Создание виртуального коммутатора
Тиминг-группа создана, можно на её основе создать виртуальный коммутатор:
1 |
New-VMSwitch -Name $VMSwitchName -NetAdapterName $NicTeamName -AllowManagementOS $true -Confirm:$False |
Параметр -AllowManagementOS $true создаст виртуальный сетевой адаптер хоста.
Возвращение сетевых настроек
Тиминг-группа создана, виртуальный коммутатор на её основе тоже. После этого создался виртуальный сетевой адаптер хоста (имя по умолчанию vEthernet (External)), которому мы должны назначить ранее сохраненные сетевые настройки:
1 |
New-NetIPAddress -InterfaceAlias "vEthernet (External)" -IPAddress $IpAddress -PrefixLength $PrefixLength -DefaultGateway $DefaultGateway |
DNS-настройки восстанавливаются отдельно:
1 |
Set-DnsClientServerAddress -InterfaceAlias "vEthernet (External)" -ServerAddresses $DnsServers |
После завершения работы скрипта хост должен быть доступен по старому адресу.
Подключение адаптеров ВМ
Подключаем все адаптеры всех ВМ к единственному виртуальному коммутатору:
1 |
Get-VM | Get-VMNetworkAdapter | Connect-VMNetworkAdapter -VMSwitch ( Get-VMSwitch | Select-Object -First 1 ) |
Далее самое интересное.
Настройка VLAN виртуальных машин
Порты коммутаторов, к которым подключен сервер, должны быть выставлены в trunk-режим. Каждой виртуальной машине выставим идентификатор VLAN:
1 |
Get-VM | Get-VMNetworkAdapter | Set-VMNetworkAdapterVlan -VlanId $VMVlanId -Access |
Команда PowerShell выше эквивалентна ручному выставлению VLAN ID в настройках сетевого адаптера виртуальной машины:
Остался последний этап.
Настройка VLAN хоста
Установим идентификатор VLAN на виртуальном адаптере хоста:
1 |
Set-VMNetworkAdapterVlan -ManagementOS -Access -VlanId $HostVlanId |
Где $HostVlanId – идентификатор VLAN, который определен в этой переменной в самом начале скрипта.
Команда PwerShell выше эквивалентна ручному выставлению VLAN ID в настройках виртуального коммутатора.
На этом работа скрипта завершена, доступ к хосту и всем ВМ должен восстановиться.