Servidor Virtualizado con conexión NAT (VirtualBox y Windows)

————– Actualización ————–

Aunque el método usado en este artículo sigue siendo válido, con las nuevas versiones de VirtualBox ya es posible hacerlo todo desde el menu gráfico, cosa que se agradece bastante.

———————————————–

Últimamente, es bastante común montar servidores en máquinas virtuales y ese fue el caso que me ha llevado a crear este pequeño script que, en esta ocasión, es para sistemas Windows y con el conocido sistema de máquinas virtuales VIRTUALBOX.

En este mismo sistema, al igual que en muchos otros, existen varias opciones para la configuración de las tarjetas de red aunque para este caso en concreto nos centraremos en la opción por defecto y la tarjeta que, al menos antes, siempre se habilitaba por defecto, al menos en mi caso, que siempre es conexión mediante NAT y con la tarjeta PC NET.

Antes de nada diré que si ya está familiarizado con el NAT puede saltarse las siguientes lineas ya que, por si hay alguien a quien solamente «le suene» un poco o que directamente desconozca que es o como funciona, trataré de hacer una pequeña explicación.

Lo primero, como siempre es tener la maquina virtual funcionando (Evidentemente ;-)) y una vez tengamos la conexión mediante NAT, deberíamos poder conectarnos a Internet desde el sistema virtualizado sin ningún problema ni paso adicional que configurar la conexión en dicho sistema como si fuera una instalación física más, es decir, añadiendo una IP, máscara, puerta de enlace y DNS en el caso de que nos vayamos a conectar con una dirección estática o simplemente activando DHCP si tenemos algún dispositivo que nos permita una configuración de IPs dinámica. Sea cual sea el modo de conexión, nos es indiferente a la hora de montar el servidor virtualizado siempre y cuando la IP de nuestra máquina física, es decir, la que alberga la virtual tenga una IP fija o algún sistema que nos permita llamarla siempre de la misma forma aún siendo dinámica (Por ejemplo, algún sistema similar a DynDNS, NoIP de cara a internet o simplemente un router que de la posibilidad de asociar una dirección MAC a una direcc concreta de forma que aunque este configurado todo por DHCP siempre de la misma a la misma máquina ).

Se preguntará ¿¿Porque es necesario esto sobre todo cuando ya me conecto a internet?? pues bien, porque ahora mismo la máquina virtual conecta con «hacia fuera», por decirlo de alguna manera, pero no admite las peticiones que se le hagan desde la red como podrían ser las que se hacen a cualquier servidor así que es necesario realizar NAT (Network Address Translation) de forma que para acceder a este servidor virtualizado tendremos habilitar la correspondiente configuración en la maquina física que lo alberga para que al apuntar a esta (MAquina física)  nos redirija a la máquina virtual. Como explicarme nunca fue mi fuerte, vamos con los ejemplos:

Tenemos los siguiente:

Máquina VIRTUAL:
– IP: 10.0.2.15
– Servidor WEB (Puerto 80)
– Servidor SSH (Puerto 22)

Máquina FISICA (Sobre la que corre la Virtual)
– IP: 192.168.1.10

Pues en este caso de supuestos, para poder ver las WEB del servidor virtualizado tendríamos que hacerlo poniendo la IP de la máquina FISICA, es decir, esta es la dirección que tendríamos que escribir en el navegador (A falta de configurar un dominio aunque fuese local, por supuesto):
http://192.168.1.10
Y para acceder a las sesiones SSH:
ssh 192.168.1.10
Esto es debido a que, con las instrucciones que veremos a continuación habilitaremos que, el propio VIRTUALBOX, realice una redirección de los datos enviados a los puertos que digamos hacia la tarjeta de red y puerto de la máquina virtual y ahora que ya tenemos claras las nociones básicas, procedemos con lo importante.

 

.Entre las muchas cosas que incorpora VirtualBox, hay un comando llamado VBOXMANAGE.EXE desde el que se puede hacer de todo y que es, precisamente, el que utilizaremos para que nuestra máquina virtual admita conexiones desde el exterior, es decir, para que nuestro servidor funcione como lo que es. Como decia, entre las multiples funciones de VBOXMANAGE está la de configurar que las peticiones a ciertos puertos de la máquina FISICA pasen a nuestra máquina virtual.

 

A continuación muestro el comando y explico sus parámetros para esta tarea pero quizás este un poco más claro en el ejemplo que hay debajo. El comando a ejecutar es:

 

VBoxManage setextradata MAQUINA "VBoxInternal/Devices/pcnet/0/LUN#0/Config/PROCESO/"PUERTO O PROTOCOLO"" PUERTO

 

Es muy importante fijarse en que, para pasarle la orden de que escuche las peticiones en un puerto de la máquina fisica, indicamos, no solo el puerto de la máquina virtual sino que también la tarjeta de red que recibirá los datos.
VBoxInternal/Devices/pcnet/0/LUN#0/Conf...

 

Para estar seguros del nombre de la máquina sin tener que abrir el virtualbox, podremos hacer un listado de todas las máquinas virtuales que tenemos gracias, como no, al polivalente comando VBoxManage de la siguiente manera:

 

VBoxManage list vms

 

El proceso para abrir el servidor a las conexiones externas, por ejemplo las peticiones a un servidor web consiste en aplicar 3 veces el comando anterior para indicar, además de la tarjeta de red, como ya indicamos:

 

  1. Nombre de servicio y puerto de la máquina fisica
  2. Nombre del servicio y puerto de la máquina virtual
  3. Nombre del servicio y PROTOCOLO usado (Normalmente TCP)

 

De esta misma manera no estaremos obligados a usar el mismo puerto en ambas máquinas. Esto quiere decir que si, casualmente la máquina física que contiene la virtual, tuviese además un pequeño servidor WEB en el puerto 80, podríamos establecer con el anterior comando que dicha máquina reenvíe solo las peticiones, por ejemplo del puerto 8080, al 80 (Puerto estándar) de la máquina virtual. En definitiva, no hay restricción alguna respecto a los puertos salvo la de que no esté en uso.

 

Como pequeña nota, solo queda añadir que si tenemos algun sistema de FIREWALL configurado ya sea en la maquina física como en la Virtual, tendríamos que hacer los pasos pertinentes para que no bloquease el tráfico por lo puertos que haya pensado utilizar.

 

Pues bien, esa fue la teoría y ahora, el como aplicarla ya es tarea suya. Puede simplemente experimentar por su cuenta con el comando basándose esta breve explicación y, como siempre, también tiene la opción cómoda de descargarse el SCRIPT que he creado para automatizar todo el proceso. He de decir que, al menos en mi caso, es lo que estoy usando siempre gracias a la comodidad y rapidez del mismo.

 

Este Script no tiene que editarlo para cambiar puertos, protocolo o el nombres de servicio ya que se lo preguntará durante la ejecución del mismo. Eso si, funciona teniendo en cuenta que VirtualBox estará instalado en la unidad C: y el directorio por defecto, es decir:

C:\Archivos de programa\Oracle\VirtualBox

Si ese no fuera su caso, entonces si tendría que editarlo para modificar las primeras lineas, pues son las únicas que hacen referencia a dicha carpeta. Por supuesto, tambien es totalmente libre de editarlo para ver como está hecho 😉

Enlace de descarga del SCRIPT:  SCRIPT VIRTUALBOX a SERVER

Un saludo.

22 Comentarios

  1. Amigo Alvaro,solo una duda;para el caso que mencionas de que existiera un servidor en la maquina host,las peticiones que haga hacia la maquina guest deberian terminar con el puerto que configure para redirigir, es decir tendria que escribir:

    http://xxxx.xxx:»puerto»
    ????
    Saludos y muy buena la info

  2. Hola Jaime, correcto. Si el servidor es web, la direcc tendria que ser:
    http://IP_maquina_host:puerto

    Pero fíjate que no es la direcc de la máquina virtual la que debes poner sino la de la máquina físicia donde está ubicado el servidor virtual. De la misma forma, el puerto que debes incluir es el puerto de la física (HOST) también.

    Esto implica tener un poco de cuidado ya que es posible que la máquina fisica que contiene la virtual tenga ya algún servicio usando algún puerto de escucha, por ejemplo, a mi me gusta tener acceso SSH a todas mis máquinas así que para habilitar el acceso a una máquina virtual por SSH de esta forma hay que tener en cuenta que realmente se le están dando 2 accesos SSH a la misma máquina (LA física que contiene la virtual). Cuando se hace la petición al SSH principal, es decir, el mismo SSH de la maquina física, es el Servidor SSH que tengas configurado el que hace la escucha así que seria una conexión normal PERO cuando al intentar conectar a la máquina virtual realmente es una petición a la física PERO quien está escuchando en el puerto asignado es el propio VIRTUALBOX quien se encarga de comprobar que el puerto al que estás intentando conectar está asociado al servicio ssh de la maquina virtual dada y una vez hecha esa redireccion o mapeo (Realmente eso es el NAT) la petición ya es enviada al servidor ssh instalado en la máquina virtual.

    En el caso que expones, un http, seria así:
    Peticion a la maquina fisica y puerto de la maquina fisica —-> Virtualbox Acepta la petición y lo reenvia a la máquina virtual (Proceso transparente para quien hace la peticion)

    http://ip_maquina_fisica:puerto_maquina_fisica —> VirtualBox –> maquina_virtual:puerto

  3. Es muy interesante todo lo vertido en este post. Ya te agregué a mi lector de feeds RSS, suerte

  4. Perfecto, es justo lo que estaba buscando.

    Muchas gracias y feliz 2011.

  5. De nada, me alegro de que te sirva.

    Un saludo y feliz año!!!

  6. Gracias, bastante claro. Es justo lo que estaba buscando.

  7. Me alegro de que os sea útil. Aún no he probado este script con la última version de Virtual Box, de hecho, aún no he probado la nueva versión (La 4.0) pero si he leido la lista de cambios y tiene unos cuantos respecto a estos temas, como un GUI para gestionar estas cosas y soporte para hacer los mapeados NAT en caliente, al menos sobre el papel pero ciertamente promete bastante.

  8. hola alvaro quisiera saber como configurar un servidor isa un servidor exchange y un servidor dc en virtual box con todos los servicios practcamente para una pequeña red que necesite estos servicios he tratado en virtualbox y no he podido te agradesco tu ayuda gracias

  9. Hola fercho,

    ¿Podrías concretar un poquito más tu pregunta? Básicamente lo que es la instalación en si, es igual que si fuese una fisica solamente que después hay que tener clara la estructura de la red, IP´s, donde está cada servicio, que unos enlacen con otros…etc
    Pero necesitaría que concretases un poco más la pregunta.

    No obstante, como apunte ¿Que versión de VirtualBox tienes? Lo digo porque lo que comento en este mismo artículo ya se puede hacer desde el mismo entorno gráfico del propio VirtualBox a partir de la versión 4.

    Un saludo

  10. Hola, buscando la solución a mi problema con virtualbox he dado con tu articulo, y me ha sido de gran ayuda, solo que tengo una pequeña duda, ¿ hace falta poner la tarjeta en modo NAT?. Muchas gracias anticipadas.

  11. Hola David,

    Ten en cuenta que, aunque puedes seguir haciéndolo como indico en el artículo, con la nueva versión de VirtualBox (VirtualBox 4) incluyen varias características nuevas, entre las que destaca un modo gráfico desde las mismas opciones, para realizar esto mismo y que, al parecer (Digo ‘al parecer’ porque aún no he podido probarlo) no es necesario ni reiniciar la máquina para ir aplicando los cambios.

    Ciertamente esta nueva versión de VirtualBox promete mucho y estoy deseando meterme de lleno con ella, nada más que me libere un poco de tiempo.

  12. Solucionado! Muchas gracias, ya tengo la maquina funcionando y en perfectas condiciones 😛

  13. Saludos, amigo no se si me puedes ayudar con esto, pero quiero saber si esto aplica con un modem 3g, pero el inconveniente es que cada ves que marca cambia la ip publica. por modo bridge no se puede porque no me aparece en las interfaces de red. Si me puedes dar una mano te lo agradeceria mucho.

  14. Hola Andrés,

    Cuando hablas de un modem 3G entiendo que es porque quieres acceder al servidor instalado en la máquina virtual desde cualquier sitio con internet PERO fuera de tu casa/empresa/sitio donde esté la máquina virtual. Si es desde la lan o red «casera», o desde el mismo ordenador que tiene la máquina virtual, da igual que la conexión a internet sea a través de un modem.

    De ser lo primero y que quieras acceder desde cualquier otro sitio que no sea la propia red/host donde está la VM, es decir, a través de internet, lo primero que deberías hacer es darte de alta en algún servicio del tipo «no-ip» o «dyndns». Este tipo de servicios, que tienen modalidad gratuita, lo que hacen es permitirte tener un servidor localizado por dns, tras una redirección de subdominio, a pesar de que tenga ip dinámica. Esto es, cada vez que te cambia la IP, este servicio se encarga de actualizarse, a través de un pequeño cliente que deberás instalar previamente, para apuntar a tu nueva IP asignada, de forma que siempre que trates de acceder a tu servidor a través de el subdominio que registres con ellos, no tendrás problema. Dicho subdominio suele ser del tipo:

    EscribesLoQueSea.no-ip.com (Siempre y cuando la direcc esté libre, lógicamente)
    EscribesLoQueSea.dyn-dns.org (Siempre y cuando la direcc esté libre, lógicamente)
    …etc…etc

    Si por el contrario es desde la misma lan o el mismo host donde está la máquina virtual que hace de servidor… el tema se simplifica bastante ya que es, básicamente, limitarse a los pasos del artículo que, te recuerdo, puedes configurar de forma gráfica (Sin script) desde el mismo panel de configuracion de VirtualBox a partir de la versión 4 (El artículo salió bastante antes… por desgracia :S)

  15. muchas gracias por responder, si efectivamente era para que el servidor fuera visible desde afuera, configure la dirección en modo gráfico pero no me funciono, Me fue muy útil tu articulo porque investigue y di con esto y solucione lo que quería, la cuestión era que me tomaba en NAT la tarjeta intel por defecto y solo tuve que cambiar pcnet por e1000 como se muestra aquí.

    $ VBoxManage setextradata «Server» «VBoxInternal/Devices/e1000/0/LUN#0/Config/guestweb/Protocol» TCP

    $ VBoxManage setextradata «Server» «VBoxInternal/Devices/e1000/0/LUN#0/Config/guestweb/GuestPort» 80

    $ VBoxManage setextradata «Server» «VBoxInternal/Devices/e1000/0/LUN#0/Config/guestweb/HostPort» 8080

    Muchas gracias.

  16. Muchas gracias funciona perfecto.

  17. Luis alfredo

    Muchas gracias hace rato que estaba buscando esto, solucionaste mis problemas xD bastante completo y por fin algo util!

  18. Hola Alvaro de antemano gracias, tengo algunos lios con el virtualbox, resulta que al abrirlo inmediatamente mi conexión a internet se viene abajo, con esto quiero decir que me indica que sigue conectado pero sin acceso a internet, esto es enseguida de que lo inicio, utilizo windows7, 4gb de ram, ¿tendrás alguna idea de qué hacer para poder jugar con el vbox?

  19. Hola Carlos,

    Yo probaría a cambiar la configuracion de red del VirtualBox de menos a más pero antes miraría el visor de eventos de windows ya que es posible que, si te está generando algun mensaje de error, en el visor deberia de aparece (Mi PC –> Boton derecho –> Administrar –> Visor de eventos –> Registros de windows. Una vez en esa entrada, deberías revisar las ramas Sistema y Aplicacion. Ten en cuenta que puedes reproducir el problema para saber el momento exacto en el que se produce y asi desechar otros mensajes del visor que no cuadren con las horas)
    Aunque windows no es precisamente famoso por tener un sistema de logs claros (Y facilmente no te solucione nada concreto ver el error generado) pero podria encaminarte ya en la direccion correcta para encontrar el motivo del problema.

  20. para los que esten probando con centos recuerden habilitar el puerto 80 dentro del firewall ya que por defecto solo viene activado el puerto 22

  21. nelvirtual

    Acabo de instalar VirtualBox y seguido de eso Windows server 2008 r2, ahora bien, despues de realizar la configuracion de la tarjeta de red como puente puedo darle ping desde el server virtual a cualquier PC de la red, pero en sentido inverso no. Puedes ayudarme con este caso, ya que deseo crear un servidor virtual con SO Window 2008r2

  22. Hola. he buscado por la web este metodo y no funciona de ninguna manera… podrias dar mas especificaciones de como hacerlo. al parecer las conexiones que hago por linea de comando estan bn, tambien lo hice con tu script . al ejecutar netstat en el pc fisico aparece la conexion con el puerto que indique en la configuracion. incluso al tratar de conectarme desde el pc fisico a 127.0.0.1:8888 en la consola aparece la conexion establecida pero la pagina se queda en cargando y despues de unos segundos se cae y no conecta.

    como puedo saver bn si esta en correcto funcionamiento la configuracion de la redireccion de puertos…??
    abra que configurar otra cosa? firewall,antivirus,etc. en el pc fisico o virtual

    detalle:
    -pc fisico win7 ps1 64bit
    -pc virtual centosServer 6.3 32bit apache 2.4
    -virtualBox 4.2.6

    se los agredeciria mucho cualquier dato…