Configurer un réseau NATSet up a NAT network

Hyper-V sur Windows 10 permet la traduction d’adresses réseau (NAT) natives pour un réseau virtuel.Windows 10 Hyper-V allows native network address translation (NAT) for a virtual network.

Ce guide vous aidera tout au long des processus suivants :This guide will walk you through:

  • Création d’un réseau NATcreating a NAT network
  • Connexion d’une machine virtuelle existante à votre nouveau réseauconnecting an existing virtual machine to your new network
  • Vérification que la machine virtuelle est correctement connectéeconfirming that the virtual machine is connected correctly

Configuration requise :Requirements:

  • Mise à jour anniversaire Windows 10 ou ultérieureWindows 10 Anniversary Update or later
  • Hyper-V est activé (instructions ici)Hyper-V is enabled (instructions here)

Remarque : pour le moment, vous pouvez créer un seul réseau NAT par hôte.Note: Currently, you are limited to one NAT network per host. Pour plus d’informations sur l’implémentation, les fonctionnalités et les limitations de NAT Windows (WinNAT), reportez-vous au billet de blog Fonctionnalités et limitations de WinNATFor additional details on the Windows NAT (WinNAT) implementation, capabilities, and limitations, please reference the WinNAT capabilities and limitations blog

Vue d’ensemble de NATNAT Overview

NAT permet à une machine virtuelle d’accéder à des ressources réseau à l’aide de l’adresse IP de l’ordinateur hôte et d’un port via un commutateur virtuel Hyper-V interne.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.

La traduction d’adresses réseau (NAT) est un mode de mise en réseau conçu pour conserver des adresses IP en mappant une adresse IP et un port externes à un ensemble beaucoup plus vaste d’adresses IP internes.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. Fondamentalement, NAT utilise une table de flux pour acheminer le trafic à partir d’une adresse IP (hôte) externe et d’un numéro de port vers l’adresse IP interne appropriée associée à un point de terminaison sur le réseau (machine virtuelle, ordinateur, conteneur, etc.)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.)

De plus, NAT autorise que plusieurs machines virtuelles hébergent des applications qui exigent des ports de communication (internes) identiques en les mappant à des ports externes uniques.Additionally, NAT allows multiple virtual machines to host applications that require identical (internal) communication ports by mapping these to unique external ports.

Pour toutes ces raisons, la mise en réseau NAT est très répandue pour la technologie de conteneur (voir Mise en réseau de conteneur).For all of these reasons, NAT networking is very common for container technology (see Container Networking).

Créer un réseau virtuel NATCreate a NAT virtual network

Examinons la configuration d’un nouveau réseau NAT.Let's walk through setting up a new NAT network.

  1. Ouvrez une console PowerShell en tant qu’administrateur.Open a PowerShell console as Administrator.

  2. Créez un commutateur interne.Create an internal switch.

New-VMSwitch -SwitchName "SwitchName" -SwitchType Internal
  1. Recherchez l’index d’interface du commutateur virtuel que vous venez de créer.Find the interface index of the virtual switch you just created.

    Vous pouvez rechercher l’index d’interface en exécutant Get-NetAdapterYou can find the interface index by running Get-NetAdapter

    Votre sortie doit ressembler à ceci :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
    
    

    Le commutateur interne a un nom semblable à vEthernet (SwitchName) et la description d’interface 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. Notez son ifIndex afin de l’utiliser dans l’étape suivante.Take note of its ifIndex to use in the next step.

  2. Configurez la passerelle NAT à l’aide de New-NetIPAddress.Configure the NAT gateway using New-NetIPAddress.

Voici la commande générique :Here is the generic command:

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

Pour configurer la passerelle, vous aurez besoin de certaines informations concernant votre réseau :In order to configure the gateway, you'll need a bit of information about your network:

  • IPAddress : l’adresse IP de la passerelle NAT spécifie l’adresse IPv4 ou IPv6 à utiliser en tant qu’adresse IP de la passerelle NAT.IPAddress -- NAT Gateway IP specifies the IPv4 or IPv6 address to use as the NAT gateway IP.
    La forme générique est a.b.c.1 (par exemple, 172.16.0.1).The generic form will be a.b.c.1 (e.g. 172.16.0.1). Même si la position finale ne doit pas obligatoirement être .1, c’est généralement le cas (en fonction de la longueur du préfixe).While the final position doesn’t have to be .1, it usually is (based on prefix length)

    Une adresse IP de passerelle courante est 192.168.0.1A common gateway IP is 192.168.0.1

  • PrefixLength : la longueur du préfixe de sous-réseau NAT définit la taille du sous-réseau local NAT (masque de sous-réseau).PrefixLength -- NAT Subnet Prefix Length defines the NAT local subnet size (subnet mask). La longueur du préfixe de sous-réseau est une valeur entière comprise entre 0 et 32.The subnet prefix length will be an integer value between 0 and 32.

    0 mappe la totalité d’Internet ; 32 permet une seule adresse IP mappée.0 would map the entire internet, 32 would only allow one mapped IP. Les valeurs courantes sont comprises entre 24 et 12 en fonction du nombre d’adresses IP attachées à NAT.Common values range from 24 to 12 depending on how many IPs need to be attached to the NAT.

    24 est une valeur PrefixLength courante : il s’agit d’un masque de sous-réseau 255.255.255.0A common PrefixLength is 24 -- this is a subnet mask of 255.255.255.0

  • InterfaceIndex --ifIndex est l’index d’interface du commutateur virtuel défini à l’étape précédente.InterfaceIndex -- ifIndex is the interface index of the virtual switch, which you determined in the previous step.

Exécutez la commande suivante pour créer une passerelle NAT :Run the following to create the NAT Gateway:

New-NetIPAddress -IPAddress 192.168.0.1 -PrefixLength 24 -InterfaceIndex 24
  1. Configurez le réseau NAT à l’aide de New-NetNat.Configure the NAT network using New-NetNat.

Voici la commande générique :Here is the generic command:

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

Pour configurer la passerelle, vous devez fournir des informations relatives au réseau et à la passerelle NAT :In order to configure the gateway, you'll need to provide information about the network and NAT Gateway:

  • Name : NATOutsideName décrit le nom du réseau NAT.Name -- NATOutsideName describes the name of the NAT network. Cette valeur permet de supprimer le réseau NAT.You'll use this to remove the NAT network.

  • InternalIPInterfaceAddressPrefix : le préfixe de sous-réseau NAT décrit à la fois le préfixe IP de la passerelle NAT ci-dessus et la longueur du préfixe de sous-réseau NAT ci-dessus.InternalIPInterfaceAddressPrefix -- NAT subnet prefix describes both the NAT Gateway IP prefix from above as well as the NAT Subnet Prefix Length from above.

    La forme générique est a.b.c.0/Longueur du préfixe de sous-réseau NATThe generic form will be a.b.c.0/NAT Subnet Prefix Length

    Conformément à ce qui précède, pour cet exemple, nous utiliserons 192.168.0.0/24From the above, for this example, we'll use 192.168.0.0/24

Pour notre exemple, exécutez la commande suivante pour configurer le réseau NAT :For our example, run the following to setup the NAT network:

New-NetNat -Name MyNATnetwork -InternalIPInterfaceAddressPrefix 192.168.0.0/24

Félicitations !Congratulations! Vous avez maintenant un réseau NAT virtuel !You now have a virtual NAT network! Pour ajouter une machine virtuelle, pour le réseau NAT, suivez ces instructions.To add a virtual machine, to the NAT network follow these instructions.

Connecter une machine virtuelleConnect a virtual machine

Pour connecter une machine virtuelle à votre nouveau réseau NAT, connectez le commutateur interne que vous avez créé à la première étape de la section de configuration d’un réseau NAT à votre machine virtuelle à l’aide du menu Paramètres de la machine virtuelle.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.

Étant donné que WinNAT par lui-même ne peut pas allouer ni affecter des adresses IP à un point de terminaison (par exemple, une machine virtuelle), vous devez le faire manuellement à partir de la machine virtuelle elle-même, autrement dit définir une adresse IP dans la plage de préfixe interne NAT, définir une adresse IP de passerelle par défaut et définir des informations sur le serveur DNS.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. Vous devez être attentif quand le point de terminaison est associé à un conteneur.The only caveat to this is when the endpoint is attached to a container. Dans ce cas, le service HNS (Host Network Service) alloue et utilise le service HCS (Host Compute Service) pour affecter l’adresse IP, l’adresse IP de passerelle et les informations DNS directement au conteneur.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.

Exemple de configuration : Association de machines virtuelles et de conteneurs à un réseau NATConfiguration Example: Attaching VMs and Containers to a NAT network

Si vous devez attacher plusieurs machines virtuelles et conteneurs à un seul NAT, vous devez vous assurer que le préfixe de sous-réseau interne NAT est suffisamment grand pour englober les plages d’adresses IP assignées par des applications ou services différents (par exemple, Docker pour Windows et le conteneur Windows). HNS). Cela nécessite l’affectation d’adresses IP et la configuration réseau ou la configuration manuelle au niveau de l’application, ce qui doit être effectué par un administrateur et garantissant la non-réutilisation des attributions d’adresses IP existantes sur le même hôte.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 pour Windows (machine virtuelle Linux) et conteneurs WindowsDocker for Windows (Linux VM) and Windows Containers

La solution ci-dessous permet à la fois à Docker pour Windows (machine virtuelle Linux exécutant des conteneurs Linux) et aux conteneurs Windows de partager la même instance WinNAT à l’aide de commutateurs virtuels internes distincts.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. La connectivité entre les conteneurs Windows et Linux fonctionne.Connectivity between both Linux and Windows containers will work.

L’utilisateur a connecté des machines virtuelles à un réseau NAT via un commutateur virtuel interne nommé « VMNAT » et veut maintenant installer la fonctionnalité de conteneur Windows avec le moteur DockerUser 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

Le dockr/HNS attribuera des adresses IP à des conteneurs Windows et l’administrateur attribuera des adresses IP aux machines virtuelles à partir de l’ensemble de différences des deux.Docker/HNS will assign IPs to Windows containers and Admin will assign IPs to VMs from the difference set of the two.

L’utilisateur a installé la fonctionnalité de conteneur Windows avec le moteur Docker en cours d’exécution et veut maintenant connecter les machines virtuelles au réseau NATUser 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

Le dockr/HNS attribuera des adresses IP à des conteneurs Windows et l’administrateur attribuera des adresses IP aux machines virtuelles à partir de l’ensemble de différences des deux.Docker/HNS will assign IPs to Windows containers and Admin will assign IPs to VMs from the difference set of the two.

Au final, vous devez disposer de deux commutateurs de machine virtuelle internes et d’un réseau NAT partagé entre eux.In the end, you should have two internal VM switches and one NetNat shared between them.

Plusieurs applications utilisant la même NATMultiple Applications using the same NAT

Certains scénarios exigent que plusieurs applications ou services utilisent la même NAT.Some scenarios require multiple applications or services to use the same NAT. Dans ce cas, le workflow suivant doit être suivi afin que plusieurs applications/services puissent utiliser un préfixe de sous-réseau interne NAT plus grandIn this case, the following workflow must be followed so that multiple applications / services can use a larger NAT internal subnet prefix

Nous allons détailler la version bêta de Windows-Dockr bêta 4 de la machine virtuelle Linux coexistante avec la fonctionnalité de conteneur Windows sur le même hôte comme exemple. Ce flux de travail est susceptible de changerWe 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. Arrêter la machine virtuelle Docker4Windows MobyLinuxStop 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
    Supprime tous les réseaux de conteneurs précédemment existants (c.-à-d. supprime vSwitch, supprime NetNat, nettoie)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 (ce sous-réseau sera utilisé pour la fonctionnalité de conteneurs Windows) Crée un commutateur virtuel interne nommé natNew-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
    Crée un réseau NAT nommé « NAT » avec le préfixe IP 10.0.76.0/24Creates NAT network named “nat” with IP prefix 10.0.76.0/24

  6. Remove-NetNATRemove-NetNAT
    Suppression des réseaux NAT DockerNAT et NAT (conserve les commutateurs virtuels internes)Removes both DockerNAT and nat NAT networks (keeps internal vSwitches)

  7. New-NetNat -Name DockerNAT -InternalIPInterfaceAddressPrefix 10.0.0.0/17 (cela crée un réseau NAT plus large à partager entre D4W et les conteneurs)New-NetNat -Name DockerNAT -InternalIPInterfaceAddressPrefix 10.0.0.0/17 (this will create a larger NAT network for both D4W and containers to share)
    Crée un réseau NAT nommé DockerNAT avec un plus grand préfixe 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)
    Crée un DockerNAT vSwitch interneCreates internal vSwitch DockerNAT
    Crée un réseau NAT nommé « DockerNAT » avec le préfixe IP 10.0.75.0/24Creates NAT network named “DockerNAT” with IP prefix 10.0.75.0/24

  9. Net start dockerNet start docker
    L’ancrage utilise le réseau NAT défini par l’utilisateur comme paramètre par défaut pour connecter les conteneurs WindowsDocker will use the user-defined NAT network as the default to connect Windows containers

Au final, vous devez avoir deux commutateurs virtuels internes : l’un nommé DockerNAT et l’autre nommé nat.In the end, you should have two internal vSwitches – one named DockerNAT and the other named nat. Vous avez un seul réseau NAT (10.0.0.0/17), ce que vous avez vérifié en exécutant la commande Get-NetNat.You will only have one NAT network (10.0.0.0/17) confirmed by running Get-NetNat. Les adresses IP des conteneurs Windows seront affectées par le service de réseau hôte (HNS, Host Network Service) Windows à partir du sous-réseau 10.0.76.0/24.IP addresses for Windows containers will be assigned by the Windows Host Network Service (HNS) from the 10.0.76.0/24 subnet. Basées sur le script MobyLinux.ps1 existant, les adresses IP pour Windows Docker 4 seront affectées à partir du sous-réseau 10.0.75.0/24.Based on the existing MobyLinux.ps1 script, IP addresses for Docker 4 Windows will be assigned from the 10.0.75.0/24 subnet.

Résolution des problèmesTroubleshooting

Les réseaux NAT multiples ne sont pas pris en chargeMultiple NAT networks are not supported

Ce guide suppose qu’il n’y a pas d’autre NAT sur l’hôte.This guide assumes that there are no other NATs on the host. Toutefois, les applications ou services qui nécessitent l’utilisation d’un NAT peuvent en créer un au moment de l’installation.However, applications or services will require the use of a NAT and may create one as part of setup. Étant donné que Windows (WinNAT) ne prend en charge qu’un seul préfixe de sous-réseau NAT interne, si vous essayez de créer plusieurs NAT, le système est placé dans un état inconnu.Since Windows (WinNAT) only supports one internal NAT subnet prefix, trying to create multiple NATs will place the system into an unknown state.

Pour voir si c’est le problème, vérifiez que vous avez un seul NAT :To see if this may be the problem, make sure you only have one NAT:

Get-NetNat

Si un NAT existe déjà, supprimez-le.If a NAT already exists, delete it

Get-NetNat | Remove-NetNat

Vérifiez que vous avez uniquement un commutateur de machine virtuelle « interne » pour l’application ou la fonctionnalité (par exemple, des conteneurs Windows).Make sure you only have one “internal” vmSwitch for the application or feature (e.g. Windows containers). Enregistrez le nom du commutateur virtuelRecord the name of the vSwitch

Get-VMSwitch

Vérifiez s’il existe des adresses IP privées (par exemple, l’adresse IP de la passerelle par défaut NAT, généralement *.1) de l’ancien NAT toujours affectées à un adaptateurCheck 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>)"

Si une ancienne adresse IP privée est en cours d’utilisation, supprimez-laIf an old private IP address is in use, please delete it

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

Suppression de plusieurs NATRemoving Multiple NATs
Nous avons vu des rapports concernant plusieurs réseaux NAT créés par inadvertance.We have seen reports of multiple NAT networks created inadvertently. Cela est dû à un bogue dans les builds récentes (notamment Windows Server 2016 Technical Preview 5 et 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). Si vous voyez plusieurs réseaux NAT après avoir exécuté docker network ls ou Get-ContainerNetwork, exécutez ce qui suit à partir d’une invite PowerShell avec élévation des privilèges :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 

Consultez ce guide d’installation concernant l’utilisation du même NAT par plusieurs applications pour recréer votre environnement NAT, si nécessaire.See this setup guide for multiple applications using the same NAT to rebuild your NAT environment, if necessary.

RéférencesReferences

En savoir plus sur les réseaux NATRead more about NAT networks