我正在运行 Windows 11 Pro,并在 Hyper-V 下设置了 FreeBSD VM。最初,VM 使用默认虚拟交换机,并且 VM 的互联网访问工作正常。但为了防止 VM 的 IP 地址在每次重新启动时发生变化,我尝试创建一个新的虚拟交换机并使用 NAT 设置静态 IP 地址。目前,主机和客户机可以互相 ping 通,但客户机无法通过主机的 wifi 连接 ping 通任何东西。VM是设置为在 Hyper-V 中使用正确的虚拟交换机。
我跟着本指南在微软网站上设置NAT,然后我/etc/rc.conf
在FreeBSD VM上编辑,如下所示:
ifconfig_DEFAULT="inet 192.168.0.2 netmask 255.255.255.0"
defaultrouter="192.168.0.1"
以下是虚拟交换机、静态 IP 地址和 NAT 的主机端配置信息:
PS C:\Windows\system32> get-vmswitch
Name SwitchType NetAdapterInterfaceDescription
---- ---------- ------------------------------
LocalNat Internal
Default Switch Internal
PS C:\Windows\system32> get-netadapter
Name InterfaceDescription ifIndex Status
---- -------------------- ------- ------
vEthernet (LocalNat) Hyper-V Virtual Ethernet Adapter #2 16 Up
Bluetooth Network Conn... Bluetooth Device (Personal Area Netw... 27 Discon...
Wi-Fi Intel(R) Wi-Fi 6E AX210 160MHz 8 Up
vEthernet (Default Swi... Hyper-V Virtual Ethernet Adapter 33 Up
PS C:\Windows\system32> get-netipaddress -InterfaceIndex 16
IPAddress : fe80::ac90:94a:c07b:35fc%16
InterfaceIndex : 16
InterfaceAlias : vEthernet (LocalNat)
AddressFamily : IPv6
Type : Unicast
PrefixLength : 64
PrefixOrigin : WellKnown
SuffixOrigin : Link
AddressState : Preferred
ValidLifetime : Infinite ([TimeSpan]::MaxValue)
PreferredLifetime : Infinite ([TimeSpan]::MaxValue)
SkipAsSource : False
PolicyStore : ActiveStore
IPAddress : 192.168.0.1
InterfaceIndex : 16
InterfaceAlias : vEthernet (LocalNat)
AddressFamily : IPv4
Type : Unicast
PrefixLength : 24
PrefixOrigin : Manual
SuffixOrigin : Manual
AddressState : Preferred
ValidLifetime : Infinite ([TimeSpan]::MaxValue)
PreferredLifetime : Infinite ([TimeSpan]::MaxValue)
SkipAsSource : False
PolicyStore : ActiveStore
PS C:\Windows\system32> get-netnat
Name : HyperV-NatNetwork
ExternalIPInterfaceAddressPrefix :
InternalIPInterfaceAddressPrefix : 192.168.0.0/24
IcmpQueryTimeout : 30
TcpEstablishedConnectionTimeout : 1800
TcpTransientConnectionTimeout : 120
TcpFilteringBehavior : AddressDependentFiltering
UdpFilteringBehavior : AddressDependentFiltering
UdpIdleSessionTimeout : 120
UdpInboundRefresh : False
Store : Local
Active : True
netstat
以下是虚拟机上的输出:
$ netstat -rn
Routing tables
Internet:
Destination Gateway Flags Netif Expire
default 192.168.0.1 UGS lo0
127.0.0.1 link#1 UH lo0
192.168.0.0/24 link#2 U hn0
192.168.0.2 link#1 UHS lo0
Internet6:
Destination Gateway Flags Netif Expire
::/96 ::1 UGRS lo0
::1 link#1 UHS lo0
::ffff:0.0.0.0/96 ::1 UGRS lo0
fe80::/10 ::1 UGRS lo0
fe80::%lo0/64 link#1 U lo0
fe80::1%lo0 link#1 UHS lo0
fe80::%hn0/64 link#2 U hn0
fe80::215:5dff:fec8:704%hn0 link#2 UHS lo0
ff02::/16 ::1 UGRS lo0
我做错了什么?
编辑/解决方案:正如已接受的答案中所述,我在这里尝试做错事。我的解决方案是保留此处概述的虚拟交换机,并向 VM 添加第二个网络接口,将其放在默认网络上。外部流量通过默认接口路由,并在 Hyper-V 需要时获取不同的 IP 地址,而从主机到来宾的流量可以使用内部虚拟交换机,其中来宾具有静态 IP。
答案1
但为了防止虚拟机的 IP 地址在每次重启时发生变化,我尝试创建一个新的虚拟交换机,并使用 NAT 设置静态 IP 地址
这是在 Hyper-V 或任何其他类似应用程序(例如 VMware)中对 NAT 的不当使用。
NAT 用于 DHCP,IP 地址偶尔会改变。
如果您希望拥有静态 IP 地址,您可以在 Hyper-V 中设置外部网络交换机(即桥接网络),然后客户机将在主机网络路由器上获得 IP。如果您愿意,也可以使用静态 IP。
我已经在 Windows 11 Pro、Hyper-V 和 Linux Guest 上进行了测试。
答案2
您可能想检查您的 NAT 如何使用 ExternalAddresses。可以使用以下 powershell 命令完成此操作:
Get-NetNatExternalAddress
在我的系统上,我注意到第一个条目实际上是本地环回和其他虚拟交换机地址(无法访问外部世界)。我通过简单地删除 NAT 中的所有外部地址(只保留最后一个具有互联网连接的 IP 地址)解决了这个问题。对任何不可路由的 IP 地址重复以下命令:
Remove-NetNatExternalAddress -ExternalAddressID <ID>
这应该可以解决您的问题并且 NAT 将开始通过正确的接口处理传出流量。
答案3
在默认交换机上,无需使用静态 IP,通过静态地址访问虚拟机的最简单方法是使用虚拟机名称后.mshome.net
附加的主机名,例如my-vm.mshome.net
。默认交换机在为虚拟机分配 DHCP IP 时,都会在 hosts.ics 文件中更新此映射。
缺点是,此映射仅在托管 Windows 操作系统中可用。其他虚拟机或在 WLS 上运行的 Linux 无法通过 DNS 查询解析它。