Asignar ip a máquina virtual con VirtualBox OSE 1.5.2 en openSUSE 10.3

lunes, 24 de diciembre de 2007
Ayer me preguntaron en esta entrada sobre como crear una red entre un host y una o mas máquinas virtuales, pero asignándoles a cada una un ip diferente de manera tal que pudiéramos crear servidores pero en máquinas virtuales. Esto suena mas simple de lo que parece.

Con VirtualBox se puede hacer pero el problema principal radica en que éste viene en dos versiones, una GPL y la otra no. La que NO es GPL viene full pero solo para uso personal o testing pero no se puede usar en ambiente comercial debido a las restricciones de su licencia. Sin embargo la versión OSE (Open Source Edition) esta bajo la GPL por lo que podemos hacer lo que queramos con ella.

Con la versión OSE se puede hacer lo mismo que con la otra pero es mas complicado y por ende difícil, pero no imposible.

Despues de leer por la red (googlear no le hace mal a nadie jejejeej) logré hacerlo funcionar, es más, hice un script que hace casi todo automáticamente. Lo hice utilizando VirtualBox OSE 1.5.2 asi es que no se si funcione con versiones anteriores. La descargué de los repositorios de openSUSE 10.3 (se configura en Yast -> Community Repositories, simplemente se marca la casilla que indica software para virtualizar sistemas)

Antes de mostrar el script explicaré a grandes rasgos de que se trata este cuento.

Lo primero que se debe hacer para crear una red entre el host y máquinas virtuales es crear un bridge (puente), el cual se llamará br0. Este puente se utiliza para acceder a Internet y a él se registran las interfaces de red tanto de la máquina real (host) como de las virtuales (guests). Normalmente (cuando no hay bridge entremedio) la máquina real se conecta a Internet mediante la interface de red, generalmente eth0 (esa es en mi caso), pero para lograr la creación de la red todas las máquinas se conectaran a través del bridge.

Una vez que se crea el bridge se deben crear tantas interfaces de red como máquinas virtuales deseemos, una para cada una, las cuales se denominarán tap0, tap1, ... tapN. Estas interfaces son similares a la eth0, la diferencia es que son virtuales. Una vez que se crean se deben registrar al bridge (br0), incluyendo la eth0. Luego se le debe quitar la ip a la eth0, ya que se debe asignar a br0.

Lo anterior es una explicación a groso modo para que entiendan lo que viene a continuación (de todas maneras está comentado). Para que el script funcione correctamente son necesarios dos paquetes fundamentales:
  • bridge-utils
  • uml-utilities
Ambos vienen en el dvd de openSUSE 10.3 (no se si en los anteriores).
Deben configurar las variables definidas en el script para que concuerden con su sistema.
Una vez instalados ejecutan el siguiente script, como usuario root.

#!/bin/bash

#INICIALIZACION DE VARIABLES
#Deben cambiar los valores segun corresponda a su realidad
#seteamos el usuario
USUARIO="metalklesk"

#seteamos la cantidad de maquinas virtuales (guests) que deseamos tener en el host
CANTIDAD_VM=2

#seteamos la interface de red real
INTERFACE_RED_REAL="eth0"

#seteamos el ip del host
IP_HOST="192.168.0.144"

#seteamos la pasarela (gateway)
PASARELA="192.168.0.1"


#CONFIGURACION
#creamos el puente (bridge)
brctl addbr br0

#seteamos la interface de red real para que sea promiscua
ifconfig $INTERFACE_RED_REAL 0.0.0.0 promisc

#insertamos la interface de red real al puente br0
brctl addif br0 $INTERFACE_RED_REAL

#creamos una interface tap para cada guest (maquina virtual),
#los insertamos en el puente y los subimos
CONTADOR=0
while [ $CONTADOR -lt $CANTIDAD_VM ]
do
tunctl -t tap$CONTADOR -u $USUARIO
brctl addif br0 tap$CONTADOR
ifconfig tap$CONTADOR up
let CONTADOR=$CONTADOR+1
done

#asignamos una ip al puente br0 mediante dhcp
#dhclient br0

#asignamos la ip del host al puente br0 de forma manual
ifconfig br0 $IP_HOST

#asignamos la pasarela al puente br0
route add default gw $PASARELA br0

#cambiamos los permisos de /dev/net/tun
chmod 0666 /dev/net/tun

#NOTAS.
#
# Un Bridge es contrario a un firewall, por lo tanto si el firewall esta arriba es posible que por default
# este bloqueando la interfaz br0 (u otra). La solucion mas simple es deshabilitar el firewall, pero no es
# recomendable ya que eso resta seguridad. Entonces lo que hay que hacer es configurar el firewall para que
# permita, a la interfaz br0, salir al exterior (y ser vista desde el exterior y dentro de la red). En el caso
# de openSUSE 10.3 es muy simple de hacer, simplemente hay que abrir con un editor de texto (como root) el
# archivo de configuracion del firewall:

# /etc/sysconfig/SuSEfirewall2

# bajar al final y buscar la linea que dice:

# FW_FORWARD_ALWAYS_INOUT_DEV=""

# En esa linea hay que agregar las interfaces que queremos separadas por espacios, en este caso corresponde al
# bridge br0, la linea queda de la siguiente forma:

# FW_FORWARD_ALWAYS_INOUT_DEV="br0"

# Ya con eso simplemente hay que reiniciar el firewall (desde Yast o desde consola) y listo.
# Lo que resta es configurar la red de la maquina virtual. Desde VirtualBox se crea una maquina virtual, luego
# hay que ir a Settings -> Network -> Adapter0 y cambiar Attached to de "Not attached" a "Host Interface" y en
# Interface Name escribir tap0 o la interfaz que corresponda (depende de cual le quieren asignar a la
# maquina virtual).
# Ya con eso pueden instalar tranquilamente el SO Guest en VirtualBox, luego configurar la red de este dándole una
# ip a mano o a traves de dhcp que esté dentro del rango provisto por la subred. Con todo lo anterior (incluidos
# los comandos de este script) tienen configurado una red con las maquinas virtuales y cada una con su propia ip,
# lo cual es muy util para configurar servidores.

#FIN
Una vez ejecutado el script simplemente creamos una máquina virtual y en Settings -> Network -> Attached to cambiamos de Not attached a Host Interface y en Interface Name colocamos tap0 (o el que queramos asignarle). ya con eso pueden levantar la máquina virtual y dentro configuran la red asignándole un ip estático o a través de dhcp (como en mi caso) dentro del rango de la subred, con lo cual ya tienen su máquina virtual en red con la real (y con la red entera).

A continuación pueden ver una imagen que saqué al mostrar las interfaces de red configuradas después de ejecutar el script (se configuran al ejecutar el script, no es necesario que lo hagan ustedes :)):

A continuación pueden ver una imagen de la parte donde se configura la interface de red de la máquina virtual (explicado anteriormente):

Aquí pueden ver la máquina virtual corriendo, en la cuál se puede ver que tiene una ip asignada (192.168.0.125), además está de servidor de Openbravo 2.35:

y aquí pueden ver que en el host puedo acceder a Openbravo que está en la máquina virtual (fijense en el ip que aparece en el navegador):

y una última imagen para que vean las dos cosas anteriores al mismo tiempo:


PD: se me olvidaba, es más aún, mi router (D-Link 704p) detecta a la máquina virtual como si fuera real:


Espero les sea de utilidad y ya saben, cualquier consulta la hacen comentando.

saludos!!!!

14 comentarios:

Marco-pymelinux dijo...

Hola, un escenario que me interesa, es ver la administración remota de VirtualBox OSE, según un googleo que hice habria que dejar VirtualBox en BackGround, o sea en la partida $>VirtualBox &
para que al conectarse y desconectarse no se caiga el VirtualBox.
Yo he pensado en manejarlo remotamente con el NX server, que permite una conexión segura (via SSH) al escritorio con KNX o con el cliente de nomachine.com pero no he tenido todavía la ocasión de hacerlo, soy voluntario para hacer pruebas al respecto.
tengo funcionando el NX server y VirtualBox OSE.
Saludos
Marco

tony blair dijo...

Muy buen How-To, la primera vez que lo hice en Ubuntu, me desanime, porque no sabía que tenia que hacer el bridge...
saludos desde peru

Pulpo dijo...

Muy bueno el howto, pero hay un error en el script, la linea donde setteas el usuario en lugar de USUARIO="metalklesk", tendria que decir USER, ya que despues la variable en el tuntcl toma como parametro a USER y no a USUARIO.

Abrazos

Daniel Morales Salas dijo...

se agradece mucho PULPO por la corrección al error en el script. Ya lo edité en la entrada.

saludos !!

Anónimo dijo...

Hola amigos, ps yo no sé mucho del tema pero me estoy aventando a configurar las ip's de esta forma, solo que desde lo que se refiere a ejecutar el script:

#!/bin/bash

sale esto:

AHUIZOTL:/home/Ahuizotzin # /bin/bash
AHUIZOTL:/home/Ahuizotzin #

no tengo idea de cómo o dónde sale o empiezo a modificar los datos que corresponden a mi sistema...
Ví que tal vez fue erroe mío no haber escrito un signo "!" despues del "#" para que quedara así:

#!/bin/bash

entonces lo hice y:

AHUIZOTL:/home/Ahuizotzin # !/bin/bash
bash: !/bin/bash: event not found

ps no sé cómo pasar de ahí, plis ayúdenme a brincar esa barda... leí por ahí de otra forma para hacerlo, la han de conocer ps se trataba de lago así:

gpasswd -a usuario uml-net

pero para empezar me salió:

gpasswd: opción inválida -- a
Try `gpasswd --help' or `gpasswd --usage' for more information.

total que no me dejó pasar de ahí, que también era el primer paso de ese tutorial !!!

Ahora, como veo que aquí se trata de hacerlo en openSUSE 10.3 que es el SO que yo tengo, ps le voy más a este y de verdad quiero lograrlo. Espero no ser molestia :P

Anónimo dijo...

wow suena muy interesante me podrias mandar el codigo para probarlo un saludo
bolo_rubio@hotmail.com

boquete dijo...

Hola, yo puse varias máquinas virtuales con esta configuración, pero la velocidad de la red de las máquinas virtuales es a 10 Mbps. Esto me parece que es culpa de las interface tun/tap que linux las crea para 10 Mbps.

¿No sabrás si se puede cambiar esto?. Llevo peleando unos días para aumentar la velocidad y no hay forma.


Gracias

Pablo dijo...

Hola
A mi me anda un poco lento la red. Tengo programas que se conectan a bases de datos Access y SQL que están en el servidor virtualizado y la velocidad de refresco de los datos es bastante inferior a si las bases estuvieran en un Windows real y no virtualizado. A alguien le pasó?
pmoriconi@gmail.com

Carlos M. dijo...

Muy bueno, lo probé en OpenSuse 11, y ha quedado perfecto, gracias a esta ayuda pude solucionar el problema, muy buen script.

demasiadovivo dijo...

Hey! muchisimas gracias por el script!, me encantó que esté tan bien explicado, porque no me gusta eso de copiar y pegar y no entender un corcho de lo que estoy haciendo.
Debería funcionar perfecto en casi cualquier linux porque no usa comandos especiales de una distribución en particular. Igualmente, aviso que lo probé y anda excelente en debian de 64bits.

nobu dijo...

Gracias por el script, me has ahorrado unos cuantos dolores de cabeza :D

Tambien funciona en debian lenny.

Saludos desde España.

Anónimo dijo...

Hola, una pregunta, como hago parq que una ip asignada a una maquina virtual no sea "volátil", es decir que cuando la apague y la prenda nuevamente estén las cofiguraciones de red grabadas. Gracias

Anónimo dijo...

Muchas gracias por el post, nos ayudo muchisimo!!!

Anónimo dijo...

Muchas gracias, funciona tambien en Ubuntu 9.04, un capo total!!!

Publicar un comentario en la entrada