Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Windows 10 y Windows 11 Hyper-V permite la traducción de direcciones de red (NAT) nativa de una red virtual.
En esta guía se explica cómo:
- Creación de una red NAT
- Conexión de una máquina virtual existente a la nueva red
- Confirmación de que la máquina virtual está conectada correctamente
Requisitos:
- Actualización de aniversario de Windows 10 o posterior.
- Hyper-V está habilitado. Siga las instrucciones para Habilitar Hyper-V
Nota:
Actualmente, hay una limitación de una red NAT por cada host. Para obtener más información sobre la implementación, las funcionalidades y las limitaciones de Windows NAT (WinNAT), consulte el blog funcionalidades y limitaciones de WinNAT
Información general sobre NAT
NAT proporciona a una máquina virtual acceso a los recursos de red con la dirección IP y un puerto del equipo host a través de un conmutador virtual de Hyper-V.
La traducción de direcciones de red (NAT) es un modo de red diseñado para conservar las direcciones IP mediante la asignación de una dirección IP externa y un puerto a un conjunto mucho mayor de direcciones IP internas. Básicamente, una NAT usa una tabla de flujo para enrutar el tráfico desde una dirección IP externa (host) y un número de puerto a la dirección IP interna correcta asociada a un punto de conexión en la red (máquina virtual, equipo, contenedor, etc.).
Además, NAT permite que varias máquinas virtuales hospeden aplicaciones que requieren puertos de comunicación idénticos (internos) mediante la asignación de estos a puertos externos únicos.
Por todas estas razones, la red NAT es muy común para la tecnología de contenedores (consulte Red de contenedores).
Creación de una red virtual NAT
Pasemos a la configuración de una nueva red NAT.
Abra una consola de PowerShell como administrador.
Cree un conmutador interno.
New-VMSwitch -SwitchName "SwitchName" -SwitchType Internal
Busca el índice de interfaz del conmutador virtual que acaba de crear.
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
El interruptor interno tiene un nombre como
vEthernet (SwitchName)
y una Descripción de la Interfaz deHyper-V Virtual Ethernet Adapter
. Anote suifIndex
para usarlo en el siguiente paso.Configure la puerta de enlace NAT con New-NetIPAddress.
Este es el comando genérico:
New-NetIPAddress -IPAddress <NAT Gateway IP> -PrefixLength <NAT Subnet Prefix Length> -InterfaceIndex <ifIndex>
Para configurar la puerta de enlace, necesitará un poco de información sobre la red:
- IPAddress: la dirección IP de puerta de enlace NAT especifica la dirección IPv4 o IPv6 que se usará como dirección IP de puerta de enlace NAT.
La forma genérica es a.b.c.1 (por ejemplo, 172.16.0.1). Si bien no es necesario que la posición final sea .1, habitualmente sí lo es (según la longitud de prefijo). Esta dirección IP está en el intervalo de direcciones que usan las máquinas virtuales invitadas. Por ejemplo, si las máquinas virtuales invitadas usan el intervalo IP 172.16.0.0, puede usar una dirección IP 172.16.0.100 como puerta de enlace NAT. Una dirección IP de puerta de enlace común es 192.168.0.1
PrefixLength: la longitud del prefijo de subred NAT define el tamaño de la subred local NAT (máscara de subred). La longitud del prefijo de subred es un valor entero entre 0 y 32.
0 asignaría todo Internet, 32 solo permitiría una dirección IP asignada. Los valores comunes van de 24 a 12 en función de cuántas direcciones IP se deben adjuntar a NAT.
Un valor PrefixLength común es 24, es decir, una máscara de subred 255.255.255.0
InterfaceIndex: ifIndex es el índice de interfaz del conmutador virtual que has determinado en el paso anterior.
Ejecute lo siguiente para crear la puerta de enlace NAT:
New-NetIPAddress -IPAddress 192.168.0.1 -PrefixLength 24 -InterfaceIndex 24
Configure la red NAT con New-NetNat.
Este es el comando genérico:
New-NetNat -Name <NATOutsideName> -InternalIPInterfaceAddressPrefix <NAT subnet prefix>
Para configurar la puerta de enlace, debe proporcionar información sobre la red y la puerta de enlace NAT:
Name: NATOutsideName describe el nombre de la red NAT. Se usará para quitar la red NAT.
InternalIPInterfaceAddressPrefix: el prefijo de subred NAT describe tanto el prefijo IP de NAT Gateway como la longitud del prefijo de subred NAT.
El formato genérico es a.b.c.0/NAT Subnet Prefix Length
En este ejemplo, usaremos 192.168.0.0/24
Ejecute lo siguiente para configurar la red NAT:
New-NetNat -Name MyNATnetwork -InternalIPInterfaceAddressPrefix 192.168.0.0/24
Felicidades. Ahora tiene una red virtual NAT.
Conectar una máquina virtual
Para conectar una máquina virtual a la nueva red NAT, conecte el conmutador interno que creó en el primer paso de este artículo a la máquina virtual mediante el menú Configuración de la máquina virtual.
Dado que WinNAT por sí mismo no asigna y asigna direcciones IP a un punto de conexión (por ejemplo, máquina virtual), deberá hacerlo manualmente desde dentro de la propia máquina virtual, es decir, establecer la dirección IP dentro del intervalo de prefijo interno nat, establecer la dirección IP de puerta de enlace predeterminada, establecer la información del servidor DNS. El único inconveniente es cuando el punto de conexión está asociado a un contenedor. En este caso, el servicio de red de host (HNP) asigna y utiliza el servicio de proceso de host (HCS) para asignar la dirección IP, la IP de puerta de enlace y la información de DNS directamente en el contenedor.
Ejemplo de configuración: Conexión de máquinas virtuales y contenedores a una red NAT
Si necesita conectar varias máquinas virtuales y contenedores a una única red NAT, debe asegurarse de que el prefijo de subred interna NAT es lo suficientemente grande como para abarcar los intervalos IP que se asignan mediante distintas aplicaciones o servicios (por ejemplo, Docker para Windows y contenedor de Windows: HNS). Esto requiere ya sea la asignación de direcciones IP y configuración de red a nivel de aplicación o la configuración manual que debe realizar un administrador y se debe garantizar que no se vuelvan a utilizar las asignaciones de IP existentes en el mismo host.
Docker para Windows (máquina virtual Linux) y contenedores de Windows
Siga estos pasos en esta sección para permitir que Docker para Windows(vm Linux que ejecuta contenedores linux) y contenedores de Windows compartan la misma instancia de WinNAT mediante vSwitches internos independientes. La conectividad entre los contenedores de Linux y Windows funciona.
El usuario ha conectado máquinas virtuales a una red NAT a través de un conmutador virtual interno denominado "VMNAT" y ahora quiere instalar la característica de contenedor de Windows con el motor de 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 asigna direcciones IP a contenedores de Windows y el administrador asigna direcciones IP a las máquinas virtuales a partir del conjunto de diferencias de los dos.
El usuario ha instalado la característica de contenedor de Windows con el motor de Docker en ejecución y ahora quiere conectar máquinas virtuales a la red 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 asigna direcciones IP a contenedores de Windows y el administrador asigna direcciones IP a las máquinas virtuales a partir del conjunto de diferencias de los dos.
Al final, tendrá dos conmutadores internos de máquina virtual y un NetNat compartido entre ellos.
Varias aplicaciones que usan la misma NAT
Algunos escenarios exigen que varias aplicaciones o servicios usen la misma NAT. En este caso, debe seguir el siguiente flujo de trabajo para que varias aplicaciones o servicios puedan usar un prefijo de subred interna NAT mayor
Describiremos cómo la máquina virtual Linux en Docker para Windows - Docker Beta - coexiste con la funcionalidad de Contenedor de Windows en el mismo host como ejemplo. Este flujo de trabajo está sujeto a cambios
-
net stop docker
-
Stop Docker4Windows MobyLinux VM
-
Get-ContainerNetwork | Remove-ContainerNetwork -force
Quite las redes de contenedor existentes anteriormente (es decir, elimina vSwitch, elimina NetNat, limpia).
Get-NetNat | Remove-NetNat
Cree un vSwitch interno denominado nat y una red NAT con el prefijo IP 10.0.76.0/24.
New-ContainerNetwork -Name nat -Mode NAT –subnetprefix 10.0.76.0/24
Quite las redes NAT DockerNAT y Nat (mantiene instancias de vSwitches internas).
Remove-NetNAT
Cree una red NAT denominada DockerNAT con un prefijo más grande 10.0.0.0/17 para que D4W y los contenedores puedan compartir.
New-NetNat -Name DockerNAT -InternalIPInterfaceAddressPrefix 10.0.0.0/17
Ejecute Docker4Windows (MobyLinux.ps1)
Use la red NAT definida por el usuario como valor predeterminado para conectar contenedores de Windows.
Net start docker
Al final, tiene dos vSwitches internos: uno denominado DockerNAT y el otro denominado nat. Solo tiene una red NAT (10.0.0.0/17) confirmada mediante la ejecución de Get-NetNat. Las direcciones IP para los contenedores de Windows son asignadas por el servicio Windows Host Network Service (HNS) desde la subred 10.0.76.0/24. En función del script de MobyLinux.ps1 existente, las direcciones IP para Docker 4 Windows se asignan desde la subred 10.0.75.0/24.
Solución de problemas
No se admiten varias redes NAT
En esta guía se da por supuesto que no hay otras redes NAT en el host. Sin embargo, las aplicaciones o los servicios requieren el uso de una NAT y pueden crear una como parte de la instalación. Dado que Windows (WinNAT) solo admite un prefijo de subred NAT interno, al intentar crear varias NAT, el sistema se coloca en un estado desconocido.
Para comprobar si es este el problema, asegúrese de que solo tiene una NAT:
Get-NetNat
Si ya existe una NAT, elimínela:
Get-NetNat | Remove-NetNat
Asegúrese de que solo tiene un conmutador de máquina virtual "interno" para la aplicación o característica (por ejemplo, contenedores Windows). Registro del nombre del conmutador virtual:
Get-VMSwitch
Compruebe si hay direcciones IP privadas (por ejemplo, dirección IP de puerta de enlace predeterminada NAT, normalmente x.y.z.1) de la antigua NAT todavía asignadas a un adaptador:
Get-NetIPAddress -InterfaceAlias "vEthernet (<name of vSwitch>)"
Si alguna dirección IP privada antigua está en uso, elimínela:
Remove-NetIPAddress -InterfaceAlias "vEthernet (<name of vSwitch>)" -IPAddress <IPAddress>
Eliminar Múltiples NATs Hemos visto informes de múltiples redes NAT creadas involuntariamente. Si ve varias redes NAT, después de ejecutar docker network ls o Get-ContainerNetwork, realice lo siguiente desde un PowerShell con privilegios elevados:
$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
Reinicio del sistema operativo antes de ejecutar los comandos siguientes (Restart-Computer
)
Get-NetNat | Remove-NetNat
Set-Service docker -StartupType Automatic
Start-Service docker