Короткий ответ

Сеть VM-APP01 — это не «пересоздать NIC». Сначала: привязка к CorpNet, Connected, VLAN ID, MAC, затем стек внутри гостя (IP, шлюз, Windows Firewall). Хост HV01 при этом может пинговать 10.0.10.10 — это не доказывает, что кадры гостя выходят в ту же VLAN.

Не меняйте MAC первым шагом: DHCP-резервы, лицензии, фильтрация порта коммутатора и NLB сразу разъедутся.

Симптомы и как отличить

Типичная картина:

  • VM Running, Heartbeat OK, ping 8.8.8.8 и до шлюза нет;
  • Get-VMNetworkAdapter показывает SwitchName пустой или не CorpNet;
  • в госте APIPA 169.254.x.x или старый IP без ARP;
  • после Live Migration сеть есть на одном узле и нет на другом.

Отличия:

Что видноКуда
Все VM на CorpNet мертвы, хост тожеvSwitch
VM не Runningстарт VM
Сеть есть, Enhanced Session нетEnhanced Session
Миграция падает, сеть при этом ни при чёмLive Migration

Возможные причины

  1. vNIC отключён (Connected : False) или не на том switch.
  2. Access VLAN на адаптере Hyper-V не совпадает с портом/trunk коммутатора.
  3. На целевом узле кластера нет коммутатора с тем же именем CorpNet.
  4. В госте NIC disabled, неверный шлюз, dual IP, Windows Firewall profile Public.
  5. MAC spoofing выключен там, где гость сам меняет MAC (NLB, некоторые мосты).
  6. DHCP scope/резерв привязан к старому MAC после клона.
  7. SR-IOV VF «залип» после миграции (реже, чем VLAN).

Диагностика

На владельце VM:

Get-VM -Name 'VM-APP01' | Format-List Name, State, ComputerName
Get-VMNetworkAdapter -VMName 'VM-APP01' | Format-List Name, SwitchName, Connected, MacAddress, Status, IPAddresses, IsolationMode, VlanSetting
Get-VMNetworkAdapterVlan -VMName 'VM-APP01'
Get-VMSwitch -Name 'CorpNet' | Format-List Name, SwitchType, Id, ComputerName

Сверьте VLAN:

Get-VMNetworkAdapterVlan -VMName 'VM-APP01' | Format-Table VMName, AccessVlanId, OperationMode

Если AccessVlanId 20, а порт гипервизора в access VLAN 30 — ARP в никуда. Trunk на физическом порту HV01 должен пропускать tagged 20, если тегирует Hyper-V.

Гость (PowerShell Remoting / консоль):

Get-NetAdapter | Format-Table Name, Status, MacAddress, LinkSpeed
Get-NetIPConfiguration
Get-NetRoute -DestinationPrefix '0.0.0.0/0'
Test-NetConnection -ComputerName 10.0.10.10

С хоста посмотрите, виден ли MAC гостя (подставьте vEthernet или физический член SET — что реально несёт VLAN):

Get-NetNeighbor -AddressFamily IPv4 | Where-Object IPAddress -eq '10.0.10.40'

10.0.10.40 — пример IP гостя, замените.

Журнал гостя: DHCP-клиент, Netlogon. Журнал хоста VMMS — если адаптер не подключается к switch.

Решение

Сценарий A. Disconnected или не тот switch

Connect-VMNetworkAdapter -VMName 'VM-APP01' -SwitchName 'CorpNet'
Connect-VMNetworkAdapter -VMName 'VM-APP01' -Name 'Network Adapter' -SwitchName 'CorpNet'

Имя адаптера возьмите из Get-VMNetworkAdapter. Включите:

Connect-VMNetworkAdapter -VMName 'VM-APP01' -SwitchName 'CorpNet'
Get-VMNetworkAdapter -VMName 'VM-APP01' | Where-Object { -not $_.Connected } |
  Connect-VMNetworkAdapter -SwitchName 'CorpNet'

Для явно выключенного:

Get-VMNetworkAdapter -VMName 'VM-APP01' | Connect-VMNetworkAdapter -SwitchName 'CorpNet'

В GUI — галка Enable network adapter. Не Delete адаптер.

Сценарий B. Неверный VLAN

Set-VMNetworkAdapterVlan -VMName 'VM-APP01' -AccessVlanId 20 -Access

Снять тег (untagged в native VLAN порта):

Set-VMNetworkAdapterVlan -VMName 'VM-APP01' -Untagged

Согласуйте с сетью: либо тегирует Hyper-V, либо access на порту. Два тега сразу — чёрная дыра.

Сценарий C. После переезда на другой узел нет одноимённого switch

На HV02 создайте CorpNet с той же L2-политикой, что на HV01. Пока имён нет, миграция между узлами будет возвращать гостя «без сети» даже при успешном compute move.

Сценарий D. Стек гостя

Включите NIC в госте, проверьте шлюз, DNS. Windows Firewall: профиль Domain vs Public после смены сети. Не выключайте firewall навсегда; для ICMP — разрешите echo request в нужном профиле.

Клон без Sysprep: одинаковый MAC, если копировали VHDX. Смените MAC осознанно (Set-VMNetworkAdapter -StaticMacAddress) и обновите DHCP-резерв.

Сценарий E. NLB / вложенный мост

Set-VMNetworkAdapter -VMName 'VM-APP01' -MacAddressSpoofing On

Только если гость должен слать чужие MAC. Для обычного сервера оставляйте Off.

Как проверить, что проблема устранена

С гостя: ping шлюза VLAN, Test-NetConnection DC01.contoso.example -Port 88 если это доменный сервер приложений, или 445 для файлового. С соседа в той же VLAN — ping IP VM-APP01.

Get-VMNetworkAdapter -VMName 'VM-APP01' | Format-Table SwitchName, Connected, MacAddress, IPAddresses
Get-VMNetworkAdapterVlan -VMName 'VM-APP01'

SwitchName : CorpNet, Connected : True, VLAN как в сетевом плане. После Live Migration на второй узел — тот же ping без правки NIC.

Если не помогло

  • Хостовый CorpNet деградировал: вернитесь к vSwitch.
  • Heartbeat Lost при «сети нет»: иногда наоборот IC, см. Integration Services.
  • Только IPv6 или только DNS: смотрите клиентский DNS, не vSwitch.
  • SR-IOV: временно отключите SR-IOV на адаптере VM (Set-VMNetworkAdapter -IovWeight 0 по вашей политике) для проверки, не как постоянный «фикс».
  • MTU/jumbo: если пинг мелкий проходит, а SMB нет — сверьте Jumbo Packet на pNIC и в госте, не плодите 9000 только на одной стороне.

Профилактика

  • Одинаковые имена vSwitch на всех узлах кластера.
  • VLAN ID в документации VM, не «как получилось в GUI».
  • Резерв DHCP по статическому MAC Hyper-V.
  • Тест ping после каждой Live Migration в мониторинге.
  • Не клонировать VHDX копированием файла без Generic или без смены NIC GUID/MAC.

FAQ

Стоит ли удалить vNIC и создать заново?

Нет первым шагом. Новый адаптер — новый MAC и часто новый Ethernet GUID в госте (ещё один «Local Area Connection 2»).

Другая VLAN, неверный шлюз, firewall, или вы пингуете IP, которого нет в этой L2. Test-NetConnection с -Traceroute с гостя.

Нужен ли legacy adapter?

Только PXE/Generation 1 без синтетики. Для Server 2019+ гостя синтетический NIC — норма. Legacy медленнее и не нужен «чтобы сеть заработала».

IPAddresses в Get-VMNetworkAdapter пустой, а в госте IP есть?

KVP не отдаёт данные: служба IC в госте или Guest Service. Сеть при этом может быть жива.

Trunk на VM (VLAN trunk mode) для «всех VLAN»?

Только для виртуальных appliance (firewall, router). Обычный VM-APP01 — Access VLAN. Trunk без понимания tagging даст broadcast-шторм в госте.

После Set-VMNetworkAdapterVlan сеть пропала у соседей?

Вы могли поставить тот же MAC/IP в чужую VLAN или создать петлю. Верните AccessVlanId, проверьте CAM/MAC flapping на физкоммутаторе.