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 permiten la traducción de direcciones de red nativas (NAT) para 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, está limitado a una red NAT por host. Para obtener más información sobre la implementación, las funcionalidades y las limitaciones de Windows NAT (WinNAT), consulte el blog sobre las limitaciones y las funcionalidades de WinNAT.
Introducción a NAT
NAT proporciona a una máquina virtual acceso a los recursos de red mediante la dirección IP del equipo host y un puerto a través de un conmutador virtual de Hyper-V interno.
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, las redes NAT son muy comunes para la tecnología de contenedores (consulte Redes de contenedores).
Creación de una red virtual NAT
Veamos cómo configurar una nueva red NAT.
Abra una consola de PowerShell como administrador.
Cree un interruptor interno.
New-VMSwitch -SwitchName "SwitchName" -SwitchType InternalBusque 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 MbpsEl conmutador interno tiene un nombre como
vEthernet (SwitchName)y una descripción de interfaz deHyper-V Virtual Ethernet Adapter. Tome nota de suifIndexen el paso siguiente.Configure la puerta de enlace NAT mediante 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 va a usar como ip de puerta de enlace NAT.
La forma genérica es a.b.c.1 (por ejemplo, 172.16.0.1). Aunque la posición final no tiene que ser .1, normalmente se basa en la longitud del 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 oscilan entre 24 y 12, en función del número de direcciones IP que se deben asociar a nat.
Un PrefixLength común es 24: se trata de una máscara de subred de 255.255.255.0
InterfaceIndex: ifIndex es el índice de interfaz del conmutador virtual, que determinó en el paso anterior.
Ejecute lo siguiente para crear la puerta de enlace NAT:
New-NetIPAddress -IPAddress 192.168.0.1 -PrefixLength 24 -InterfaceIndex 24Configure la red NAT mediante New-NetNat.
Este es el comando genérico:
New-NetNat -Name <NATOutsideName> -InternalIPInterfaceAddressPrefix <NAT subnet prefix>Para configurar la puerta de enlace, deberá proporcionar información sobre la red y la puerta de enlace NAT:
Nombre : NATOutsideName describe el nombre de la red NAT. Lo usará para quitar la red NAT.
InternalIPInterfaceAddressPrefix: el prefijo de subred NAT describe tanto el prefijo IP de la puerta de enlace NAT 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 NAT virtual.
Conexión de 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. La única advertencia a esto es cuando el punto de conexión está asociado a un contenedor. En este caso, el Host Network Service (HNS) asigna y usa el Host Compute Service (HCS) para asignar la dirección IP, la dirección IP del gateway y la información DNS al contenedor directamente.
Ejemplo de configuración: Asociación de máquinas virtuales y contenedores a una red NAT
Si necesita conectar varias máquinas virtuales y contenedores a una sola NAT, deberá asegurarse de que el prefijo de subred interna nat es lo suficientemente grande como para abarcar los intervalos IP asignados por diferentes aplicaciones o servicios (por ejemplo, Docker para Windows y contenedor de Windows : HNS). Esto requiere la asignación de direcciones IP y configuración de red a nivel de aplicación, o bien una configuración manual que debe realizar un administrador, garantizando que no se vuelvan a usar las asignaciones de IP existentes en el mismo host.
Docker para Windows (VM 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 vSwitch interno denominado "VMNAT" y ahora quiere instalar la característica 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 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 requieren varias aplicaciones o servicios para usar la misma NAT. En este caso, se debe seguir el siguiente flujo de trabajo para que múltiples aplicaciones / servicios puedan usar un prefijo de subred interna NAT mayor.
Vamos a detallar la coexistencia de Docker 4 Windows - Docker Beta - máquina virtual Linux con la característica de Contenedor de Windows en el mismo host como ejemplo. Este flujo de trabajo podría cambiar
-
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-NetNatCree 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/24Elimina tanto las redes DockerNAT como las redes de NAT (mantiene los vSwitches internos).
Remove-NetNATCree una red NAT llamada DockerNAT con un prefijo mayor de 10.0.0.0/17 para que tanto D4W como los contenedores puedan compartirla.
New-NetNat -Name DockerNAT -InternalIPInterfaceAddressPrefix 10.0.0.0/17Ejecución de 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 se llama 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 supone que no hay otras 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 ver si esto puede ser 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 vmSwitch "interno" para la aplicación o característica (por ejemplo, contenedores de Windows). Registre el nombre del vSwitch:
Get-VMSwitch
Compruebe si hay direcciones IP privadas (por ejemplo, dirección IP predeterminada de puerta de enlace NAT, normalmente x).y. z.1) de la NAT antigua todavía asignada a un adaptador:
Get-NetIPAddress -InterfaceAlias "vEthernet (<name of vSwitch>)"
Si está en uso una dirección IP privada antigua, elimínela:
Remove-NetIPAddress -InterfaceAlias "vEthernet (<name of vSwitch>)" -IPAddress <IPAddress>
Eliminación de varias NAT Hemos visto informes de varias 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
Reinicie el sistema operativo antes de ejecutar los comandos siguientes (Restart-Computer)
Get-NetNat | Remove-NetNat
Set-Service docker -StartupType Automatic
Start-Service docker