Dela via


Konfigurera ett NAT-nätverk

Windows 10 och Windows 11 Hyper-V tillåter nat (native network address translation) för ett virtuellt nätverk.

Den här guiden beskriver hur du gör:

  • Skapa ett NAT-nätverk
  • Ansluta en befintlig virtuell dator till ditt nya nätverk
  • Bekräfta att den virtuella datorn är korrekt ansluten

Krav:

  • Windows 10 Anniversary Update eller senare
  • Hyper-V är aktiverat. Följ anvisningarna för att Aktivera Hyper-V-

Not

För närvarande är du begränsad till ett NAT-nätverk per värd. Mer information om Implementering, funktioner och begränsningar för Windows NAT (WinNAT) finns i bloggen WinNAT-funktioner och begränsningar

NAT-översikt

NAT ger en virtuell dator åtkomst till nätverksresurser med hjälp av värddatorns IP-adress och en port via en intern Hyper-V virtuell växel.

NAT (Network Address Translation) är ett nätverksläge som är utformat för att spara IP-adresser genom att mappa en extern IP-adress och port till en mycket större uppsättning interna IP-adresser. I grund och botten använder en NAT en flödestabell för att dirigera trafik från en extern IP-adress (värd) och portnummer till rätt intern IP-adress som är associerad med en slutpunkt i nätverket (virtuell dator, dator, container osv.).

Nat tillåter också att flera virtuella datorer är värdar för program som kräver identiska (interna) kommunikationsportar genom att mappa dessa till unika externa portar.

Av alla dessa skäl är NAT-nätverk mycket vanligt för containerteknik (se Container Networking).

Skapa ett virtuellt NAT-nätverk

Nu ska vi gå igenom hur du konfigurerar ett nytt NAT-nätverk.

  1. Öppna en PowerShell-konsol som administratör.

  2. Skapa en intern växel.

    New-VMSwitch -SwitchName "SwitchName" -SwitchType Internal
    
  3. Leta reda på gränssnittsindexet för den virtuella växel som du nyss skapade.

    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
    
    

    Den interna växeln har ett namn som vEthernet (SwitchName) och en gränssnittsbeskrivning för Hyper-V Virtual Ethernet Adapter. Anteckna dess ifIndex som ska användas i nästa steg.

  4. Konfigurera NAT-gatewayen med New-NetIPAddress.

    Här är det allmänna kommandot:

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

    För att konfigurera gatewayen behöver du lite information om nätverket:

    • IPAddress – NAT Gateway IP anger den IPv4- eller IPv6-adress som ska användas som NAT-gateway-IP.

    Det generiska formuläret är a.b.c.1 (t.ex. 172.16.0.1). Även om den slutliga positionen inte behöver vara .1 är den vanligtvis (baserat på prefixets längd). Den här IP-adressen finns i det adressintervall som används av de virtuella gästdatorerna. Om de virtuella gästdatorerna till exempel använder IP-intervall 172.16.0.0 kan du använda IP-adressen 172.16.0.100 som NAT Gateway. En vanlig gateway-IP är 192.168.0.1

    • PrefixLength – NAT Subnet Prefix Length definierar NAT:s lokala undernätsstorlek (nätmask). Undernätets prefixlängd är ett heltalsvärde mellan 0 och 32.

      0 skulle mappa hela Internet, 32 tillåter bara en mappad IP-adress. Vanliga värden varierar från 24 till 12 beroende på hur många IP-adresser som måste kopplas till NAT.

      En vanlig längd för prefix är 24 – det här är en subnätmask på 255.255.255.0

    • InterfaceIndex – ifIndex är gränssnittsindexet för den virtuella växeln, som du fastställde i föregående steg.

    Kör följande för att skapa NAT Gateway:

    New-NetIPAddress -IPAddress 192.168.0.1 -PrefixLength 24 -InterfaceIndex 24
    
  5. Konfigurera NAT-nätverket med New-NetNat.

    Här är det allmänna kommandot:

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

    För att kunna konfigurera gatewayen måste du ange information om nätverket och NAT Gateway:

    • Name – NATOutsideName beskriver namnet på NAT-nätverket. Du använder detta för att ta bort NAT-nätverket.

    • InternalIPInterfaceAddressPrefix – NAT-undernätsprefixet beskriver både NAT Gateway IP-prefixet och NAT-undernätets prefixlängd.

    Det generiska formatet är a.b.c.0/NAT-undernätets prefixlängd

    I det här exemplet använder vi 192.168.0.0/24

    Kör följande för att konfigurera NAT-nätverket:

    New-NetNat -Name MyNATnetwork -InternalIPInterfaceAddressPrefix 192.168.0.0/24
    

Grattis! Nu har du ett virtuellt NAT-nätverk!

Anslut en virtuell maskin

Om du vill ansluta en virtuell dator till ditt nya NAT-nätverk ansluter du den interna växeln som du skapade i det första steget i den här artikeln till den virtuella datorn med hjälp av menyn Inställningar för virtuella datorer.

Eftersom WinNAT i sig inte allokerar och tilldelar IP-adresser till en slutpunkt (t.ex. virtuell dator) måste du göra detta manuellt inifrån själva den virtuella datorn, d.v.s. ange IP-adress inom intervallet för internt NAT-prefix, ange standard-GATEWAY-IP-adress, ange DNS-serverinformation. Det enda förbehållet är när slutpunkten är kopplad till en container. I det här fallet allokerar och använder värdnätverkstjänsten (HNS) värdberäkningstjänsten (HCS) för att tilldela IP-adressen, gateway-IP-adressen och DNS-informationen till containern direkt.

Konfigurationsexempel: Koppla virtuella datorer och containrar till ett NAT-nätverk

Om du behöver koppla flera virtuella datorer och containrar till en enda NAT måste du se till att det interna NAT-undernätsprefixet är tillräckligt stort för att omfatta DE IP-intervall som tilldelas av olika program eller tjänster (t.ex. Docker för Windows och Windows Container – HNS). Detta kräver antingen tilldelning på programnivå av IP-adresser och nätverkskonfiguration eller manuell konfiguration som måste göras av en administratör och garanterat inte återanvända befintliga IP-tilldelningar på samma värd.

Docker för Windows (virtuell Linux-dator) och Windows-containrar

Följ med i det här avsnittet för att tillåta att både Docker för Windows (virtuell Linux-dator som kör Linux-containrar) och Windows-containrar delar samma WinNAT-instans med hjälp av separata interna vSwitches. Anslutningen mellan både Linux- och Windows-containrar fungerar.

Användaren har anslutit virtuella datorer till ett NAT-nätverk via en intern vSwitch med namnet "VMNAT" och vill nu installera Windows Container-funktionen med Docker-motorn:

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 tilldelar IP-adresser till Windows-containrar och Administratör tilldelar IP-adresser till virtuella datorer från skillnadsuppsättningen för de två.

Användaren har installerat Windows Container-funktionen med Docker-motorn igång och vill nu ansluta virtuella datorer till NAT-nätverket:

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 tilldelar IP-adresser till Windows-containrar och Administratör tilldelar IP-adresser till virtuella datorer från skillnadsuppsättningen för de två.

Till slut har du två interna VM-växlar och en NetNat som delas mellan dem.

Flera program som använder samma NAT

Vissa scenarier kräver flera program eller tjänster för att använda samma NAT. I det här fallet måste följande arbetsflöde följas så att flera program/tjänster kan använda ett större nat-internt undernätsprefix

Vi kommer att beskriva Docker 4 Windows – Docker Beta – Linux VM samexistera med Windows Container-funktionen på samma värd som ett exempel. Det här arbetsflödet kan komma att ändras

  1.  net stop docker
    
  2.  Stop Docker4Windows MobyLinux VM
    
  3.  Get-ContainerNetwork | Remove-ContainerNetwork -force
    
  4. Ta bort befintliga containernätverk (d.v.s. tar bort vSwitch, tar bort NetNat, rensar).

     Get-NetNat | Remove-NetNat
    
  5. Skapa en intern vSwitch med namnet nat och ett NAT-nätverk med IP-prefixet 10.0.76.0/24.

     New-ContainerNetwork -Name nat -Mode NAT –subnetprefix 10.0.76.0/24
    
  6. Ta bort både DockerNAT- och nat NAT-nätverk (behåller interna vSwitches).

     Remove-NetNAT
    
  7. Skapa ett NAT-nätverk med namnet DockerNAT med större prefix 10.0.0.0/17 för både D4W och containrar att dela.

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

  9. Använd det användardefinierade NAT-nätverket som standard för att ansluta Windows-containrar.

     Net start docker
    

Till slut har du två interna vSwitches – en med namnet DockerNAT och den andra med namnet nat. Du har bara ett NAT-nätverk (10.0.0.0/17) som bekräftats genom att köra Get-NetNat. IP-adresser för Windows-containrar tilldelas av Windows Host Network Service (HNS) från undernätet 10.0.76.0/24. Baserat på det befintliga MobyLinux.ps1 skriptet tilldelas IP-adresser för Docker 4 Windows från undernätet 10.0.75.0/24.

Felsökning

Flera NAT-nätverk stöds inte

Den här guiden förutsätter att det inte finns några andra NAT:er på värdmaskinen. Program eller tjänster kräver dock användning av en NAT och kan skapa en som en del av installationen. Eftersom Windows (WinNAT) endast stödjer ett internt NAT-undernätsprefix, försätter försök att skapa flera NAT systemet i ett oförutsägbart tillstånd.

För att se om detta kan vara problemet, kontrollera att du endast har en NAT:

Get-NetNat

Om det redan finns en NAT tar du bort den:

Get-NetNat | Remove-NetNat

Kontrollera att du bara har en "intern" vmSwitch för programmet eller funktionen (t.ex. Windows-containrar). Registrera namnet på vSwitch:

Get-VMSwitch

Kontrollera om det finns privata IP-adresser (t.ex. NAT-standardgateway-IP-adress – vanligtvis x.y.z.1) som fortfarande är tilldelade till en nätverksadapter från den gamla NAT:

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

Om en gammal privat IP-adress används tar du bort den:

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

Ta bort flera NAT- Vi har sett rapporter om flera NAT-nätverk som skapats oavsiktligt. Om du ser flera NAT-nätverk, när du har kört docker network ls eller Get-ContainerNetwork, utför du följande från en upphöjd 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

Starta om operativsystemet innan du kör efterföljande kommandon (Restart-Computer)

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