Esta entrada trata de la creación de un switch virtual para máquinas virtuales Hyper-V o Containers con la funcionalidad de red con NAT interno sobre el sistema operativo Windows Server 2016 Technical Preview 5 y/o Windows 10 build 14295 o superior.
Una de las cosas que le faltaba, a mi entender, al hipervisor de Microsoft era precisamente poder hacer un NAT de una red interna a una externa sin inventos de máquinas virtuales de Routing (como puede ser VyOS). Digo le faltaba, porque este problema se ha acabado con la incorporación de esta tecnología al sistema operativo.
Si bien en la versión Microsoft Windows Server 2016 Technical Preview 4 ya se dejó entrever, con la TP5 ha cambiado mucho la forma de implementarlo, facilitando su uso. Vamos a ver como lo hacemos.
Configuración del switch virtual con NAT interno
En el servidor anfitrión donde crear el switch virtual, iniciar una sesión de PowerShell con privilegios de administrador, como no. Crear un nuevo switch virtual (por ejemplo, swNAT) del tipo interno:
New-VMSwitch -SwitchName "swNAT" -SwitchType Internal
El siguiente paso es crear una puerta de enlace para la red de NAT, ubicada en este switch virtual que acabamos de crear. Esta IP es la que deben utilizar las máquinas virtuales que se ubiquen en la red interna para poder comunicarse con el exterior mediante la red con NAT. Para hacerlo, primero hay que averiguar que adaptador corresponde al nuevo switch:
Get-NetAdapter
Anotar el ifIndex (en el ejemplo el número 16) del switch que se ha creado para utilizarlo en la red de NAT interno.

Asignarle la dirección IP que se quiere utilizar como puerta de enlace (por ejemplo la 192.168.254.1/24).
New-NetIPAddress -IPAddress 192.168.254.1 -PrefixLength 24 -InterfaceIndex 16
Para configurar la red de NAT se debe proporcionar un nombre a la red y indicar el direccionamiento IP. Siguiendo el ejemplo anterior, el nombre de la red de NAT interno sería netNAT y la red correspondría a la 192.168.254.0/24. El comando para crear la red de NAT interno:
New-NetNat -Name netNAT -InternalIPInterfaceAddressPrefix 192.168.254.0/24
Ya tenemos el switch de NAT interno creado, ahora sólo hay que conectar las máquinas virtuales.

Conectar la máquina virtual a la red de NAT interno
Para comprobar la existencia, y asignación, de máquinas virtuales al nuevo switch, iniciar el administrador de Hyper-V. Seleccionar el nodo de Hyper-V donde se ha creado el nuevo switch. Botón derecho sobre el nodo, o bien el panel de acciones de la derecha, hacer clic en Configuración del Switch Virtual.

No se observa ningún cambio extraño o diferente al de un switch interno de toda la vida, que aísla las máquinas virtuales del anfitrión y la red externa. Hacer clic en el botón OK para cerrar.

Conectar una máquina virtual a este nuevo switch. En la configuración de la máquina virtual, en el apartado de adaptadores de red, seleccionar el switch donde se asignará la red con NAT interno y hacer clic en el botón OK.

Comprobar la tarjeta de red de la máquina virtual, botón derecho sobre el símbolo de la red ubicado a la derecha, en la barra de tareas, y hacer clic en Abrir las Redes…

Hacer clic en la tarjeta de red para ver sus propiedades.

Si se hace clic sobre el botón Detalles se puede ver que la máquina ha cogido una dirección APIPA (169.254.x.x). Esto es normal debido a que NO hay ningún servidor DHCP que ofrezca direcciones IP en esta subred. Hacer clic en el botón Cerrar para volver a la configuración de la tarjeta de red.

Hacer clic en el botón Propiedades para asignar una dirección IP estática a la máquina virtual. Seleccionar Protocolo de Internet versión 4 y hacer clic en el botón Propiedades.

Indicar una dirección IP de la subred de NAT interno, que no esté repetida, claro. Por ejemplo: 192.168.254.2 con la máscara de la subred: 255.255.255.0 y ¿la puerta de enlace? Como puerta de enlace le corresponde la dirección IP que se ha asignado a la red de NAT interno al anfitrión, si se ha seguido el ejemplo, esta dirección es la 192.168.254.1. Asignar unos DNS externos para resolver direcciones y hacer clic en el botón OK para aplicar los cambios.

Abrir una consola de sistema para comprobar la conectividad con el ping en la puerta de enlace:
ping 192.168.254.1
No os asustéis, no contesta, y parece ser que es normal al no tener ningún servicio asociado. Haced la prueba con una dirección externa. Esta si que responde correctamente, dando por configurada la red de NAT hacia el exterior.

Publicar al exterior servicios de máquinas virtuales internas de la red con NAT interno
De acuerdo, sí, tenemos una máquina virtual conectada a al red con NAT interno que se le ha desplegado el servicio web de IIS (puerto TCP 80). Desde la propia máquina no hay ningún inconveniente en acceder al sitio web desde un navegador conectando a la dirección localhost:

Desde el anfitrión tampoco hay problema accediendo a la IP de la red interna del servidor web, porque conoce esta red interna ya que tiene una dirección IP (la puerta de enlace):

¿Pero y desde el exterior del anfitrión? ¿Como comunicamos con el servicio que ofrece una máquina virtual dentro de la red con NAT interno? Pues haciendo una publicación de puertos sobre el anfitrión, pura y dura.
En el anfitrión, donde se ha configurado el switch con NAT interno, abrir una consola de PowerShell con privilegios de administrador. Comprobar que dispone y que nombre tiene la red de NAT interno:
Get-NetNat
También necesitamos saber si ya dispone de reglas de publicación de puertos para no sobreescribirse:
Get-NetNatStaticMapping
Crear la nueva regla para publicar el puerto 80 contra la IP de la máquina virtual situada en la red de NAT interno (netNAT – corresponde al nombre de la red de NAT obtenida a,b Get-NetNat):
Add-NetNatStaticMapping -NatName “netNAT” -Protocol TCP -ExternalIPAddress 0.0.0.0 -InternalIPAddress 192.168.254.2 -ExternalPort 80 -InternalPort 80
Se crea la regla que se puede validar su existencia con el comando:
Get-NetNatStaticMapping
Ahora, si se accede desde un equipo de la red externa a la IP del anfitrión (en el ejemplo 192.168.1.183) aparece la web del servidor ubicado en la red con NAT interno.

Recordad que sólo podéis publicar cada puerto una sola vez contra una IP. No puedo hacer un NAT del puerto 80 contra una IP interna y a la vez contra otra IP interna (es cuando se requieren los proxys reversos). Tan bien que no se puede acceder directamente a la red interna, si no que se debe hacer contra el anfitrión. La red interna no está encaminada, queda enmascarada (escondida del exterior).
Borrando la red con NAT interno
Os dejo cuatro comandos sencillos para deshacer lo que hemos hecho, por si alguna vez los necesitáis.
Borrar la publicación de un puerto por NAT
Antes de borrarla, se tiene que saber que se borra, claro. Si tenemos más de una, ¿cuál es la correcta? Las reglas de NAT se pueden filtrar con el StaticMapping ID, en mi caso selecciono la regla número 1 de la red de NAT netNAT:
Get-NetNatStaticMapping -NatName netNAT | Where {$_.StaticMappingID -eq 1}
Se le pasa el comando Remove-NetNatStaticMapping para borrar la regla de NAT concreta:
Get-NetNatStaticMapping -NatName netNAT | Where {$_.StaticMappingID -eq 1} | remove-NetNatStaticMapping
Borrar la red NAT interno
Para no dejar objetos huérfanos, que después no sabemos de donde han salido, recomiendo primero borrar la IP de puerta de enlace del equipo anfitrión. Averiguar el ifIndex del adaptador del switch que se utiliza para la red con NAT interno:
Get-NetAdapter
Comprobar que el adaptador tiene la IP que se quiere borrar indicando el ifIndex obtenido con el comando anterior:
Get-NetIpAddress -ifIndex NUMERO
Proceder a borrar todas las direcciones IP del adaptador (por ejemplo con el ifIndex 16):
Get-NetIpAddress -ifIndex 16 | remove-netIpAddress
Borrar la red con NAT interno. Recuperar el nombre de las redes NAT y borrarla:
Get-NetNat -name netNat | remove-NetNat
¡Ya no tenéis excusa para configurar vuestros entornos de pruebas en Windows 10 con redes internas!
¿Te ha gustado el artículo? Lo puedes compartir en las redes sociales. También puedes dejar tu opinión, comentario o sugerencia. ¡Gracias!
Similar Posts by The Author:
- Microsoft SQL Server con SMB3
- Microsoft SQL Server amb SMB3
- Containers en Linux
- Containers amb Linux
- Migrar el servidor de archivos a Windows Server 2019
- Migrar el servidor de fitxers a Windows Server 2019
- Puerta enlace a Azure en el Windows Admin Center
- Porta enllaç a Azure en el Windows Admin Center
- Hola mundo! WordPress 5 y Gutenberg
- Hola món! WordPress 5 i Gutenberg
Buen dia, tengo una consulta, al habilitar Hyper-V en windwos 10, me crea por defecto una red internet NAT, la cual e intentado borrarla pero me sale el error de que no se encuentra la red con dicho nombre, podrias tal vez ayudarme, gracias.
El hecho de habilitar Hyper-V en el equipo implica que el equipo pasa a ser virtual i que ya no connecta directamente con la tarjeta de red física, en su lugar se crea una de virtual, como la que comentas, que hace de puente. Para el NAT también utiliza esta tecnologia de virtualización de redes para actuar como un router virtual. Es de la propia arquitectura del sistema y, a priori, no la puedes borrar.
Muchas gracias por el tutoríal y por su tiempo dedicado en el.
Hola Josep, gracias por el post. Lo he seguido al pie de la letra pero llevo luchando contra el rocoso muro de Powershell algo más de cuatro horas y no consigo flanquearlo.
El origen del problema es que al intentar crear la red Nat con New-NetNat me dice que el parámetro «-InternalIPInterfaceAddressPrefix» no es válido. He verificado la sintaxis repetidamente y no hay manera.
Estoy trabajando con un 2012 Server en modo Core. Lo primero que he intentado sin éxito es actualizar el módulo NetNat por si era esto. Me he encontrado con todo tipo de contratiempos con los que no quiero aburrir al personal, pero no lo he conseguido.