我有一台装有 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 按预期获知(动态查找记录)。此外,isc-dhcp-server 安装在 vm01 上。它配置为在 eth1(00155D5D2A02)上提供子网 192.168.46.0/24 中的地址。
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 不匹配?如果我手动添加 MAC 地址为 00:15:5d:5d:2a:03 且客户 IP 地址为 192.168.46.10 的静态 LookupRecord,vm02 可以看到 DHCP 回复并设置提供的 IP 地址,但显然这不是我想要的。我只需要在虚拟本地网络中运行 DHCP,并且需要 Hyper-V 自动收集从 DHCP 收到的地址。有关 HNVv1 的 Microsoft 文档提到这项技术可以做这样的事情,并且专门为此目的添加了 L2Only LookupRecord。