Einrichten eines NAT-NetzwerksSet up a NAT network

Windows 10 Hyper-V ermöglicht native Netzwerkadressübersetzung (Network Address Translation, NAT) für ein virtuelles Netzwerk.Windows 10 Hyper-V allows native network address translation (NAT) for a virtual network.

Diese Anleitung begleitet Sie beim:This guide will walk you through:

  • Erstellen eines NAT-Netzwerkscreating a NAT network
  • Herstellen einer Verbindung eines vorhandenen virtuellen Computers mit dem neuen Netzwerkconnecting an existing virtual machine to your new network
  • Bestätigen, dass der virtuelle Computer ordnungsgemäß verbunden istconfirming that the virtual machine is connected correctly

Anforderungen:Requirements:

  • Windows 10 Anniversary Update oder höherWindows 10 Anniversary Update or later
  • Hyper-V-Rolle ist aktiviert (Anweisungen hier)Hyper-V is enabled (instructions here)

Hinweis: Derzeit steht Ihnen nur ein NAT-Netzwerk pro Host zur Verfügung.Note: Currently, you are limited to one NAT network per host. Weitere Informationen zur Windows-NAT-Implementierung (WinNAT), zu Funktionen und Einschränkungen finden Sie im Blog WinNAT capabilities and limitations (Stärken und Schwächen von WinNAT).For additional details on the Windows NAT (WinNAT) implementation, capabilities, and limitations, please reference the WinNAT capabilities and limitations blog

NAT-ÜberblickNAT Overview

NAT ermöglicht einem virtuellen Computer unter Verwendung der IP-Adresse des Hostcomputers und eines Ports über einen internen virtuellen Hyper-V-Switch Zugriff auf Netzwerkressourcen.NAT gives a virtual machine access to network resources using the host computer's IP address and a port through an internal Hyper-V Virtual Switch.

Netzwerkadressübersetzung (NAT, Network Address Translation) ist ein Netzwerkmodus zur Konservierung von IP-Adressen durch Zuordnung einer externen IP-Adresse und eines Ports zu einem wesentlich größeren Satz interner IP-Adressen.Network Address Translation (NAT) is a networking mode designed to conserve IP addresses by mapping an external IP address and port to a much larger set of internal IP addresses. Im Wesentlichen nutzt ein NAT eine Flusstabelle zum Weiterleiten von Datenverkehr von einer IP-Adresse und Portnummer zur richtigen internen IP-Adresse, die einem Gerät im Netzwerk (VM, Computer, Container usw.) zugeordnet ist.Basically, a NAT uses a flow table to route traffic from an external (host) IP Address and port number to the correct internal IP address associated with an endpoint on the network (virtual machine, computer, container, etc.)

Darüber hinaus erlaubt NAT mehreren VMs das Hosten von Anwendungen, die identische (interne) Kommunikationsports erfordern, indem diese eindeutigen externen Ports zugeordnet werden.Additionally, NAT allows multiple virtual machines to host applications that require identical (internal) communication ports by mapping these to unique external ports.

Aus allen diesen Gründen ist NAT-Networking in der Containertechnologie sehr gebräuchlich (siehe Containernetzwerk).For all of these reasons, NAT networking is very common for container technology (see Container Networking).

Erstellen eines virtuellen NAT-NetzwerksCreate a NAT virtual network

Betrachten wir nun die Einrichtung eines neuen NAT-Netzwerks.Let's walk through setting up a new NAT network.

  1. Öffnen Sie eine PowerShell-Konsole als Administrator.Open a PowerShell console as Administrator.

  2. Erstellen Sie einen internen Switch.Create an internal switch.

New-VMSwitch -SwitchName "SwitchName" -SwitchType Internal
  1. Suchen Sie den Schnittstellenindex des virtuelles Switches, den Sie gerade erstellt haben.Find the interface index of the virtual switch you just created.

    Sie können den Schnittstellen Index ermitteln, indem Sie ausführen Get-NetAdapterYou can find the interface index by running Get-NetAdapter

    Die Ausgabe sollte etwa wie folgt aussehen:Your output should look something like this:

    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
    
    

    Die internen Switches haben Namen wie vEthernet (SwitchName) und eine Schnittstellenbeschreibung von Hyper-V Virtual Ethernet Adapter.The internal switch will have a name like vEthernet (SwitchName) and an Interface Description of Hyper-V Virtual Ethernet Adapter. ifIndex wird im nächsten Schritt verwendet.Take note of its ifIndex to use in the next step.

  2. Konfigurieren Sie das NAT-Gateway mit New-NetIPAddress.Configure the NAT gateway using New-NetIPAddress.

Dies ist der generische Befehl:Here is the generic command:

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

Um das Gateway zu konfigurieren, benötigen Sie ein paar Informationen über Ihr Netzwerk:In order to configure the gateway, you'll need a bit of information about your network:

  • IPAddress – Die NAT-Gateway-IP gibt die zu verwendende IPv4- oder IPv6-Adresse an.IPAddress -- NAT Gateway IP specifies the IPv4 or IPv6 address to use as the NAT gateway IP.
    Die generische Form ist „a.b.c.1“ (z. B. 172.16.0.1).The generic form will be a.b.c.1 (e.g. 172.16.0.1). Die letzte Position muss nicht 1 sein, ist es jedoch in der Regel (basierend auf der Präfixlänge).While the final position doesn’t have to be .1, it usually is (based on prefix length)

    192.168.0.1 ist eine gängige Gateway-IP.A common gateway IP is 192.168.0.1

  • PrefixLength – Die NAT-Subnetzpräfixlänge definiert die lokale Subnetzgröße (Subnetzmaske) für NAT.PrefixLength -- NAT Subnet Prefix Length defines the NAT local subnet size (subnet mask). Die Subnetzpräfixlänge ist ein Ganzzahlwert zwischen 0 und 32.The subnet prefix length will be an integer value between 0 and 32.

    0 würde das gesamte Internet zuordnen, 32 würde nur eine zugeordnete IP zulassen.0 would map the entire internet, 32 would only allow one mapped IP. Die gängigen Werte reichen von 24 bis 12, je nachdem, wie viele IP-Adressen der NAT zugeordnet werden müssen.Common values range from 24 to 12 depending on how many IPs need to be attached to the NAT.

    Eine gängige PrefixLength ist 24 – Dies ist die Subnetzmaske 255.255.255.0A common PrefixLength is 24 -- this is a subnet mask of 255.255.255.0

  • InterfaceIndex – ifIndex ist der Schnittstellenindex des virtuellen Switches, die Sie im vorherigen Schritt bestimmt haben.InterfaceIndex -- ifIndex is the interface index of the virtual switch, which you determined in the previous step.

Führen Sie Folgendes aus, um das NAT-Gateway zu erstellen.Run the following to create the NAT Gateway:

New-NetIPAddress -IPAddress 192.168.0.1 -PrefixLength 24 -InterfaceIndex 24
  1. Konfigurieren Sie das NAT-Netzwerk mit New-NetNat.Configure the NAT network using New-NetNat.

Dies ist der generische Befehl:Here is the generic command:

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

Um das Gateway zu konfigurieren, müssen Sie Informationen über das Netzwerk und das NAT-Gateway bereitstellen:In order to configure the gateway, you'll need to provide information about the network and NAT Gateway:

  • Name – NATOutsideName beschreibt den Namen des NAT-Netzwerks.Name -- NATOutsideName describes the name of the NAT network. Hiermit entfernen Sie das NAT-Netzwerk.You'll use this to remove the NAT network.

  • InternalIPInterfaceAddressPrefix – Das NAT-Subnetzpräfix beschreibt sowohl das NAT-Gateway-IP-Präfix von oben als auch die NAT-Subnetzpräfixlänge von oben.InternalIPInterfaceAddressPrefix -- NAT subnet prefix describes both the NAT Gateway IP prefix from above as well as the NAT Subnet Prefix Length from above.

    Die generische Form ist „a.b.c.0/NAT-Subnetzpräfixlänge“.The generic form will be a.b.c.0/NAT Subnet Prefix Length

    In diesem Beispiel verwenden wir von oben „192.168.0.0/24“.From the above, for this example, we'll use 192.168.0.0/24

Führen Sie für unser Beispiel Folgendes aus, um das NAT-Netzwerk einzurichten:For our example, run the following to setup the NAT network:

New-NetNat -Name MyNATnetwork -InternalIPInterfaceAddressPrefix 192.168.0.0/24

Gratulation!Congratulations! Sie haben jetzt ein virtuelles NAT-Netzwerk!You now have a virtual NAT network! Um dem NAT-Netzwerk einen virtuellen Computer hinzuzufügen, befolgen Sie bitte diese Anweisungen.To add a virtual machine, to the NAT network follow these instructions.

Herstellen einer Verbindung mit einem virtuellen ComputerConnect a virtual machine

Um einen virtuellen Computer mit Ihrem neuen NAT-Netzwerk zu verbinden, verbinden Sie den internen Switch, den Sie im ersten Schritt des Abschnitts Erstellen eines virtuellen NAT-Netzwerks erstellt haben, mithilfe des Menüs „VM-Einstellungen“ mit dem virtuellen Computer.To connect a virtual machine to your new NAT network, connect the internal switch you created in the first step of the NAT Network Setup section to your virtual machine using the VM Settings menu.

Da WinNAT nicht selbst IP-Adressen reserviert und einem Endpunkt (z. B. einer VM) zuweist, müssen Sie diese Aufgabe in der VM selbst manuell ausführen, d. h. die IP-Adresse im Bereich des NAT-internen Präfixes, die IP-Adresse des Standardgateways und die DNS-Serverinformationen festlegen.Since WinNAT by itself does not allocate and assign IP addresses to an endpoint (e.g. VM), you will need to do this manually from within the VM itself - i.e. set IP address within range of NAT internal prefix, set default gateway IP address, set DNS server information. Die einzige Einschränkung liegt vor, wenn der Endpunkt an den Container angefügt ist.The only caveat to this is when the endpoint is attached to a container. In diesem Fall wird der Host Compute Service (HCS) vom Host Network Service (HNS) so zugeordnet und verwendet, dass die IP-Adresse, Gateway-IP-Adresse und DNS-Informationen dem Container direkt zugewiesen werden.In this case, the Host Network Service (HNS) allocates and uses the Host Compute Service (HCS) to assign the IP address, gateway IP, and DNS info to the container directly.

Konfigurationsbeispiel: Anfügen von VMs und Containern an ein NAT-NetzwerkConfiguration Example: Attaching VMs and Containers to a NAT network

Wenn Sie mehrere VMS und Container an eine einzelne NAT Anfügen müssen, müssen Sie sicherstellen, dass das interne NAT-Subnetzpräfix groß genug ist, um die IP-Adressbereiche abzudecken, die von verschiedenen Anwendungen oder Diensten zugewiesen werden (z. b. docker für Windows und Windows-Container – HNS). Hierfür ist entweder die Zuweisung von IP-Adressen auf Anwendungsebene und die Netzwerkkonfiguration oder die manuelle Konfiguration erforderlich, die von einem Administrator durchgeführt werden muss, und es wird garantiert, dass vorhandene IP-Zuweisungen auf demselben Host nicht erneut verwendet werden.If you need to attach multiple VMs and containers to a single NAT, you will need to ensure that the NAT internal subnet prefix is large enough to encompass the IP ranges being assigned by different applications or services (e.g. Docker for Windows and Windows Container – HNS). This will require either application-level assignment of IPs and network configuration or manual configuration which must be done by an admin and guaranteed not to re-use existing IP assignments on the same host.

Docker für Windows (Linux-VM) und Windows-ContainerDocker for Windows (Linux VM) and Windows Containers

Die nachstehend beschriebene Lösung ermöglicht sowohl Docker für Windows (in Linux-VM ausgeführten Linux-Containern) und Windows-Containern die gemeinsame Nutzung derselben WinNAT-Instanz unter Verwendung getrennter interner vSwitches.The solution below will allow both Docker for Windows (Linux VM running Linux containers) and Windows Containers to share the same WinNAT instance using separate internal vSwitches. Konnektivität zwischen Linux- und Windows-Containern ist gegeben.Connectivity between both Linux and Windows containers will work.

Der Benutzer hat VMs über den internen vSwitch „VMNAT“ mit einem NAT-Netzwerk verbunden und möchte nun das Feature „Windows-Container“ mit dem Docker-Modul installieren.User has connected VMs to a NAT network through an internal vSwitch named “VMNAT” and now wants to install Windows Container feature with docker engine

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 weist Windows-Containern IPS zu, und der Administrator weist den VMS IP-Adressen aus dem Unterschieds Satz der beiden zu.Docker/HNS will assign IPs to Windows containers and Admin will assign IPs to VMs from the difference set of the two.

Der Benutzer hat das Feature „Windows-Container“ mit ausgeführtem Docker-Modul installiert und möchte nun VMs mit dem NAT-Netzwerk verbinden.User has installed Windows Container feature with docker engine running and now wants to connect VMs to the NAT network

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 weist Windows-Containern IPS zu, und der Administrator weist den VMS IP-Adressen aus dem Unterschieds Satz der beiden zu.Docker/HNS will assign IPs to Windows containers and Admin will assign IPs to VMs from the difference set of the two.

Am Ende verfügen Sie über zwei interne VM-Switches und einem NetNat, das von diesen gemeinsam verwendet wird.In the end, you should have two internal VM switches and one NetNat shared between them.

Verwendung der gleichen NAT durch mehrere AnwendungenMultiple Applications using the same NAT

In einigen Szenarien müssen mehrere Anwendungen oder Dienste die gleiche NAT verwenden.Some scenarios require multiple applications or services to use the same NAT. In diesem Fall muss der folgende Workflow eingehalten werden, damit mehrere Anwendungen/Dienste ein größeres NAT-internes Subnetzpräfix verwenden können.In this case, the following workflow must be followed so that multiple applications / services can use a larger NAT internal subnet prefix

In diesem Beispiel wird die Docker 4-VM mit Windows-docker Beta-Linux zusammen mit dem Windows-Container Feature auf demselben Host ausführlich erläutert. Dieser Workflow kann geändert werden.We will detail the Docker 4 Windows - Docker Beta - Linux VM co-existing with the Windows Container feature on the same host as an example. This workflow is subject to change

  1. C:> net stop dockerC:> net stop docker

  2. Stop Docker4Windows MobyLinux VMStop Docker4Windows MobyLinux VM

  3. PS C:> Get-ContainerNetwork | Remove-ContainerNetwork -forcePS C:> Get-ContainerNetwork | Remove-ContainerNetwork -force

  4. PS C:> Get-NetNat | Remove-NetNatPS C:> Get-NetNat | Remove-NetNat
    Entfernt alle zuvor vorhandenen Container Netzwerke (d. h. löscht Vswitch, löscht netnat, bereinigt)Removes any previously existing container networks (i.e. deletes vSwitch, deletes NetNat, cleans up)

  5. New-ContainerNetwork -Name nat -Mode NAT –subnetprefix 10.0.76.0/24 (Dieses Subnetz wird für das Windows-Container-Feature verwendet.) Erstellt internen vSwitch namens „nat“New-ContainerNetwork -Name nat -Mode NAT –subnetprefix 10.0.76.0/24 (this subnet will be used for Windows containers feature) Creates internal vSwitch named nat
    Erstellt das NAT-Netzwerk mit dem Namen "NAT" mit IP-Präfix 10.0.76.0/24Creates NAT network named “nat” with IP prefix 10.0.76.0/24

  6. Remove-NetNATRemove-NetNAT
    Entfernt sowohl dockernat-als auch NAT-NAT-Netzwerke (behält interne vSwitches bei)Removes both DockerNAT and nat NAT networks (keeps internal vSwitches)

  7. New-NetNat -Name DockerNAT -InternalIPInterfaceAddressPrefix 10.0.0.0/17 (Dadurch entsteht ein größeres NAT-Netzwerk, das D4W und Container gemeinsam nutzen.)New-NetNat -Name DockerNAT -InternalIPInterfaceAddressPrefix 10.0.0.0/17 (this will create a larger NAT network for both D4W and containers to share)
    Erstellt das NAT-Netzwerk mit dem Namen dockernat mit größerem Präfix 10.0.0.0/17Creates NAT network named DockerNAT with larger prefix 10.0.0.0/17

  8. Run Docker4Windows (MobyLinux.ps1)Run Docker4Windows (MobyLinux.ps1)
    Erstellt einen internen Vswitch-dockernat.Creates internal vSwitch DockerNAT
    Erstellt das NAT-Netzwerk mit dem Namen "dockernat" mit IP-Präfix 10.0.75.0/24.Creates NAT network named “DockerNAT” with IP prefix 10.0.75.0/24

  9. Net start dockerNet start docker
    Docker verwendet das benutzerdefinierte NAT-Netzwerk als Standard zum Verbinden von Windows-Containern.Docker will use the user-defined NAT network as the default to connect Windows containers

Schließlich sollten Sie über zwei interne vSwitches verfügen – einen namens „DockerNAT“ und einen anderen namens „NAT“.In the end, you should have two internal vSwitches – one named DockerNAT and the other named nat. Bei Ausführung von Get-NetNat erhalten Sie nur die Bestätigung eines NAT-Netzwerks (10.0.0.0/17).You will only have one NAT network (10.0.0.0/17) confirmed by running Get-NetNat. IP-Adressen für Windows-Container werden durch den Windows Host Network Service (HNS) aus dem Subnetz 10.0.76.0/24 zugewiesen.IP addresses for Windows containers will be assigned by the Windows Host Network Service (HNS) from the 10.0.76.0/24 subnet. IP-Adressen für Docker 4 Windows werden basierend auf dem vorhandenen Skript „MobyLinux.ps1“ aus dem Subnetz 10.0.75.0/24 zugewiesen.Based on the existing MobyLinux.ps1 script, IP addresses for Docker 4 Windows will be assigned from the 10.0.75.0/24 subnet.

ProblembehandlungTroubleshooting

Mehrere NAT-Netzwerke werden nicht unterstützt.Multiple NAT networks are not supported

In dieser Anleitung wird vorausgesetzt, dass keine anderen NATs auf dem Host vorhanden sind.This guide assumes that there are no other NATs on the host. Allerdings setzen Anwendungen und Dienste die Verwendung einer NAT voraus und erstellen diese möglicherweise beim Setup.However, applications or services will require the use of a NAT and may create one as part of setup. Da Windows (WinNAT) nur ein internes NAT-Subnetzpräfix unterstützt, setzt der Versuch, mehrere NATs zu erstellen, das System in einen unbekannten Zustand.Since Windows (WinNAT) only supports one internal NAT subnet prefix, trying to create multiple NATs will place the system into an unknown state.

Um herauszufinden, ob dies das Problem ist, stellen Sie sicher, dass Sie über nur eine NAT verfügen:To see if this may be the problem, make sure you only have one NAT:

Get-NetNat

Wenn bereits eine NAT vorhanden ist, löschen Sie sie.If a NAT already exists, delete it

Get-NetNat | Remove-NetNat

Stellen Sie sicher, dass Sie nur über einen „internen“ VM-Switch für die Anwendung oder das Feature (z. B. Windows-Container) verfügen.Make sure you only have one “internal” vmSwitch for the application or feature (e.g. Windows containers). Notieren Sie den Namen des vSwitches.Record the name of the vSwitch

Get-VMSwitch

Prüfen Sie, ob private IP-Adressen (z. B. die NAT-Standard-Gateway-IP-Adresse – in der Regel „*.1“) der alten NAT noch einem Adapter zugewiesen sind.Check to see if there are private IP addresses (e.g. NAT default Gateway IP Address – usually *.1) from the old NAT still assigned to an adapter

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

Wenn eine alte private IP-Adresse verwendet wird, löschen Sie sie.If an old private IP address is in use, please delete it

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

Entfernen mehrerer NATsRemoving Multiple NATs
Wir haben Berichte über die versehentliche Erstellung mehrerer NAT-Netzwerke erhalten.We have seen reports of multiple NAT networks created inadvertently. Die Ursache ist ein Fehler in den letzten Builds: Windows Server 2016 Technical Preview 5 und Windows 10 Insider Preview.This is due to a bug in recent builds (including Windows Server 2016 Technical Preview 5 and Windows 10 Insider Preview builds). Wenn nach Ausführung von „docker network ls“ oder „Get-ContainerNetwork“ mehrere NAT-Netzwerke vorhanden sind, führen Sie über eine PowerShell mit erhöhten Berechtigungen den folgenden Befehl aus:If you see multiple NAT networks, after running docker network ls or Get-ContainerNetwork, please perform the following from an elevated PowerShell:

PS> $KeyPath = "HKLM:\SYSTEM\CurrentControlSet\Services\vmsmp\parameters\SwitchList"
PS> $keys = get-childitem $KeyPath
PS> foreach($key in $keys)
PS> {
PS>    if ($key.GetValue("FriendlyName") -eq 'nat')
PS>    {
PS>       $newKeyPath = $KeyPath+"\"+$key.PSChildName
PS>       Remove-Item -Path $newKeyPath -Recurse
PS>    }
PS> }
PS> remove-netnat -Confirm:$false
PS> Get-ContainerNetwork | Remove-ContainerNetwork
PS> Get-VmSwitch -Name nat | Remove-VmSwitch (_failure is expected_)
PS> Stop-Service docker
PS> Set-Service docker -StartupType Disabled
Reboot Host
PS> Get-NetNat | Remove-NetNat
PS> Set-Service docker -StartupType automaticac
PS> Start-Service docker 

In diesem -Installationshandbuch für mehrere Anwendungen mit gleicher NAT finden Sie Informationen zum Neuerstellen Ihrer NAT-Umgebung, falls erforderlich.See this setup guide for multiple applications using the same NAT to rebuild your NAT environment, if necessary.

VerweiseReferences

Erfahren Sie mehr über NAT-Netzwerke.Read more about NAT networks