設定 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 網路。
以系統管理員身分開啟PowerShell控制台。
建立內部交換器。
New-VMSwitch -SwitchName "SwitchName" -SwitchType Internal
尋找您剛才建立之虛擬交換器的介面索引。
您可以藉由執行
Get-NetAdapter
找到介面索引您的輸出看起來應該像這樣:
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 (Personal Area... 21 Disconnected 98-5F-D3-34-0C-D4 3 Mbps
內部參數的名稱會像
vEthernet (SwitchName)
和介面描述 。Hyper-V Virtual Ethernet Adapter
記下其ifIndex
在下一個步驟中使用。使用 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位址位於客體虛擬機所使用的位址範圍內。 例如,如果客體 VM 使用 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
使用 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 子網前綴長度
在此範例中,我們將使用192.168.0.0/24
在我們的範例中,執行下列命令來設定NAT 網路:
New-NetNat -Name MyNATnetwork -InternalIPInterfaceAddressPrefix 192.168.0.0/24
恭喜! 您現在有一個虛擬網路! 若要將虛擬機新增至 NAT 網路,請遵循 這些指示。
線上虛擬機
若要將虛擬機連線到新的NAT網路,請使用 [VM 設定] 功能表,將您在 NAT 網路設定區段的第一個步驟中建立的內部交換器連線到虛擬機。
由於 WinNAT 本身不會設定 IP 位址,並將 IP 位址指派給端點(例如 VM),因此您必須從 VM 本身內手動執行此動作,也就是在 NAT 內部前置詞範圍內設定 IP 位址、設定預設網關 IP 位址、設定 DNS 伺服器資訊。 唯一值得注意的是端點附加至容器時。 在此情況下,主機網路服務 (HNS) 會配置並使用主機計算服務 (HCS) 將IP位址、閘道IP和 DNS資訊直接指派給容器。
設定範例:將 VM 和容器連結至 NAT 網路
如果要將多個 VM 和容器連結到單一 NAT,您必須確定 NAT 內部子網路首碼夠大,足以納入不同應用程式或服務 (例如 Docker for Windows 和 Windows Containers – HNS) 所指派的 IP 範圍。 這需要應用程式層級的 IP 指派和網路設定,或是必須由管理員手動設定,並保證不會在相同的主機上重複使用現有的 IP 指派。
適用於 Windows 的 Docker(Linux VM) 和 Windows 容器
下列解決方案可讓 Docker for Windows(執行 Linux 容器的 Linux VM)和 Windows 容器使用個別的內部 vSwitch 來共用相同的 WinNAT 實例。 Linux 和 Windows 容器之間的連線將會運作。
使用者已透過名為 「VMNAT」 的內部 vSwitch 將 VM 連線到 NAT 網路,現在想要使用 Docker 引擎安裝 Windows 容器功能:
PS C:\> Get-NetNat “VMNAT”| Remove-NetNat (this will remove 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 will remove 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。
使用者已安裝執行 Docker 引擎的 Windows 容器功能,現在想要將 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 容器功能共同存在,如範例所示。此工作流程可能會變更
C:> net stop docker
停止 Docker4Windows MobyLinux VM
PS C:> Get-ContainerNetwork |Remove-ContainerNetwork -force
PS C:> Get-NetNat |Remove-NetNat
移除任何先前已存在的容器網路 (亦即刪除 vSwitch、刪除 NetNat、清除)New-ContainerNetwork -Name nat -Mode NAT –subnetprefix 10.0.76.0/24 (此子網將用於 Windows 容器功能) 建立名為 nat 的內部 vSwitch
建立名為 “nat” 且 IP 首碼為 10.0.76.0/24 的 NAT 網路Remove-NetNAT
移除 DockerNAT 和 nat NAT 網路 (保留內部 vSwitch)New-NetNat -Name DockerNAT -InternalIPInterfaceAddressPrefix 10.0.0.0/17 (這將為 D4W 和要共用的容器建立較大的 NAT 網路)
建立名為 DockerNAT 且具有較大首碼 10.0.0.0/17 的 NAT 網路執行 Docker4Windows (MobyLinux.ps1)
建立內部 vSwitch DockerNAT
建立名為 “DockerNAT” 且 IP 首碼為 10.0.75.0/24 的 NAT 網路Net start docker
Docker 將以使用者定義的 NAT 網路做為預設值來連接 Windows 容器
最後,您應該有兩個內部 vSwitch - 一個名為 DockerNAT,另一個名為 nat。 您只會執行 Get-NetNat 來確認一個 NAT 網路(10.0.0.0/17)。 Windows 容器的 IP 位址將由 10.0.76.0/24 子網的 Windows 主機網路服務 (HNS) 指派。 根據現有的MobyLinux.ps1腳本,Docker 4 Windows的IP位址將會從10.0.75.0/24子網指派。
疑難排解
不支援多個 NAT 網路
本指南假設主機上沒有其他 NAT。 不過,應用程式或服務需要使用 NAT,而且可能會在安裝期間建立一個。 由於 Windows (WinNAT) 僅支援一個內部 NAT 子網前綴,因此嘗試建立多個 NAT 會將系統置於未知狀態。
若要查看此問題,請確定您只有一個 NAT:
Get-NetNat
如果 NAT 已經存在,請將其刪除:
Get-NetNat | Remove-NetNat
請確定您只有一個應用程式或功能的「內部」vmSwitch(例如 Windows 容器)。 記錄 vSwitch 的名稱:
Get-VMSwitch
檢查是否有私人IP位址(例如 NAT 預設閘道IP位址 – 通常是 x。y.來自舊 NAT 的 z.1) 仍然指派給配接器:
Get-NetIPAddress -InterfaceAlias "vEthernet (<name of vSwitch>)"
如果舊的私人 IP 位址正在使用中,請將其刪除:
Remove-NetIPAddress -InterfaceAlias "vEthernet (<name of vSwitch>)" -IPAddress <IPAddress>
移除多個 NAT
我們看到多個 NAT 網路意外建立的報告。 這是因為最近組建中的 Bug(包括 Windows Server 2016 Technical Preview 5 和 Windows 10 Insider Preview 組建)。 如果您在執行 Docker 網路 ls 或 Get-ContainerNetwork 之後看到多個 NAT 網路,請從提升許可權的 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
如需使用相同 NAT 重建 NAT 環境的多個應用程式,請參閱此設定指南。
參考資料
深入瞭解 NAT 網路