Hyper-V:NAT 不起作用/来宾无法访问互联网

Hyper-V:NAT 不起作用/来宾无法访问互联网

我正在运行 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 查询解析它。

相关内容