У меня есть виртуальная машина с Windows Server 2016 Datacenter, вложенной виртуализацией Hyper-V в операционной системе хоста, включенной для этой виртуальной машины, и установленной на ней ролью Hyper-V.
PS C:\> Set-VMProcessor -VMName hvm -ExposeVirtualizationExtensions $true
PS C:\> Install-WindowsFeature -Name Hyper-V -IncludeManagementTools -Restart
На этой виртуальной машине развернуты еще две виртуальные машины (вложенные) с Debian Linux. Я пытаюсь настроить локальную сеть между этими двумя виртуальными машинами с помощью виртуализации сети Hyper-V (согласно документации это называется HNVv1). HNVv1 настроен следующим образом:
PS C:\> Get-NetVirtualizationProviderAddress
ProviderAddress : 192.168.1.2
InterfaceIndex : 5
PrefixLength : 24
VlanID : 0
AddressState : Preferred
MACAddress : XXXXXXXXXXXX
ManagedByCluster : False
PS C:\> Get-NetVirtualizationProviderRoute
InterfaceIndex : 5
DestinationPrefix : 0.0.0.0/0
NextHop : 192.168.1.1
Metric : 0
PS C:\> Get-NetVirtualizationCustomerRoute
RoutingDomainID : {9CC4A292-A1C6-41DF-A4ED-4C78F850E682}
VirtualSubnetID : 4101
DestinationPrefix : 192.168.46.0/24
NextHop : 0.0.0.0
Metric : 255
PS C:\> Get-NetVirtualizationLookupRecord
CustomerAddress : 192.168.46.2
VirtualSubnetID : 4101
MACAddress : 00155d5d2a02
ProviderAddress : 192.168.1.2
Rule : TranslationMethodEncap
VMName :
UseVmMACAddress : False
Type : Dynamic
CustomerAddress : 0.0.0.0
VirtualSubnetID : 4101
MACAddress : 00155d5d2a02
ProviderAddress : 192.168.1.2
Rule : TranslationMethodEncap
VMName : vm01
UseVmMACAddress : False
Type : L2Only
CustomerAddress : 0.0.0.0
VirtualSubnetID : 4101
MACAddress : 00155d5d2a03
ProviderAddress : 192.168.1.2
Rule : TranslationMethodEncap
VMName : vm02
UseVmMACAddress : False
Type : L2Only
Каждая вложенная виртуальная машина имеет два виртуальных сетевых адаптера:
VMName SwitchName VirtualSubnetId MacAddress DhcpGuard RouterGuard
------ ---------- --------------- ---------- --------- -----------
vm01 vs01 0 00155D5D2A00 Off Off
vm01 vs01 4101 00155D5D2A02 Off Off
vm02 vs01 0 00155D5D2A01 Off Off
vm02 vs01 4101 00155D5D2A03 Off Off
Адаптеры с MAC-адресами 00155D5D2A00 и 00155D5D2A01 имеют статические IP-адреса 192.168.1.3 и 192.168.1.4 соответственно и используются для ssh, что в дальнейшем не представляет интереса.
Виртуальная машина vm01 имеет статический IP-адрес 192.168.46.2, который Hyper-V узнал, как и ожидалось (Dynamic LookupRecord). Кроме того, на vm01 установлен isc-dhcp-server. Он настроен для предложения адресов из подсети 192.168.46.0/24 на eth1 (00155D5D2A02).
root@vm01:~# tail -n 4 /etc/dhcp/dhcpd.conf
subnet 192.168.46.0 netmask 255.255.255.0 {
range 192.168.46.10 192.168.46.50;
# option routers 192.168.46.1;
}
root@vm01:~# tcpdump -e -n -i eth1
17:20:28.909319 00:15:5d:5d:2a:03 > ff:ff:ff:ff:ff:ff, ethertype IPv4 (0x0800), length 342: 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:15:5d:5d:2a:03, length 300
17:20:28.909603 00:15:5d:5d:2a:02 > 00:15:5d:5d:2a:03, ethertype IPv4 (0x0800), length 342: 192.168.46.2.67 > 192.168.46.10.68: BOOTP/DHCP, Reply, length 300
17:20:30.180282 00:15:5d:5d:2a:03 > ff:ff:ff:ff:ff:ff, ethertype IPv4 (0x0800), length 342: 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:15:5d:5d:2a:03, length 300
17:20:30.180496 00:15:5d:5d:2a:02 > 00:15:5d:5d:2a:03, ethertype IPv4 (0x0800), length 342: 192.168.46.2.67 > 192.168.46.10.68: BOOTP/DHCP, Reply, length 300
root@vm02:~# tcpdump -e -n -i eth1
17:20:28.898397 00:15:5d:5d:2a:03 > ff:ff:ff:ff:ff:ff, ethertype IPv4 (0x0800), length 342: 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:15:5d:5d:2a:03, length 300
17:20:30.185906 00:15:5d:5d:2a:03 > ff:ff:ff:ff:ff:ff, ethertype IPv4 (0x0800), length 342: 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:15:5d:5d:2a:03, length 300
Итак, мой вопрос: почему ответ DHCP не проходит? Этот ответ не соответствует L2Only LookupRecord? Если я вручную добавлю статический LookupRecord с MAC-адресом 00: 15: 5d: 5d: 2a: 03 и IP-адресом клиента 192.168.46.10, vm02 сможет увидеть ответ DHCP и настроить предлагаемый IP-адрес, но, очевидно, это не то, что я ожидать. Мне просто нужен рабочий DHCP в виртуальной локальной сети и нужен Hyper-V для автоматического сбора адресов, полученных от DHCP. В документации Microsoft по HNVv1 упоминается, что эта технология может делать такие вещи, и L2Only LookupRecord был добавлен специально для этой цели.