Hyper-V. Часть 4: Настраиваем сеть виртуальных машин

Все части серии «Hyper-V»

В первой части мы создали один external-коммутатор и подключили к нему машину. Здесь разберём сеть Hyper-V целиком: какие бывают виртуальные коммутаторы и что происходит с картой хоста, как раздавать машинам VLAN и частные VLAN, как объединить несколько карт и как обслуживать сетевые адаптеры машин — от добавления на ходу до защиты от чужого DHCP-сервера.


Виртуальные коммутаторы

Виртуальная сетевая карта машины подключается к виртуальному коммутатору — программному Ethernet-коммутатору внутри корневого раздела (обзор Hyper-V Virtual Switch). Он, как и настоящий, учит MAC-адреса на портах и пересылает кадры между ними. Типов три (создание коммутатора):

  • External — привязан к физической сетевой карте хоста, машины выходят через неё в обычную сеть.
  • Internal — связывает машины между собой и с хостом, но не с внешней сетью.
  • Private — связывает только машины; хост в этой сети не участвует.
       External               Internal             Private
┌──────────────────────┐  ┌─────────────────┐  ┌───────────────┐
│ VM1   VM2   хост     │  │  VM3     хост   │  │  VM4    VM5   │
│  │     │     │       │  │   │       │     │  │   │      │    │
│ ─┴─────┴─────┴───┬── │  │ ──┴───────┴──── │  │ ──┴──────┴─── │
└──────────────────┼───┘  └─────────────────┘  └───────────────┘
                   │
            физическая NIC
                   │
               сеть офиса
Get-NetAdapter
New-VMSwitch -Name 'LAN' -NetAdapterName 'Ethernet 1' -AllowManagementOS $true
New-VMSwitch -Name 'Lab' -SwitchType Internal
New-VMSwitch -Name 'Isolated' -SwitchType Private
Get-VMSwitch | Format-Table Name, SwitchType, NetAdapterInterfaceDescription, AllowManagementOS

Тип external задаётся неявно — параметром -NetAdapterName или -NetAdapterInterfaceDescription; для двух других нужен -SwitchType (New-VMSwitch).

Что происходит с картой хоста

После привязки к external-коммутатору физическая карта перестаёт быть обычной сетевой картой хоста: на ней остаётся только расширение коммутатора Hyper-V, а IP-адресов у неё больше нет. Если -AllowManagementOS $true, хост получает новый виртуальный адаптер vEthernet (<имя коммутатора>), подключённый к тому же коммутатору, и IP-настройки физической карты переезжают на него. Если $false, карта целиком отдана машинам, и хост в этой сети не участвует — так делают для отдельной карты под трафик машин.

Поэтому создание external-коммутатора на сервере, к которому вы подключены удалённо, рвёт сессию на несколько секунд — именно об этом предупреждала первая часть.

Get-NetAdapter | Format-Table Name, InterfaceDescription, Status, MacAddress
Get-NetIPAddress -AddressFamily IPv4 | Format-Table InterfaceAlias, IPAddress, PrefixLength
Get-VMNetworkAdapter -ManagementOS | Format-Table Name, SwitchName, MacAddress

У хоста может быть несколько адаптеров на одном коммутаторе — под управление, живую миграцию, кластер; их добавляет Add-VMNetworkAdapter -ManagementOS, о них ниже в разделе про SET.

Переименовать коммутатор, сменить ему карту или тип — Set-VMSwitch и Rename-VMSwitch; удалить — Remove-VMSwitch, причём адаптеры машин на нём остаются, но становятся неподключёнными (Set-VMSwitch).

VLAN

Как устроены VLAN, разобрано в части про VLAN серии о сетях. В Hyper-V теги ставит и снимает сам виртуальный коммутатор: физический порт, куда подключена карта хоста, настраивается как trunk со всеми нужными VLAN, а VLAN назначается каждой виртуальной сетевой карте отдельно (Set-VMNetworkAdapterVlan).

У адаптера четыре режима, и они взаимоисключающие:

Режим Параметры Что видит машина
Untagged -Untagged кадры без тега, как будто VLAN нет; режим по умолчанию
Access -Access -VlanId 20 обычную сеть без тегов; коммутатор ставит и снимает тег 20 сам
Trunk -Trunk -AllowedVlanIdList '10-30' -NativeVlanId 1 кадры с тегами из списка; кадры native VLAN приходят без тега
Private VLAN -Isolated, -Community, -Promiscuous об этом ниже
Set-VMNetworkAdapterVlan -VMName app1 -Access -VlanId 20
Set-VMNetworkAdapterVlan -VMName fw1 -Trunk -AllowedVlanIdList '10,20,30' -NativeVlanId 1
Set-VMNetworkAdapterVlan -ManagementOS -VMNetworkAdapterName 'LAN' -Access -VlanId 10
Set-VMNetworkAdapterVlan -VMName test1 -Untagged
Get-VMNetworkAdapterVlan -VMName app1, fw1

Access — режим для обычных машин: гость ничего не знает о VLAN. Trunk нужен машине, которая сама работает с тегами, — маршрутизатору или файрволу, у которого внутри интерфейсы в разных VLAN. Третья строка переводит в VLAN 10 адаптер самого хоста — тот самый vEthernet (LAN); если сделать это удалённо по этому же адаптеру, а порт физического коммутатора не пропускает VLAN 10, связь с хостом пропадёт.

Когда у машины несколько адаптеров, указывайте -VMNetworkAdapterName: без него команда меняет VLAN на всех адаптерах машины сразу. Смена VLAN на ходу для гостя выглядит как переезд в другую сеть: адрес из старой подсети перестанет работать, пока его не поменяют.

Частные VLAN

Внутри одного VLAN все машины видят друг друга. Когда в одной подсети стоят машины разных клиентов или серверы, которым незачем общаться между собой, коммутатор Hyper-V умеет частные VLAN (PVLAN): порт получает два номера — первичный VLAN и вторичный — и один из трёх режимов (PVLAN в Hyper-V Virtual Switch):

Режим С кем обменивается кадрами
Isolated только с портами Promiscuous своей PVLAN
Community с портами своего сообщества (того же вторичного VLAN) и с портами Promiscuous
Promiscuous со всеми портами PVLAN

Типичная схема — шлюз или файрвол в режиме Promiscuous и машины за ним: веб-серверы, которые не должны видеть друг друга, — в Isolated, пара серверов приложений, которым нужно общаться между собой, — в своём Community (Set-VMNetworkAdapterVlan):

Set-VMNetworkAdapterVlan -VMName web1, web2 -Isolated  -PrimaryVlanId 10 -SecondaryVlanId 200
Set-VMNetworkAdapterVlan -VMName app1, app2 -Community -PrimaryVlanId 10 -SecondaryVlanId 201
Set-VMNetworkAdapterVlan -VMName gw1 -Promiscuous -PrimaryVlanId 10 -SecondaryVlanIdList '200-201'
Get-VMNetworkAdapterVlan -VMName web1, web2, app1, app2, gw1

Isolated и Community задаются одним вторичным VLAN (-SecondaryVlanId), Promiscuous — списком всех вторичных, которые он обслуживает (-SecondaryVlanIdList). Всё это работает внутри коммутатора Hyper-V, но если машины одной PVLAN стоят на разных хостах, физические коммутаторы между ними должны пропускать и первичный, и вторичные VLAN (там же).

Несколько карт: SET

Отказоустойчивость сети хоста обеспечивает объединение нескольких физических карт. Для Hyper-V это SET (Switch Embedded Teaming): объединение строится внутри самого виртуального коммутатора, в команде может быть до восьми карт (SET в требованиях к сети хоста). Старое объединение LBFO (New-NetLbfoTeam) работает и сейчас, но с Windows Server 2022 к нему нельзя привязать виртуальный коммутатор — только SET (удалённые и устаревшие функции).

New-VMSwitch -Name 'SETswitch' -NetAdapterName 'NIC1', 'NIC2' -EnableEmbeddedTeaming $true -AllowManagementOS $true
Get-VMSwitchTeam -Name 'SETswitch' | Format-List

Карты в SET должны быть одинаковыми — производитель, модель, скорость. Поверх такого коммутатора хосту добавляют несколько виртуальных адаптеров под разные задачи — управление, живая миграция, кластер — каждый в своём VLAN:

Add-VMNetworkAdapter -ManagementOS -SwitchName 'SETswitch' -Name 'LiveMigration'
Set-VMNetworkAdapterVlan -ManagementOS -VMNetworkAdapterName 'LiveMigration' -Access -VlanId 40
New-NetIPAddress -InterfaceAlias 'vEthernet (LiveMigration)' -IPAddress 192.168.40.11 -PrefixLength 24

Добавить или убрать карту из команды — Add-VMSwitchTeamMember и Remove-VMSwitchTeamMember (Add-VMSwitchTeamMember).

В кластерах на Windows Server 2025 эту работу может делать Network ATC: вы описываете назначение карт (intent — management, compute, storage), а он сам создаёт SET, адаптеры и VLAN одинаково на всех узлах (Network ATC).

Сетевые адаптеры машины

Посмотреть адаптеры машины с коммутатором, MAC, адресами и VLAN:

Get-VMNetworkAdapter -VMName app1 | Format-Table Name, SwitchName, MacAddress, Status, IPAddresses
Get-VMNetworkAdapterVlan -VMName app1

Столбец IPAddresses заполняется службой интеграции Data Exchange из второй части: у машины без служб интеграции он пустой.

Добавить адаптер. У машины второго поколения — на ходу, у первого — только на выключенной (таблица совместимости). У адаптера стоит сразу задать имя и включить -DeviceNaming: тогда имя адаптера Hyper-V видно внутри гостя, и по нему можно найти нужную карту, а не гадать между Ethernet 2 и Ethernet 3 (Add-VMNetworkAdapter; как имя выглядит в госте — в заметке команды Hyper-V):

$cred = Get-Credential 'app1\Administrator'
Add-VMNetworkAdapter -VMName app1 -SwitchName 'LAN' -Name 'Backup' -DeviceNaming On
Set-VMNetworkAdapterVlan -VMName app1 -VMNetworkAdapterName 'Backup' -Access -VlanId 50

Invoke-Command -VMName app1 -Credential $cred {
    $nic = Get-NetAdapterAdvancedProperty -DisplayName 'Hyper-V Network Adapter Name' |
           Where-Object DisplayValue -eq 'Backup'
    Rename-NetAdapter -Name $nic.Name -NewName 'Backup'
    New-NetIPAddress -InterfaceAlias 'Backup' -IPAddress 192.168.50.21 -PrefixLength 24
}

Invoke-Command -VMName — PowerShell Direct, команды внутри гостя по VMBus; подробно он разобран в части об управлении с рабочей станции. Шлюз на второй карте обычно не задают: маршрут по умолчанию у машины один.

Переименовать адаптер — Rename-VMNetworkAdapter -VMName app1 -Name 'Network Adapter' -NewName 'LAN' (Rename-VMNetworkAdapter). Первый адаптер, созданный New-VM, называется Network Adapter; у машин, созданных в Hyper-V Manager на русской Windows, — Сетевой адаптер. Когда адаптеров несколько, имена нужны всем остальным командам: без -VMNetworkAdapterName или -Name они действуют на все адаптеры машины сразу.

Переключить на другой коммутатор или отключить от сети, не удаляя адаптер (Connect-VMNetworkAdapter, Disconnect-VMNetworkAdapter):

Connect-VMNetworkAdapter    -VMName app1 -Name 'LAN' -SwitchName 'SETswitch'
Disconnect-VMNetworkAdapter -VMName app1 -Name 'Backup'

Отключённый адаптер остаётся в госте с «кабель не подключён» — удобно, чтобы на время изолировать машину, не теряя настроек.

Удалить адаптер — Remove-VMNetworkAdapter -VMName app1 -Name 'Backup' (Remove-VMNetworkAdapter); на машине второго поколения тоже на ходу.

MAC-адрес

По умолчанию Hyper-V выдаёт адаптеру динамический MAC из пула хоста, и при переезде на другой хост он может смениться. Если от MAC зависит лицензия или резервирование DHCP, адрес закрепляют (Set-VMNetworkAdapter); меняют его на выключенной машине:

Set-VMNetworkAdapter -VMName app1 -Name 'LAN' -StaticMacAddress '00155D010A21'
Get-VMNetworkAdapter -VMName app1 | Format-Table Name, MacAddress, DynamicMacAddressEnabled
Get-VMHost | Format-List MacAddressMinimum, MacAddressMaximum

Пул хоста — диапазон MacAddressMinimum…MacAddressMaximum в префиксе 00-15-5D, принадлежащем Microsoft; по умолчанию в нём 256 адресов. Когда несколько хостов стоят в одной сети, их пулы не должны пересекаться: сравните Get-VMHost на всех хостах, а совпадающий диапазон задайте вручную через Set-VMHost -MacAddressMinimum -MacAddressMaximum (Set-VMHost).

Защита и особые режимы

Три переключателя Set-VMNetworkAdapter защищают сеть от машины (Set-VMNetworkAdapter):

  • -DhcpGuard On отбрасывает ответы DHCP-сервера от машины — защита от случайного DHCP-сервера в госте.
  • -RouterGuard On отбрасывает Router Advertisement и Redirect от машины — то же для IPv6.
  • -MacAddressSpoofing On, наоборот, разрешает машине отправлять кадры с чужим MAC. Нужно, если внутри машины работает свой Hyper-V (вложенная виртуализация), NLB или программный коммутатор; по умолчанию выключено.
Get-VM | Where-Object Name -notin 'dhcp1', 'fw1' | Get-VMNetworkAdapter |
    Set-VMNetworkAdapter -DhcpGuard On -RouterGuard On
Get-VM | Get-VMNetworkAdapter | Format-Table VMName, Name, DhcpGuard, RouterGuard, MacAddressSpoofing

Первая команда включает обе защиты всем машинам, кроме настоящего DHCP-сервера и файрвола.

Полоса

-MaximumBandwidth — потолок в битах в секунду, -MinimumBandwidthWeight — гарантированная доля относительно других адаптеров того же коммутатора; вес работает, только если коммутатор создан с -MinimumBandwidthMode Weight — сменить режим у существующего коммутатора нельзя (New-VMSwitch):

Set-VMNetworkAdapter -VMName app1 -Name 'Backup' -MaximumBandwidth 1GB   # 1GB здесь — 1 073 741 824 бит/с
Get-VMSwitch | Format-Table Name, BandwidthReservationMode

Смотрим руками

Коммутаторы, адаптеры машин и хоста, их VLAN и MAC-адреса одной таблицей:

Get-VMNetworkAdapter -All | Format-Table VMName, Name, SwitchName, MacAddress,
    @{n='VLAN'; e={ $v = Get-VMNetworkAdapterVlan -VMNetworkAdapter $_; "$($v.OperationMode) $($v.AccessVlanId)" }}, IPAddresses

У адаптеров хоста VMName пустой, а IsManagementOs равен True. Адаптеры, не подключённые ни к одному коммутатору, — частая причина «машина без сети»:

Get-VM | Get-VMNetworkAdapter | Where-Object { -not $_.SwitchName } | Format-Table VMName, Name, MacAddress

Источники


Сеть машины в Hyper-V — это виртуальный коммутатор, привязанный к карте или команде карт хоста, и порты на нём со своими VLAN, MAC-адресами, защитами и полосой.

Дальше — часть 5: распределяем процессор и память. Число виртуальных процессоров, резерв, лимит и вес, SMT и NUMA, статическая и динамическая память, Smart Paging, что можно менять на работающей машине, вложенная виртуализация и учёт ресурсов.

Оставить комментарий могут только зарегистрированные пользователи.

Войдите на сайт или зарегистрируйтесь, чтобы оставить комментарий.