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 Virtual Switch — устройство виртуального коммутатора;
- Create and configure a virtual switch with Hyper-V — типы коммутаторов, общий доступ хоста к карте, VLAN адаптера хоста;
- New-VMSwitch и Set-VMSwitch — создание и изменение коммутаторов, режим резервирования полосы;
- Set-VMNetworkAdapterVlan — режимы VLAN адаптера, частные VLAN;
- What's New in Hyper-V Virtual Switch in Windows Server 2012 — частные VLAN и режим trunk, требование к физическим коммутаторам;
- Host network requirements — SET и требования к картам;
- Features removed or no longer developed in Windows Server — LBFO и виртуальный коммутатор;
- Add-VMSwitchTeamMember — состав команды SET;
- Network ATC — настройка сети узлов по назначению;
- Hyper-V feature compatibility by generation and guest — горячее добавление сетевых адаптеров;
- Add-VMNetworkAdapter, Rename-VMNetworkAdapter, Connect-VMNetworkAdapter, Disconnect-VMNetworkAdapter и Remove-VMNetworkAdapter — адаптеры машин;
- Network Device Naming in Hyper-V — как имя адаптера видно в госте;
- Set-VMNetworkAdapter и Set-VMHost — MAC-адреса и их пул, DhcpGuard, RouterGuard, MacAddressSpoofing, полоса.
Сеть машины в Hyper-V — это виртуальный коммутатор, привязанный к карте или команде карт хоста, и порты на нём со своими VLAN, MAC-адресами, защитами и полосой.
Дальше — часть 5: распределяем процессор и память. Число виртуальных процессоров, резерв, лимит и вес, SMT и NUMA, статическая и динамическая память, Smart Paging, что можно менять на работающей машине, вложенная виртуализация и учёт ресурсов.
Оставить комментарий могут только зарегистрированные пользователи.
Войдите на сайт или зарегистрируйтесь, чтобы оставить комментарий.