共用方式為


設定 NAT 網路

Windows 10 和 Windows 11 Hyper-V 允許虛擬網路的原生網路位址轉譯 (NAT) 。

本指南將引導您完成操作方法:

  • 建立 NAT 網路
  • 將現有的虛擬機器連線到新的網路
  • 確認虛擬機器已正確連線

需求:

  • Windows 10 週年更新或更新版本
  • Hyper-V 已啟用。 請按照說明啟用 Hyper-V

備註

目前,每個主機只能有一個 NAT 網路。 如需 Windows NAT (WinNAT) 實作、功能和限制的其他詳細資料,請參閱 WinNAT 功能和限制部落格

NAT 概觀

NAT 可讓虛擬機器使用主機的 IP 位址和連接埠,透過內部 Hyper-V 虛擬交換器存取網路資源。

網路位址轉換 (NAT) 是一種網路模式,旨在透過將外部 IP 位址和埠對應到更大的內部 IP 位址集來節省 IP 位址。 基本上,NAT 使用流程表將流量從外部(主機)IP 位址和連接埠號路由到與網路上端點(虛擬機器、電腦、容器等)關聯的正確內部 IP 位址。

此外,NAT 允許多個虛擬機器透過將這些連接埠對應到唯一的外部連接埠來託管需要相同(內部)通訊連接埠的應用程式。

基於所有這些原因,NAT 網路對於容器技術來說非常常見(請參閱 容器網路)。

建立 NAT 虛擬網路

讓我們逐步介紹如何設定新的 NAT 網路。

  1. 以系統管理員身分開啟 PowerShell 主控台。

  2. 建立內部交換器。

    New-VMSwitch -SwitchName "SwitchName" -SwitchType Internal
    
  3. 找到您剛剛建立的虛擬交換器的介面索引。

    PS C:\> Get-NetAdapter
    
    Name                  InterfaceDescription               ifIndex Status       MacAddress           LinkSpeed
    ----                  --------------------               ------- ------       ----------           ---------
    vEthernet (intSwitch) Hyper-V Virtual Ethernet Adapter        24 Up           00-15-5D-00-6A-01      10 Gbps
    Wi-Fi                 Marvell AVASTAR Wireless-AC Net...      18 Up           98-5F-D3-34-0C-D3     300 Mbps
    Bluetooth Network ... Bluetooth Device ...                    21 Disconnected 98-5F-D3-34-0C-D4       3 Mbps
    
    

    內部交換機的名稱 vEthernet (SwitchName) 為 ,介面說明為 Hyper-V Virtual Ethernet Adapter。 記下它 ifIndex ,以便在下一步中使用。

  4. 使用 New-NetIPAddress 設定 NAT 閘道。

    以下是通用命令:

    New-NetIPAddress -IPAddress <NAT Gateway IP> -PrefixLength <NAT Subnet Prefix Length> -InterfaceIndex <ifIndex>
    

    為了配置網關,您需要一些有關網絡的信息:

    • IPAddress -- NAT閘道IP指定要用作NAT閘道IP的IPv4或IPv6位址。

    通用形式是 a.b.c.1(例如 172.16.0.1)。 雖然最終位置不必是 .1,但通常是 (基於前綴長度)。 此 IP 位址位於客體虛擬機器使用的位址範圍內。 例如,如果客體虛擬機器使用 IP 範圍 172.16.0.0,則您可以使用 IP 位址 172.16.0.100 作為 NAT 閘道。 通用網關IP是192.168.0.1

    • PrefixLength -- NAT 子網路字首長度定義 NAT 本機子網路大小 (子網路遮罩)。 子網路前置詞長度是介於 0 到 32 之間的整數值。

      0 將映射整個互聯網,32 將只允許一個映射的 IP。 常見值範圍為 24 到 12,具體取決於需要連線到 NAT 的 IP 數目。

      常見的 PrefixLength 是 24 -- 這是 255.255.255.0 的子網遮罩

    • InterfaceIndex -- ifIndex 是您在上一個步驟中決定的虛擬交換器的介面索引。

    執行下列命令以建立 NAT 閘道:

    New-NetIPAddress -IPAddress 192.168.0.1 -PrefixLength 24 -InterfaceIndex 24
    
  5. 使用 New-NetNat 配置 NAT 網路。

    以下是通用命令:

    New-NetNat -Name <NATOutsideName> -InternalIPInterfaceAddressPrefix <NAT subnet prefix>
    

    若要設定閘道,您必須提供網路和 NAT 閘道的相關資訊:

    • 名稱 -- NATOutsideName 描述 NAT 網路的名稱。 您將使用它來刪除 NAT 網路。

    • InternalIPInterfaceAddressPrefix -- NAT 子網路首碼描述 NAT 閘道 IP 首碼和 NAT 子網路首碼長度。

    通用形式為a.b.c.0/NAT Subnet Prefix Length(子網字首長度)

    在此範例中,我們將使用 192.168.0.0/24

    執行下列命令以設定 NAT 網路:

    New-NetNat -Name MyNATnetwork -InternalIPInterfaceAddressPrefix 192.168.0.0/24
    

祝賀! 您現在擁有虛擬 NAT 網路!

連線虛擬機器

若要將虛擬機器連線到新的 NAT 網路,請使用 [VM 設定] 功能表,將您在本文第一個步驟中建立的內部交換器連線到虛擬機器。

由於 WinNAT 本身不會將 IP 位址配置並指派給端點 (例如 VM),因此您必須從 VM 本身內手動執行此動作,也就是在 NAT 內部前置詞範圍內設定 IP 位址、設定預設閘道 IP 位址、設定 DNS 伺服器資訊。 唯一的注意事項是端點附加至容器時。 在此情況下,主機網路服務 (HNS) 會配置並使用主機計算服務 (HCS) ,將 IP 位址、閘道 IP 和 DNS 資訊直接指派給容器。

組態範例:將虛擬機器和容器連接至 NAT 網路

如果您需要將多個 VM 和容器附加至單一 NAT,您必須確保 NAT 內部子網路前置詞足夠大,以包含不同應用程式或服務所指派的 IP 範圍 (例如適用於 Windows 的 Docker 和 Windows 容器 – HNS) 。 這需要應用程式層級的 IP 和網路設定指派,或手動設定,必須由管理員完成,並保證不會重複使用同一主機上的現有 IP 指派。

適用於 Windows (Linux VM) 和 Windows 容器的 Docker

請遵循本節,以允許適用於 Windows 的 Docker (執行 Linux 容器的 Linux VM) 和 Windows 容器使用個別的內部 vSwitch 共用相同的 WinNAT 執行個體。 Linux 和 Windows 容器之間的連線都有效。

使用者已透過名為「VMNAT」的內部 vSwitch 將 VM 連線到 NAT 網路,現在想要使用 docker 引擎安裝 Windows 容器功能:

PS C:\> Get-NetNat “VMNAT”| Remove-NetNat (this removes the NAT but keep the internal vSwitch).
Install Windows Container Feature
DO NOT START Docker Service (daemon)
Edit the arguments passed to the docker daemon (dockerd) by adding –fixed-cidr=<container prefix> parameter. This tells docker to create a default nat network with the IP subnet <container prefix> (e.g. 192.168.1.0/24) so that HNS can allocate IPs from this prefix.
PS C:\> Start-Service Docker; Stop-Service Docker
PS C:\> Get-NetNat | Remove-NetNAT (again, this removes the NAT but keep the internal vSwitch)
PS C:\> New-NetNat -Name SharedNAT -InternalIPInterfaceAddressPrefix <shared prefix>
PS C:\> Start-Service docker

Docker/HNS 會將 IP 指派給 Windows 容器,而系統管理員會從兩者的差異集將 IP 指派給 VM。

使用者已安裝 Windows 容器功能並執行 docker 引擎,現在想要將 VM 連線到 NAT 網路:

PS C:\> Stop-Service docker
PS C:\> Get-ContainerNetwork | Remove-ContainerNetwork -force
PS C:\> Get-NetNat | Remove-NetNat (this will remove the NAT but keep the internal vSwitch)
Edit the arguments passed to the docker daemon (dockerd) by adding -b “none” option to the end of docker daemon (dockerd) command to tell docker not to create a default NAT network.
PS C:\> New-ContainerNetwork –name nat –Mode NAT –subnetprefix <container prefix> (create a new NAT and internal vSwitch – HNS will allocate IPs to container endpoints attached to this network from the <container prefix>)
PS C:\> Get-Netnat | Remove-NetNAT (again, this will remove the NAT but keep the internal vSwitch)
PS C:\> New-NetNat -Name SharedNAT -InternalIPInterfaceAddressPrefix <shared prefix>
PS C:\> New-VirtualSwitch -Type internal (attach VMs to this new vSwitch)
PS C:\> Start-Service docker

Docker/HNS 會將 IP 指派給 Windows 容器,而系統管理員會從兩者的差異集將 IP 指派給 VM。

最後,您將有兩個內部 VM 交換機和它們之間共享一個 NetNat。

使用相同 NAT 的多個應用程式

某些案例需要多個應用程式或服務才能使用相同的 NAT。 在此情況下,必須遵循下列工作流程,以便多個應用程式/服務可以使用較大的 NAT 內部子網路字首

我們將詳細說明 Docker 4 Windows - Docker Beta - Linux VM 與同一主機上的 Windows 容器功能共存作為範例。此工作流程可能會變更

  1.  net stop docker
    
  2.  Stop Docker4Windows MobyLinux VM
    
  3.  Get-ContainerNetwork | Remove-ContainerNetwork -force
    
  4. 移除任何先前存在的容器網路 (,即刪除 vSwitch、刪除 NetNat、清除)。

     Get-NetNat | Remove-NetNat
    
  5. 建立名為 nat 的內部 vSwitch,以及 IP 前置詞為 10.0.76.0/24 的 NAT 網路。

     New-ContainerNetwork -Name nat -Mode NAT –subnetprefix 10.0.76.0/24
    
  6. 移除 DockerNAT 和 nat NAT 網路 (保留內部 vSwitch)。

     Remove-NetNAT
    
  7. 建立名為 DockerNAT 的 NAT 網路,前置詞較大 10.0.0.0/17,供 D4W 和容器共用。

     New-NetNat -Name DockerNAT -InternalIPInterfaceAddressPrefix 10.0.0.0/17
    
  8. 執行 Docker4Windows (MobyLinux.ps1)

  9. 使用使用者定義的 NAT 網路作為預設值來連接 Windows 容器。

     Net start docker
    

最後,您有兩個內部 vSwitch,一個名為 DockerNAT ,另一個名為 nat。 您只有一個 NAT 網路 (10.0.0.0/17) 透過執行 Get-NetNat 來確認。 Windows 容器的 IP 位址是由 Windows 主機網路服務 (HNS) 從 10.0.76.0/24 子網指派。 根據現有的 MobyLinux.ps1 指令碼,Docker 4 Windows 的 IP 位址會從 10.0.75.0/24 子網路指派。

故障排除

不支援多個 NAT 網路

本指南假設主機上沒有其他NAT。 但是,應用程式或服務需要使用 NAT,並且可以在設定過程中建立 NAT。 由於 Windows (WinNAT) 僅支援一個內部 NAT 子網路前置詞,因此嘗試建立多個 NAT 會使系統進入未知狀態。

若要查看這是否可能是問題所在,請確定您只有一個NAT:

Get-NetNat

如果NAT已存在,請將其刪除:

Get-NetNat | Remove-NetNat

請確定您只有一個「內部」vmSwitch 用於應用程式或功能 (例如 Windows 容器)。 記錄 vSwitch 的名稱:

Get-VMSwitch

檢查是否有私有 IP 位址(例如 NAT 預設閘道 IP 位址 – 通常是 x是的z.1) 從仍分配給介面卡的舊 NAT:

Get-NetIPAddress -InterfaceAlias "vEthernet (<name of vSwitch>)"

如果舊的私有IP地址正在使用中,請將其刪除:

Remove-NetIPAddress -InterfaceAlias "vEthernet (<name of vSwitch>)" -IPAddress <IPAddress>

刪除多個NAT 我們看到過無意中創建多個 NAT 網絡的報告。 如果您看到多個 NAT 網路,請在執行 docker network ls 或 Get-ContainerNetwork 之後,從提高許可權的 PowerShell 執行下列動作:

$keys = Get-ChildItem "HKLM:\SYSTEM\CurrentControlSet\Services\vmsmp\parameters\SwitchList"
foreach($key in $keys)
{
   if ($key.GetValue("FriendlyName") -eq 'nat')
   {
      $newKeyPath = $KeyPath+"\"+$key.PSChildName
      Remove-Item -Path $newKeyPath -Recurse
   }
}
Remove-NetNat -Confirm:$false
Get-ContainerNetwork | Remove-ContainerNetwork
Get-VmSwitch -Name nat | Remove-VmSwitch # failure is expected
Stop-Service docker
Set-Service docker -StartupType Disabled

在執行後續命令 (Restart-Computer) 之前重新啟動作業系統

Get-NetNat | Remove-NetNat
Set-Service docker -StartupType Automatic
Start-Service docker