Короткий ответ
Сеть 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 |
Возможные причины
- vNIC отключён (
Connected : False) или не на том switch. - Access VLAN на адаптере Hyper-V не совпадает с портом/trunk коммутатора.
- На целевом узле кластера нет коммутатора с тем же именем
CorpNet. - В госте NIC disabled, неверный шлюз, dual IP, Windows Firewall profile Public.
- MAC spoofing выключен там, где гость сам меняет MAC (NLB, некоторые мосты).
- DHCP scope/резерв привязан к старому MAC после клона.
- 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»).
Почему в госте link есть, ping нет?
Другая 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 на физкоммутаторе.