Een NAT-netwerk instellen
Windows 10 en Windows 11 Hyper-V staat systeemeigen NAT (Network Address Translation) toe voor een virtueel netwerk.
In deze handleiding wordt uitgelegd hoe u het volgende kunt doen:
- Een NAT-netwerk maken
- Een bestaande virtuele machine verbinden met uw nieuwe netwerk
- Controleer of de virtuele machine correct is verbonden
Eisen:
- Windows 10 Jubileumupdate of hoger
- Hyper-V is ingeschakeld. Volg de instructies om Hyper-V-in te schakelen
Notitie
Momenteel bent u beperkt tot één NAT-netwerk per host. Raadpleeg de blog voor meer informatie over de Implementatie, mogelijkheden en beperkingen van Windows NAT (WinNAT)
NAT-overzicht
NAT biedt een virtuele machine toegang tot netwerkbronnen met behulp van het IP-adres van de hostcomputer en een poort via een interne Hyper-V virtuele switch.
Network Address Translation (NAT) is een netwerkmodus die is ontworpen om IP-adressen te besparen door een extern IP-adres en poort toe te voegen aan een veel grotere set interne IP-adressen. In principe gebruikt een NAT een stroomtabel om verkeer van een extern (host) IP-adres en poortnummer te routeren naar het juiste interne IP-adres dat is gekoppeld aan een eindpunt in het netwerk (virtuele machine, computer, container, enzovoort).
Met NAT kunnen meerdere virtuele machines toepassingen hosten waarvoor identieke (interne) communicatiepoorten zijn vereist door deze toe te koppelen aan unieke externe poorten.
Om al deze redenen is NAT-netwerken zeer gebruikelijk voor containertechnologie (zie Container Networking).
Een virtueel NAT-netwerk maken
Laten we eens een nieuw NAT-netwerk instellen.
Open een PowerShell-console als beheerder.
Maak een interne switch.
New-VMSwitch -SwitchName "SwitchName" -SwitchType Internal
Zoek de interface-index van de virtuele switch die u zojuist hebt gemaakt.
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
De interne switch heeft een naam zoals
vEthernet (SwitchName)
en een interfacebeschrijving vanHyper-V Virtual Ethernet Adapter
. Noteer deifIndex
die u in de volgende stap wilt gebruiken.Configureer de NAT-gateway met behulp van New-NetIPAddress-.
Dit is de algemene opdracht:
New-NetIPAddress -IPAddress <NAT Gateway IP> -PrefixLength <NAT Subnet Prefix Length> -InterfaceIndex <ifIndex>
Als u de gateway wilt configureren, hebt u informatie over uw netwerk nodig:
- IPAddress-- NAT-gateway-IP geeft het IPv4- of IPv6-adres op dat moet worden gebruikt als het IP-adres van de NAT-gateway.
Het algemene formulier is a.b.c.1 (bijvoorbeeld 172.16.0.1). Hoewel de uiteindelijke positie niet .1 hoeft te zijn, is dit meestal (gebaseerd op lengte van voorvoegsel). Dit IP-adres bevindt zich in het bereik van adressen die worden gebruikt door de virtuele gastmachines. Als de gast-VM's bijvoorbeeld IP-adresbereik 172.16.0.0 gebruiken, kunt u een IP-adres 172.16.0.100 gebruiken als nat-gateway. Een algemeen ip-adres van de gateway is 192.168.0.1
nl-NL: Voorvoegsellengte -- Lengte van NAT-subnetvoorvoegsel definieert de grootte van het lokale NAT-subnet (subnetmasker). De lengte van het subnetvoorvoegsel is een geheel getal tussen 0 en 32.
0 zou het hele internet in kaart brengen, 32 zou slechts één toewijzing van een IP-adres toestaan. Algemene waarden variëren van 24 tot 12, afhankelijk van het aantal IP-adressen dat moet worden gekoppeld aan de NAT.
Een veelvoorkomende prefixlengte is 24 - dit is een subnetmasker van 255.255.255.0
InterfaceIndex: ifIndex is de interface-index van de virtuele switch, die u in de vorige stap hebt bepaald.
Voer het volgende uit om de NAT-gateway te maken:
New-NetIPAddress -IPAddress 192.168.0.1 -PrefixLength 24 -InterfaceIndex 24
Configureer het NAT-netwerk met behulp van New-NetNat-.
Dit is de algemene opdracht:
New-NetNat -Name <NATOutsideName> -InternalIPInterfaceAddressPrefix <NAT subnet prefix>
Als u de gateway wilt configureren, moet u informatie opgeven over het netwerk en de NAT-gateway:
Name -- NATOutsideName beschrijft de naam van het NAT-netwerk. U gebruikt dit om het NAT-netwerk te verwijderen.
InternalIPInterfaceAddressPrefix - het NAT-subnetvoorvoegsel beschrijft zowel het IP-voorvoegsel van de NAT-gateway als de lengte van het NAT-subnetvoorvoegsel.
De algemene vorm is a.b.c.0/NAT subnetvoorvoegsellengte
Voor dit voorbeeld gebruiken we 192.168.0.0/24
Voer het volgende uit om het NAT-netwerk in te stellen:
New-NetNat -Name MyNATnetwork -InternalIPInterfaceAddressPrefix 192.168.0.0/24
Gefeliciteerd! U hebt nu een virtueel NAT-netwerk.
Een virtuele machine verbinden
Als u een virtuele machine wilt verbinden met uw nieuwe NAT-netwerk, verbindt u de interne switch die u in de eerste stap van dit artikel hebt gemaakt met uw virtuele machine met behulp van het menu VM-instellingen.
Omdat WinNAT zelf geen IP-adressen toewijst en toewijst aan een eindpunt (bijvoorbeeld VM), moet u dit handmatig doen vanuit de VIRTUELE machine zelf, d.w.w. IP-adres instellen binnen het bereik van het interne NAT-voorvoegsel, het standaard-gateway-IP-adres instellen, DNS-servergegevens instellen. Het enige nadeel hiervan is wanneer het eindpunt is gekoppeld aan een container. In dit geval wijst de Host Network Service (HNS) de HCS (Host Compute Service) toe en gebruikt deze om het IP-adres, gateway-IP en DNS-gegevens rechtstreeks aan de container toe te wijzen.
Configuratievoorbeeld: VM's en containers koppelen aan een NAT-netwerk
Als u meerdere VM's en containers wilt koppelen aan één NAT, moet u ervoor zorgen dat het interne NAT-subnetvoorvoegsel groot genoeg is om de IP-bereiken te omvatten die worden toegewezen door verschillende toepassingen of services (bijvoorbeeld Docker voor Windows en Windows Container – HNS). Hiervoor is toewijzing op toepassingsniveau van IP-adressen en netwerkconfiguratie of handmatige configuratie vereist, die moet worden uitgevoerd door een beheerder en gegarandeerd dat bestaande IP-toewijzingen op dezelfde host niet opnieuw worden gebruikt.
Docker voor Windows (Linux-VM) en Windows-containers
Volg deze sectie om ervoor te zorgen dat zowel Docker voor Windows (Linux-VM met Linux-containers) als Windows-containers hetzelfde WinNAT-exemplaar delen met behulp van afzonderlijke interne vSwitches. Connectiviteit tussen linux- en Windows-containers werkt.
Gebruiker heeft VM's verbonden met een NAT-netwerk via een interne vSwitch met de naam 'VMNAT' en wil nu de Windows-containerfunctie installeren met docker-engine:
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 wijst IP-adressen toe aan Windows-containers en admin wijst IP's toe aan VM's uit de verschilset van de twee.
De gebruiker heeft de Windows-containerfunctie geïnstalleerd met de docker-engine die actief is en wil nu VM's verbinden met het NAT-netwerk.
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 wijst IP-adressen toe aan Windows-containers en admin wijst IP's toe aan VM's uit de verschilset van de twee.
Uiteindelijk hebt u twee interne VM-switches en één NetNat die tussen hen wordt gedeeld.
Meerdere toepassingen die gebruikmaken van dezelfde NAT
Voor sommige scenario's moeten meerdere toepassingen of services dezelfde NAT gebruiken. In dit geval moet de volgende werkstroom worden gevolgd, zodat meerdere toepassingen/services een groter intern NAT-subnetvoorvoegsel kunnen gebruiken
We beschrijven docker 4 Windows - Docker Beta - Linux-VM's die naast de Windows-containerfunctie op dezelfde host staan als een voorbeeld. Deze werkstroom is onderhevig aan wijzigingen
-
net stop docker
-
Stop Docker4Windows MobyLinux VM
-
Get-ContainerNetwork | Remove-ContainerNetwork -force
Verwijder alle eerder bestaande containernetwerken (d.w.z. verwijder vSwitch, verwijder NetNat, ruim op).
Get-NetNat | Remove-NetNat
Maak een interne vSwitch met de naam NAT en een NAT-netwerk met IP-voorvoegsel 10.0.76.0/24.
New-ContainerNetwork -Name nat -Mode NAT –subnetprefix 10.0.76.0/24
Verwijder zowel DockerNAT- als nat NAT-netwerken (bewaart interne vSwitches).
Remove-NetNAT
Maak een NAT-netwerk met de naam DockerNAT met groter voorvoegsel 10.0.0.0/17, zodat zowel D4W als containers kunnen worden gedeeld.
New-NetNat -Name DockerNAT -InternalIPInterfaceAddressPrefix 10.0.0.0/17
Docker4Windows (MobyLinux.ps1) uitvoeren
Gebruik het door de gebruiker gedefinieerde NAT-netwerk als de standaardinstelling om Windows-containers te verbinden.
Net start docker
Uiteindelijk hebt u twee interne vSwitches: een met de naam DockerNAT- en de andere met de naam nat. U hebt slechts één NAT-netwerk (10.0.0.0/17) bevestigd door Get-NetNat uit te voeren. IP-adressen voor Windows-containers worden toegewezen door de Windows Host Network Service (HNS) van het subnet 10.0.76.0/24. Op basis van het bestaande MobyLinux.ps1-script worden IP-adressen voor Docker 4 Windows toegewezen vanuit het subnet 10.0.75.0/24.
Probleemoplossing en diagnostiek
Meerdere NAT-netwerken worden niet ondersteund
In deze handleiding wordt ervan uitgegaan dat er geen andere NAT's op de host zijn. Toepassingen of services vereisen echter het gebruik van een NAT en kunnen er een maken als onderdeel van de installatie. Omdat Windows (WinNAT) slechts één intern NAT-subnetvoorvoegsel ondersteunt, wordt het systeem door meerdere NAT's in een onbekende status geplaatst.
Als u wilt zien of dit het probleem kan zijn, controleert u of u slechts één NAT hebt:
Get-NetNat
Als er al een NAT bestaat, verwijdert u deze:
Get-NetNat | Remove-NetNat
Zorg ervoor dat u slechts één 'interne' vmSwitch hebt voor de toepassing of functie (bijvoorbeeld Windows-containers). Noteer de naam van de vSwitch:
Get-VMSwitch
Controleer of er privé-IP-adressen zijn (bijvoorbeeld NAT-standaard-gateway-IP-adres, meestal x.y.z.1) van de oude NAT die nog steeds is toegewezen aan een adapter:
Get-NetIPAddress -InterfaceAlias "vEthernet (<name of vSwitch>)"
Als een oud privé-IP-adres wordt gebruikt, verwijdert u het volgende:
Remove-NetIPAddress -InterfaceAlias "vEthernet (<name of vSwitch>)" -IPAddress <IPAddress>
Meerdere NAT's verwijderen We hebben per ongeluk rapporten gezien van meerdere NAT-netwerken die zijn gemaakt. Als u meerdere NAT-netwerken ziet nadat u docker-netwerk ls of Get-ContainerNetwork hebt uitgevoerd, voert u het volgende uit vanuit een PowerShell met verhoogde bevoegdheid:
$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
Start het besturingssysteem opnieuw op voordat u de volgende opdrachten uitvoert (Restart-Computer
)
Get-NetNat | Remove-NetNat
Set-Service docker -StartupType Automatic
Start-Service docker