Switch virtual con NAT interno

21 junio 2016
Josep Ma Solanes 2

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.

switch-virtual-nat-intern-001

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.

switch-virtual-nat-intern-002

 

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.

switch-virtual-nat-intern-003

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.

switch-virtual-nat-intern-004

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.

switch-virtual-nat-intern-005

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

switch-virtual-nat-intern-006

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

switch-virtual-nat-intern-007

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.

switch-virtual-nat-intern-008

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.

switch-virtual-nat-intern-009

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.

switch-virtual-nat-intern-010

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.

switch-virtual-nat-intern-011

 

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:

switch-virtual-nat-intern-012

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

switch-virtual-nat-intern-013

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

switch-virtual-nat-intern-014

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:

 

2 comentaris per a
“Switch virtual con NAT interno”

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

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

       

Deixar un comentari

Recorda que no es contestaran preguntes personals, només d´interés comú que ens enriqueixin a tots.
La teva adreça de correu electrònic no serà publicada. Els camps obligatoris estan indicats.

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.