Freigeben über


Einrichten eines NAT-Netzwerks

Windows 10 und Windows 11 Hyper-V ermöglicht native Netzwerkadressübersetzung (Network Address Translation, NAT) für ein virtuelles Netzwerk.

Dieser Leitfaden führt Sie durch die Vorgehensweise:

  • Erstellen eines NAT-Netzwerks
  • Verbinden eines vorhandenen virtuellen Computers mit Ihrem neuen Netzwerk
  • Vergewissern Sie sich, dass der virtuelle Computer ordnungsgemäß verbunden ist.

Anforderungen:

  • Windows 10 Anniversary Update oder höher
  • Hyper-V ist aktiviert. Befolgen Sie die Anweisungen in Aktivieren von Hyper-V

Hinweis

Derzeit steht Ihnen nur ein NAT-Netzwerk pro Host zur Verfügung. Weitere Informationen zur Windows NAT(WinNAT)-Implementierung, -Funktionen und -Einschränkungen finden Sie im Blog WinNAT-Funktionen und -Einschränkungen

NAT-Überblick

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.

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. Im Grunde verwendet eine NAT eine Flusstabelle, um Datenverkehr von einer externen (Host)-IP-Adresse und -Portnummer an die richtige interne IP-Adresse zu leiten, die einem Endpunkt im Netzwerk zugeordnet ist (virtueller Computer, Computer, Container usw.).

Darüber hinaus ermöglicht NAT mehreren virtuellen Computern das Hosten von Anwendungen, die identische (interne) Kommunikationsports erfordern, indem sie diese eindeutigen externen Ports zuordnen.

Aus allen diesen Gründen ist NAT-Networking in der Containertechnologie sehr gebräuchlich (siehe Containernetzwerk).

Erstellen eines virtuellen NAT-Netzwerks

Betrachten wir nun die Einrichtung eines neuen NAT-Netzwerks.

  1. Öffnen Sie eine PowerShell-Konsole als Administrator.

  2. Erstellen Sie einen internen Switch.

    New-VMSwitch -SwitchName "SwitchName" -SwitchType Internal
    
  3. Suchen Sie den Schnittstellenindex des virtuelles Switches, den Sie gerade erstellt haben.

    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
    
    

    Der interne Switch weist einen Namen wie vEthernet (SwitchName) und eine Schnittstellenbeschreibung von Hyper-V Virtual Ethernet Adapterauf. ifIndex wird im nächsten Schritt verwendet.

  4. Konfigurieren Sie das NAT-Gateway mit New-NetIPAddress.

    Dies ist der generische Befehl:

    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:

    • IPAddress – Die NAT-Gateway-IP gibt die zu verwendende IPv4- oder IPv6-Adresse an.

    Die generische Form ist a.b.c.1 (z. B. 172.16.0.1). Die letzte Position muss nicht unbedingt „.1“ lauten, tut es jedoch in der Regel (basierend auf der Präfixlänge). Diese IP-Adresse befindet sich im Adressbereich, der von den virtuellen Gastcomputern verwendet wird. Wenn die Gast-VMs beispielsweise den IP-Bereich 172.16.0.0 verwenden, können Sie eine IP-Adresse 172.16.0.100 als NAT-Gateway verwenden. 192.168.0.1 ist eine gängige Gateway-IP.

    • PrefixLength – Die Präfixlänge des NAT-Subnetzes definiert die lokale Subnetzgröße (Subnetzmaske) für NAT. Die Subnetzpräfixlänge ist ein ganzzahliger Wert zwischen 0 und 32.

      0 würde das gesamte Internet zuordnen, 32 würde nur eine zugeordnete IP-Adresse zulassen. Im Allgemeinen reichen die Werte von 24 bis 12, je nachdem, wie viele IP-Adressen an das NAT angefügt werden müssen.

      Eine gängige PrefixLength ist 24 – Dies ist die Subnetzmaske 255.255.255.0

    • InterfaceIndex – ifIndex ist der Schnittstellenindex des virtuellen Switches, die Sie im vorherigen Schritt bestimmt haben.

    Führen Sie Folgendes aus, um das NAT-Gateway zu erstellen:

    New-NetIPAddress -IPAddress 192.168.0.1 -PrefixLength 24 -InterfaceIndex 24
    
  5. Konfigurieren Sie das NAT-Netzwerk mit New-NetNat.

    Dies ist der generische Befehl:

    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:

    • Name – NATOutsideName beschreibt den Namen des NAT-Netzwerks. Hiermit entfernen Sie das NAT-Netzwerk.

    • InternalIPInterfaceAddressPrefix -- NAT-Subnetzpräfix beschreibt sowohl das NAT-Gateway-IP-Präfix als auch die NAT-Subnetzpräfixlänge.

    Die generische Form ist „a.b.c.0/NAT-Subnetzpräfixlänge“.

    In diesem Beispiel verwenden wir 192.168.0.0/24

    Führen Sie Folgendes aus, um das NAT-Netzwerk einzurichten:

    New-NetNat -Name MyNATnetwork -InternalIPInterfaceAddressPrefix 192.168.0.0/24
    

Herzlichen Glückwunsch! Sie haben jetzt ein virtuelles NAT-Netzwerk!

Herstellen einer Verbindung mit einem virtuellen Computer

Um einen virtuellen Computer mit Ihrem neuen NAT-Netzwerk zu verbinden, verbinden Sie den internen Switch, den Sie im ersten Schritt dieses Artikels erstellt haben, mithilfe des Menüs "VM-Einstellungen" mit Ihrem virtuellen Computer.

Da WinNAT selbst keine IP-Adressen einem Endpunkt (z. B. VM) zuteilt und zuweist, müssen Sie dies manuell innerhalb des virtuellen Computers selbst tun, d. h. die IP-Adresse innerhalb des Bereichs des internen NAT-Präfixes festlegen, die IP-Adresse des Standardgateways festlegen und DNS-Serverinformationen festlegen. Die einzige Einschränkung liegt vor, wenn der Endpunkt an den Container angefügt ist. 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.

Konfigurationsbeispiel: Anfügen von VMs und Containern an ein NAT-Netzwerk

Wenn Sie mehrere VMs und Containern an ein einzelnes NAT anfügen müssen, ist sicherzustellen, dass das NAT-interne Subnetzpräfix für die IP-Bereiche groß genug ist, die verschiedenen Anwendungen oder Diensten (z. B. Docker für Windows und Windows-Container, HNS) zugewiesen sind. Dies erfordert entweder die Zuordnung von IPs auf Anwendungsebene und die Netzwerkkonfiguration oder manuelle Konfiguration, die von einem Administrator durchgeführt werden muss und garantiert keine vorhandenen IP-Zuordnungen auf demselben Host wiederverwenden muss.

Docker für Windows (Linux-VM) und Windows-Container

In diesem Abschnitt wird beschrieben, wie Sie sowohl Docker für Windows (Linux-VM mit Linux-Containern) als auch Windows-Container so konfigurieren, dass sie dieselbe WinNAT-Instanz durch die Verwendung von separaten internen vSwitches gemeinsam nutzen können. Die Konnektivität zwischen Linux- und Windows-Containern funktioniert.

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:

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 weist Windows-Containern IPs zu, und Der Administrator weist VMs IPs aus dem Unterschiedssatz der beiden zu.

Der Benutzer hat das Feature „Windows-Container“ mit ausgeführtem Docker-Modul installiert und möchte nun VMs mit dem NAT-Netzwerk verbinden:

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 VMs IPs aus dem Unterschiedssatz der beiden zu.

Am Ende verfügen Sie über zwei interne VM-Switches und ein gemeinsames NetNat zwischen ihnen.

Verwendung der gleichen NAT durch mehrere Anwendungen

In einigen Szenarien müssen mehrere Anwendungen oder Dienste die gleiche NAT verwenden. In diesem Fall muss der folgende Workflow eingehalten werden, damit mehrere Anwendungen/Dienste ein größeres NAT-internes Subnetzpräfix verwenden können

Wir werden erläutern, wie Docker 4 Windows - Docker Beta - und eine Linux-VM zusammen mit dem Windows-Container-Feature als Beispiel auf demselben Host koexistieren. Dieser Workflow kann sich ändern

  1.  net stop docker
    
  2.  Stop Docker4Windows MobyLinux VM
    
  3.  Get-ContainerNetwork | Remove-ContainerNetwork -force
    
  4. Entfernen Sie alle zuvor vorhandenen Containernetzwerke, das bedeutet, vSwitch und NetNat werden gelöscht und bereinigt.

     Get-NetNat | Remove-NetNat
    
  5. Erstellen Sie einen internen vSwitch namens NAT und ein NAT-Netzwerk mit dem IP-Präfix 10.0.76.0/24.

     New-ContainerNetwork -Name nat -Mode NAT –subnetprefix 10.0.76.0/24
    
  6. Entfernen Sie sowohl die DockerNAT- als auch die nat NAT-Netzwerke (behält interne vSwitches bei).

     Remove-NetNAT
    
  7. Erstellen Sie ein NAT-Netzwerk namens DockerNAT mit größerem Präfix 10.0.0.0/17 für die gemeinsame Nutzung von D4W und Containern.

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

  9. Verwenden Sie das benutzerdefinierte NAT-Netzwerk als Standard zum Verbinden von Windows-Containern.

     Net start docker
    

Am Ende haben Sie zwei interne vSwitches – eine namens DockerNAT und die andere namens nat. Sie haben nur ein NAT-Netzwerk (10.0.0.0/17) bestätigt, indem Sie Get-NetNat ausführen. IP-Adressen für Windows-Container werden vom Windows Host Network Service (HNS) aus dem Subnetz 10.0.76.0/24 zugewiesen. Basierend auf dem vorhandenen MobyLinux.ps1 Skript werden IP-Adressen für Docker 4 Windows aus dem Subnetz 10.0.75.0/24 zugewiesen.

Problembehandlung

Mehrere NAT-Netzwerke werden nicht unterstützt.

In dieser Anleitung wird vorausgesetzt, dass keine anderen NATs auf dem Host vorhanden sind. Anwendungen oder Dienste erfordern jedoch die Verwendung einer NAT und können eine als Teil des Setups erstellen. Da Windows (WinNAT) nur ein internes NAT-Subnetzpräfix unterstützt, wird das System durch den Versuch, mehrere NATs zu erstellen, in einen unbekannten Zustand versetzt.

Um herauszufinden, ob dies das Problem ist, stellen Sie sicher, dass Sie über nur eine NAT verfügen:

Get-NetNat

Wenn bereits eine NAT vorhanden ist, löschen Sie sie:

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. Notieren Sie den Namen des vSwitches:

Get-VMSwitch

Überprüfen Sie, ob private IP-Adressen (z. B. die NAT-Standard-Gateway-IP-Adresse – in der Regel x.y.z.1) des alten NAT noch einem Adapter zugewiesen sind:

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

Wenn eine alte private IP-Adresse verwendet wird, löschen Sie sie.

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

Entfernen mehrerer NATs Wir haben Berichte erhalten, dass mehrere NAT-Netzwerke versehentlich erstellt wurden. Wenn mehrere NAT-Netzwerke angezeigt werden, führen Sie nach dem Ausführen von Docker Network ls oder Get-ContainerNetwork folgendes aus einer PowerShell mit erhöhten Rechten aus:

$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

Starten Sie das Betriebssystem neu, bevor Sie die nachfolgenden Befehle ausführen (Restart-Computer).

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