Partager via


Configurer un réseau NAT

Hyper-V sur Windows 10 et Windows 11 permet la traduction d’adresses réseau (NAT) natives pour un réseau virtuel.

Ce guide vous guide tout au long des procédures suivantes :

  • Créer un réseau NAT
  • Connecter une machine virtuelle existante à votre nouveau réseau
  • Vérifiez que la machine virtuelle est correctement connectée

Conditions requises :

  • Mise à jour anniversaire Windows 10 ou ultérieur
  • Hyper-V est activé. Consultez les instructions pour Activer Hyper-V

Remarque

Pour le moment, vous êtes limité à un réseau NAT par hôte. Pour plus d’informations sur l’implémentation, les fonctionnalités et les limitations de Windows NAT, consultez le blog sur les capacités et les limitations de WinNAT

Vue d’ensemble de NAT

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.

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. En fait, une NAT utilise une table de flux pour acheminer le trafic d’une adresse IP externe (hôte) et d’un numéro de port vers l’adresse IP interne correcte associée à un point de terminaison sur le réseau (machine virtuelle, ordinateur, conteneur, etc.).

En outre, NAT permet à plusieurs machines virtuelles d’héberger des applications qui nécessitent des ports de communication (internes) identiques en les mappant à des ports externes uniques.

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).

Créer un réseau virtuel NAT

Examinons la configuration d’un nouveau réseau NAT.

  1. Ouvrez une console PowerShell en tant qu’administrateur.

  2. Créez un commutateur interne.

    New-VMSwitch -SwitchName "SwitchName" -SwitchType Internal
    
  3. Recherchez l’index d’interface du commutateur virtuel que vous venez de créer.

    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
    
    

    Le commutateur interne a un nom tel que vEthernet (SwitchName) et une description de l’interface de Hyper-V Virtual Ethernet Adapter. Notez son ifIndex afin de l’utiliser dans l’étape suivante.

  4. Configurez la passerelle NAT à l’aide de New-NetIPAddress.

    Voici la commande générique :

    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 :

    • 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.

    Le formulaire générique est a.b.c.1 (par exemple, 172.16.0.1). Si la dernière position n’a pas à être.1, c’est généralement le cas (sur la base de la longueur de préfixe). Cette adresse IP se trouve dans la plage d’adresses utilisées par les machines virtuelles invitées. Par exemple, si les machines virtuelles invitées utilisent la plage d’adresses IP 172.16.0.0, vous pouvez utiliser une adresse IP 172.16.0.100 comme passerelle NAT. Une adresse IP de passerelle courante est 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). La longueur du préfixe de sous-réseau est une valeur entière comprise entre 0 et 32.

      0 mappe la totalité d’Internet, 32 n’autorise qu’une adresse IP mappée. Les valeurs courantes sont comprises entre 24 et 12 en fonction du nombre d’adresses IP devant être attachées à NAT.

      24 est une valeur PrefixLength courante : il s’agit d’un masque de sous-réseau 255.255.255.0

    • InterfaceIndex --ifIndex est l’index d’interface du commutateur virtuel défini à l’étape précédente.

    Exécutez la commande suivante pour créer une passerelle NAT :

    New-NetIPAddress -IPAddress 192.168.0.1 -PrefixLength 24 -InterfaceIndex 24
    
  5. Configurez le réseau NAT à l’aide de New-NetNat.

    Voici la commande générique :

    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 :

    • Name : NATOutsideName décrit le nom du réseau NAT. Cette valeur permet de supprimer le réseau NAT.

    • InternalIPInterfaceAddressPrefix -- Le préfixe de sous-réseau NAT décrit à la fois le préfixe IP de la passerelle NAT et la longueur du préfixe de sous-réseau NAT.

    La forme générique est a.b.c.0/Longueur de Préfixe de Sous-réseau NAT

    Pour cet exemple, nous allons utiliser 192.168.0.0/24

    Exécutez ce qui suit pour configurer le réseau NAT :

    New-NetNat -Name MyNATnetwork -InternalIPInterfaceAddressPrefix 192.168.0.0/24
    

Félicitations ! Vous avez maintenant un réseau NAT virtuel !

Connecter une machine virtuelle

Pour connecter une machine virtuelle à votre nouveau réseau NAT, connectez le commutateur interne que vous avez créé à la première étape de cet article à votre machine virtuelle à l’aide du menu Paramètres de la machine virtuelle.

Étant donné que WinNAT n’alloue pas et n’affecte pas d’adresses IP à un point de terminaison (par exemple, une machine virtuelle), vous devez le faire manuellement à partir de la machine virtuelle elle-même , c’est-à-dire définir une adresse IP dans la plage de préfixe interne NAT, définir l’adresse IP de passerelle par défaut, définir les informations du serveur DNS. Vous devez être attentif quand le point de terminaison est associé à un conteneur. 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.

Exemple de configuration : Association de machines virtuelles et de conteneurs à un réseau NAT

Si vous devez associer plusieurs machines virtuelles et conteneurs à un seul réseau NAT, vous devrez vous assurer que le préfixe de sous-réseau interne NAT est suffisamment important pour englober les plages IP affectées par différents services ou applications (par exemple, Docker pour Windows et conteneur Windows – HNS). Cela nécessite l’affectation au niveau de l’application des adresses IP et de la configuration réseau ou une configuration manuelle qui doit être effectuée par un administrateur et garantie de ne pas réutiliser les affectations IP existantes sur le même hôte.

Docker pour Windows (machine virtuelle Linux) et conteneurs Windows

Suivez cette section pour autoriser Docker pour Windows (machine virtuelle Linux exécutant des conteneurs Linux) et les conteneurs Windows à partager la même instance WinNAT à l’aide de commutateurs virtuels internes distincts. La connectivité entre les conteneurs Linux et Windows fonctionne.

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 Docker :

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 affecte des adresses IP aux conteneurs Windows et Admin affecte des adresses IP aux machines virtuelles à partir du jeu de différences des deux.

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 NAT :

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 affecte des adresses IP aux conteneurs Windows et Admin affecte des adresses IP aux machines virtuelles à partir du jeu de différences des deux.

À la fin, vous aurez deux commutateurs de machine virtuelle internes et un NetNat partagé entre eux.

Plusieurs applications utilisant la même NAT

Certains scénarios exigent que plusieurs applications ou services utilisent la même 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 grand

Nous allons détailler la fonctionnalité Docker 4 Windows - Docker Beta - Machine virtuelle Linux co-existante avec la fonctionnalité conteneur Windows sur le même hôte qu’un exemple. Ce flux de travail est soumis à des modifications

  1.  net stop docker
    
  2.  Stop Docker4Windows MobyLinux VM
    
  3.  Get-ContainerNetwork | Remove-ContainerNetwork -force
    
  4. Supprimez les réseaux de conteneurs existants (c’est-à-dire supprime vSwitch, supprime NetNat, nettoie).

     Get-NetNat | Remove-NetNat
    
  5. Créez un commutateur virtuel interne nommé nat et un réseau NAT avec le préfixe IP 10.0.76.0/24.

     New-ContainerNetwork -Name nat -Mode NAT –subnetprefix 10.0.76.0/24
    
  6. Supprimez les réseaux NAT DockerNAT et NAT (conserve les commutateurs virtuels internes).

     Remove-NetNAT
    
  7. Créez un réseau NAT nommé DockerNAT avec un préfixe plus grand 10.0.0.0/17 pour que D4W et les conteneurs le partagent.

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

  9. Utilisez le réseau NAT défini par l’utilisateur comme étant la valeur par défaut pour connecter des conteneurs Windows.

     Net start docker
    

À la fin, vous avez deux commutateurs virtuels internes : un nommé DockerNAT et l’autre nommé nat. Vous n’avez qu’un seul réseau NAT (10.0.0.0/17) confirmé en exécutant Get-NetNat. Les adresses IP des conteneurs Windows sont affectées par le service de réseau hôte Windows (HNS) à partir du sous-réseau 10.0.76.0/24. En fonction du script MobyLinux.ps1 existant, les adresses IP pour Docker 4 Windows sont affectées à partir du sous-réseau 10.0.75.0/24.

Dépannage

Les réseaux NAT multiples ne sont pas pris en charge

Ce guide suppose qu’il n’y a pas d’autre NAT sur l’hôte. Toutefois, les applications ou services nécessitent l’utilisation d’un NAT et peuvent en créer un dans le cadre de la configuration. Étant donné que Windows (WinNAT) ne prend en charge qu’un seul préfixe de sous-réseau NAT interne, tenter de créer plusieurs NATs place le système dans un état inconnu.

Pour voir si c’est le problème, vérifiez que vous avez un seul NAT :

Get-NetNat

Si un NAT existe déjà, supprimez-le :

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). Enregistrez le nom du commutateur virtuel :

Get-VMSwitch

Vérifiez s'il existe des adresses IP privées (par exemple, l'adresse IP de la passerelle NAT par défaut ; généralement x.y.z.1) de l'ancienne NAT toujours affectées à un adaptateur :

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

Si une ancienne adresse IP privée est en cours d’utilisation, supprimez-la :

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

Suppression de plusieurs réseaux NAT Nous avons vu des rapports sur plusieurs réseaux NAT créés par inadvertance. Si vous voyez plusieurs réseaux NAT, après avoir exécuté docker network ls ou Get-ContainerNetwork, procédez comme suit à partir d’une instance PowerShell avec élévation de privilèges :

$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

Redémarrez le système d'exploitation avant d'exécuter les commandes suivantes (Restart-Computer)

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