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

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

В статье вы увидите пример решений одной из задач администрирования реальной инфраструктуры в продакшене.


Если вам интересна тематика Windows Server, рекомендую обратиться к тегу  Windows Server  на моем блоге.


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

Если читать лень и хотите сразу получить скрипт, то пожалуйста — NetReconfigure(rev.1.0.0). Есть также расширенная версия, которая обрабатывает некоторые возможные ситуации — NetReconfigure(rev.1.0.1).

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

Окружение

Что было: парк серверов виртуализации, которые нужно перенастроить. Конфигурация типовая, на каждом сервере одна встроенная сетевая карта с двумя интерфейсами.

  • Один интерфейс использовался для управления хостом;
  • На втором интерфейсе висел единственный виртуальный коммутатор, через который ВМ выходили наружу.

То есть достучаться до хоста можно было по одному единственному адресу.

Что нужно было сделать: на базе двух интерфейсов создать тиминг-группу, на базе этой тиминг-группы создать внешний виртуальный коммутатор и подключить к нему все ВМ.

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

Примечание: внимательный читатель спросит зачем все это нужно, если избыточности на уровне сетевых карт сервера нету. Все верно, но хоть что-то. На моей памяти коммутаторы выходили из строя значительно чаще, чем сетевые карты на серверах, так что есть смысл обеспечить резервирование хотя бы на таком уровне.

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

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

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

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

Get-VM | Get-VMNetworkAdapter | Disconnect-VMNetworkAdapter

Теперь можно удалить виртуальный коммутатор:

Get-VMSwitch | Remove-VMSwitch -Force

Напомню, что в моем окружении на каждом сервере был только один vSwitch.

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

На каждом сервере был всего лишь один адаптер со статическими сетевыми настройками, а потому можно их легко запомнить, чтобы потом назначить тиминг-адаптеру.

Сохраняем ip-адрес:

$IpAddress = ( Get-NetIPAddress | Where-Object IPAddress -Like $NetworkPrefix | Select-Object -First 1 ).IPAddress

Маску подсети:

$PrefixLength = ( Get-NetIPAddress | Where-Object IPAddress -Like $NetworkPrefix | Select-Object -First 1 ).Prefixlength

Шлюз (пришлось погуглить, чтобы дойти до такой конструкции)

$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:

$DnsServers = Get-DnsClientServerAddress -AddressFamily IPv4 | Select-Object –ExpandProperty ServerAddresses -Unique

Все настройки сохранены.

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

Создается одной командой:

New-NetLbfoTeam -Name $NicTeamName -TeamingMode SwitchIndependent -LoadBalancingAlgorithm HyperVPort -TeamMembers ( Get-NetAdapter -Physical ).Name -Confirm:$False

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

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

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

New-VMSwitch -Name $VMSwitchName -NetAdapterName $NicTeamName -AllowManagementOS $true -Confirm:$False

Параметр -AllowManagementOS $true создаст виртуальный сетевой адаптер хоста.

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

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

New-NetIPAddress -InterfaceAlias "vEthernet (External)" -IPAddress $IpAddress -PrefixLength $PrefixLength -DefaultGateway $DefaultGateway

DNS-настройки восстанавливаются отдельно:

Set-DnsClientServerAddress -InterfaceAlias "vEthernet (External)" -ServerAddresses $DnsServers

После завершения работы скрипта хост должен быть доступен по старому адресу.

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

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

Get-VM | Get-VMNetworkAdapter | Connect-VMNetworkAdapter -VMSwitch ( Get-VMSwitch | Select-Object -First 1 )

Далее самое интересное.

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

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

Get-VM | Get-VMNetworkAdapter | Set-VMNetworkAdapterVlan -VlanId $VMVlanId -Access

Примечание: такой подход более гибкий. Каждой виртуальной машине вы можете выставить произвольный идентификатор VLAN.

Команда PowerShell выше эквивалентна ручному выставлению VLAN ID в настройках сетевого адаптера виртуальной машины:

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

Остался последний этап.

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

Установим идентификатор VLAN на виртуальном адаптере хоста:

Set-VMNetworkAdapterVlan -ManagementOS -Access -VlanId $HostVlanId

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

Команда PwerShell выше эквивалентна ручному выставлению VLAN ID в настройках виртуального коммутатора.

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

Примечание: Внимание! При изменении этих настроек вы можете потерять соединение с хостом.

На этом работа скрипта завершена, доступ к хосту и всем ВМ должен восстановиться.

comments powered by HyperComments