Red con VirtualBox instalado sobre Ubuntu o cualquier distribución Debian

jueves, 1 de enero de 2009

¡¡Hola a tod@s y Feliz año!!

Continuando con el artículo que realice hace poco sobre VirtualBox, os explicaré como Configurar la Red con VirtualBox instalado sobre Ubuntu o cualquier distribución Debian.

Si lo que pretendes es navegar por internet en la máquina virtual, entonces no hay problema, configura la tarjeta de red en modo NAT (por defecto viene así) y tu máquina virtual navegará por internet. Pero si quieres comunicar la red de tu ordenador anfitrión (Linux) con la máquina virtual, o en el caso de tener varias máquinas virtuales tener la posibilidad de conectarse las máquinas virtuales vía red; o incluso conectarse la máquina virtual con otros ordenadores reales.

¿Qué utilidad puede tener esto?, os daré algunos ejemplos:
  • Es un método para compartir archivos entre la máquina virtual y cualquier otra, ya que habilitando samba puedes compartir esos archivos. Podrás utilizar tarjetas WiFi en la máquina virtual, inutilizables de cualquier otro modo.
  • Ahora puedes mapear puertos a la máquina virtual, y usar así programas p2p o montar servidores en la misma.
  • Es el perfecto banco de pruebas entre Servidores y Clientes disponiendo de un solo ordenador.

Solución para la nueva versión de VirtualBox 2.1.0

Todo es más fácil, solo hay que definir un adapatador de red de tu máquina virtual como interface anfitrión y elegir sobre que tarjeta de tu ordenador se define, por ejemplo eth0, wlan0, etc...

Solución para versiones anteriores a la VirtualBox 2.1.0


Para que entendáis bien el proceso, lo voy a explicar basándome en la configuración que tengo en mi portátil:
  • Ubuntu 8.04 (que será el ordenador anfitrión, sobre el que se instaló VirtualBox PUEL), dispone de un usuario denominado ramon con privilegios de administrador, una tarjeta de red ethernet eth0 y otra tarjeta de red wifi wlan0 por la que accedo a internet por la red 192.168.1.0/24
  • Una máquina virtual con Windows 2003 Server.
  • Otra máquina virtual con Windows XP.
Basándose en la configuración anterior, hay 2 formas distintas de solucionar el problema
  • Supuesto A) Las máquinas virtuales solamente se comunicarán con el ordenador anfitrión y entre ellas pero no podrán acceder a otras redes de ordenadores reales. Este caso es el recomendado si quieres tener a las máquinas aisladas por motivos de seguridad o por simplicidad. Aquí he configurado la red a través del interfaz eth0
  • Supuesto B) Las máquinas virtuales se comunicarán con el ordenador anfitrión, entre ellas y con otras redes de ordenadores reales. Este caso está mas indicado para situaciones más complejas. Aquí he configurado la red a través del interfaz wlan0
Solución común al supuesto A ) y B): 1ª parte

La conexión entre la tarjeta de red de la máquina virtual y el ordenador anfitrión se obtiene definiendo un TAP: interfaz virtual que no tiene un interfaz de red hardware real por debajo. Mediante esta interfaz virtual se definirá un tunel para comunicarse la tarjeta de red de la máquina virtual con la tarjeta de red real del ordenador, más información en el artículo de la wikipedia.

Pasos a realizar:

1.) Las utilidades para configurar los interfaces TAP están en el paquete uml-utilities. Se necesitará también el paquete parprouted para establecer un puente transparente entre una IP y un proxy ARP. Para instalar estos dos paquetes, abre una terminal de comandos y escribe:

$ sudo apt-get install -y uml-utilities parprouted

2.)
Ahora hay que realizar un script que se ejecute cada vez que se inicie la máquina y configure automáticamente la red de tu máquina virtual. Para esto hay que editar el archivo /etc/rc.local, abre una terminal de comandos y escribe:

$ sudo gedit /etc/rc.local

Parte de la Solución para el supuesto A)

3.) Añade las siguientes líneas al archivo /etc/rc.local:

# Da permisos al grupo de usuarios vboxusers
# para usar el dispositivo /dev/net/tun
# TUN es un dispositivo Punto a Punto virtual.

chown root:vboxusers /dev/net/tun

# Mete en los grupos vboxusers y uml-net al usuario ramon
# para poder usar los dispositivos TAP y TUN de la red virtual
# chmod 666 /dev/net/tun => esto ya no hace falta
usermod -G vboxusers -a ramon
usermod -G uml-net -a ramon


# Creamos el tap1 (interfaz de red para Windows 2003 Server):
tunctl -t tap1 -u ramon
# Activa la interfaz de red tap1
ip link set tap1 up

# Si tienes una sola tarjeta de red eth0, dedicada a Internet,

# es mejor usar otra interfaz de red:
# una interfaz de red virtual eth0:0 sobre la interfaz eth0
# para comunicarse con Windows 2003 Server
# la red que he elegido (192.168.7.0 /24)
# no debe interferir con la red 192.168.1.0 /24
# que es la usada para acceder a internet
ifconfig eth0:0 192.168.7.100 netmask 255.255.255.0 up

# Configurar tap1con la dir. IP: 192.168.7.100
ifconfig tap1 192.168.7.100 netmask 255.255.255.0 up

#Ahora se crea un enlace entre el tap1 y el proxy,
# evitando que iptables te pudiese bloquear
.
# Para esto, se activa el enrutamiento
echo 1 > /proc/sys/net/ipv4/ip_forward
echo 1 > /proc/sys/net/ipv4/conf/tap1/proxy_arp

# Establecer un puente entre eth0:0 y tap1 para comunicar la red
# del ordenador anfitrión con la red de la máquina virtual

parprouted eth0:0 tap1

# Ajustar la tabla de encaminamiento a la dirección IP
# de tu máquina de Windows 192.168.7.10 a través del tap1

route add -host 192.168.7.10 tap1

# sino tienes nada más que una máquina virtual
# no te hará falta todo lo que viene a continuación:


# Crear el tap2 (interfaz de red para Windows XP):
tunctl -t tap2 -u ramon
# Activa la interfaz de red tap2
ip link set tap2 up

# Añadir una nueva interfaz de red virtual eth0:1
# para comunicarse con la máquina virtual de Windows XP

ifconfig eth0:1 192.168.7.200 netmask 255.255.255.0 up
# Configurar el tap2 con la IP: 192.168.7.200 / 24
ifconfig tap2 192.168.7.200 netmask 255.255.255.0 up

# Establecer un puente entre eth0:1 y tap2 para comunicar la red
# del ordenador anfitrión con la red de la máquina virtual

parprouted eth0:1 tap2

# Ajustar la tabla de encaminamiento a la dirección IP
# de tu máquina de Windows XP: 192.168.7.20 a través del tap2

route add -host 192.168.7.20 tap2

# pon el script justo antes de esta línea sino no te funcionará
exit 0


Parte de la Solución para el supuesto B)

# Damos permisos al grupo de usuarios vboxusers
chown root:vboxusers /dev/net/tun

# dar permisos al disposito dev/net/tun, no hace falta
# si metemos en el grupo vboxusers al usuario ramon
usermod -G vboxusers -a ramon

# Creamos el TAP1 (interfaz de red para Windows 2003 Server):
tunctl -t tap1 -u ramon
ip link set tap1 up

# Como se dispone de una sola tarjeta de red wlan0
# mediante la que accedemos a Internet creamos una nueva interfaz
# de red virtual wlan0:0 para comunicarnos con la máquina virtual
# en este caso la red escogida 192.168.1.0 /24 debe coincidir con la
# red que te permita acceder a Internet
ifconfig wlan0:0 192.168.1.100 netmask 255.255.255.0 up

# Le decimos al TAP cual es nuestra IP: 192.168.1.100
ifconfig tap1 192.168.1.100 netmask 255.255.255.0 up

#Ahora creamos un enlace entre el TAP y el proxy,
# evitando que iptables nos pudiese bloquear
echo 1 > /proc/sys/net/ipv4/ip_forward
echo 1 > /proc/sys/net/ipv4/conf/tap1/proxy_arp

# Establecer la tarjeta de red con la se comunicará TAP1
# con nuestra red de la máquina anfitrión
parprouted wlan0:0 tap1

# Ajustar la tabla de encaminamiento a la dirección IP
# de tu máquina de Windows 192.168.1.101 a través del tap1
route add -host 192.168.1.101 tap1

# eliminamos del encaminamiento de la red 192.168.1.0/24
# asociada a tap1, para que no interfiera con wlan0
route del -net 192.168.1.0 netmask 255.255.255.0 tap1

# Creamos el TAP 2 (interfaz de red para Windows XP):
tunctl -t tap2 -u ramon
ip link set tap2 up


# Como se dispone de una sola tarjeta de red wlan0
# mediante la que accedo a Internet, creo una nueva interfaz
# de red virtual wlan0 para comunicarnos con la máquina virtual
ifconfig wlan0:1 192.168.1.200 netmask 255.255.255.0 up

# Le decimos al TAP2 cual es nuestra IP: 192.168.1.200
ifconfig tap2 192.168.1.200 netmask 255.255.255.0 up

#Ahora creo un enlace entre el TAP2 y el proxy,
# evitando que iptables nos pudiese bloquear
echo 1 > /proc/sys/net/ipv4/ip_forward
echo 1 > /proc/sys/net/ipv4/conf/tap2/proxy_arp

# Establecer la tarjeta de red con la se comunicará TAP2
# con nuestra red de la máquina anfitrión
parprouted wlan0:1 tap2

# Ajustar la tabla de encaminamiento a la dirección IP
# de tu máquina de Windows 192.168.1.201 a través del tap2
route add -host 192.168.1.201 tap2

# eliminar la red 192.168.1.0 /24 asociada a tap2,
#para que no interfiera con el encaminamiento de wlan0
route del -net 192.168.1.0 netmask 255.255.255.0 tap2

# asegurate de poner este script antes de exit 0

exit 0


Solución común al supuesto A ) y B): 2ª parte

4.) Ahora queda lo más fácil: configurar las máquinas virtuales para que puedan usar las tarjetas de red tap1 y tap2. El procedimiento a seguir es el siguiente:

- En la máquina virtual de Windows 2003 Server, vas a configurar dos adaptadores de red:

  • Adaptador 1: de tipo NAT para poder navegar por Internet con Windows 2003 Server
  • Adaptador 2: de tipo interface anfitrión (host interface) denominado tap1. Este será el que permitirá comunicar la tarjeta de red de Windows 2003 Server con Ubuntu 8.04 (concretamente con el interfaz eth0:0)

¿Cómo hacemos esto?

  • Asegurate de que la máquina Virtual de Windows 2003 Server esté apagada.
  • Pinchando sobre Red en la máquina Virtual de Windows 2003 Server y después sobre el Adaptador 1, a continuación asegurate que están activadas las casillas Habilitar Adaptador de Red y Cable Conectado. Posteriormente pincha a la derecha de (Attached to) (Conectar a) y escoge el tipo de dispositivo NAT.
  • Después haz clic sobre el Adaptador 2, asegurate que están activadas las casillas Habilitar Adaptador de Red y Cable Conectado. Ahora pincha a la derecha de (Attached to) (Conectar a) y escoge el tipo de dispositivo Interface Anfitrión o Host Interface. Por último a la derecha de Interface name (nombre del interface) escribe tap1. (pincha sobre la foto de la derecha de mi blog si quieres ver como quedaría)

Ya solo tienes que configurar las dos tarjetas de Red en Windows 2003 Server, la primera de ellas será configurada por DHCP (obtener una dirección IP automáticamente) y la segunda le pones la dirección IP 192.168.7.10 con máscara de red 255.255.255.0.

- En la máquina virtual de Windows XP vas a configurar otros dos adaptadores de red:

  • Adaptador 1: de tipo NAT para poder navegar por Internet con Windows XP.
  • Adaptador 2: de tipo interface anfitrión (host interface) denominado tap2. Este será el que permitirá comunicar la tarjeta de red de Windows XP con Ubuntu 8.04 (concretamente con el interfaz eth0:1)

¿Cómo hacemos esto?

  • Asegurate de que la máquina Virtual de Windows XP esté apagada.
  • Pinchando sobre Red en la máquina Virtual de Windows XP y después sobre el Adaptador 1, a continuación asegurate que están activadas las casillas Habilitar Adaptador de Red y Cable Conectado. Posteriormente pincha a la derecha de (Attached to) (Conectar a) y escoge el tipo de dispositivo NAT.
  • Después haz clic sobre el Adaptador 2, asegurate que están activadas las casillas Habilitar Adaptador de Red y Cable Conectado. Ahora pincha a la derecha de (Attached to) (Conectar a) y escoge el tipo de dispositivo Interface Anfitrión o Host Interface. Por último a la derecha de Interface name (nombre del interface) escribe tap2.
Ya solo tienes que configurar las dos tarjetas de Red en Windows XP, la primera de ellas será configurada por DHCP (obtener una dirección IP automáticamente) y la segunda le pones la dirección IP 192.168.7.20 con máscara de red 255.255.255.0.

Para que funcionen todas las configuraciones establecidas anteriormente tienes dos opciones:
a) Reiniciar el ordenador.
b) Ejecutar el script que se inicia al arrancar el ordenador directamente, escribiendo en una terminal de comandos: $ sudo /etc/rc.local. A continuación cierra VirtualBox y vuelve a abrirlo.

Ejemplo práctico, uso del servidor FTP:

Si instalamos cualquier servidor (excepto el DHCP) en nuestra máquina anfitrión, por ejemplo, un servidor FTP como el vsftp, dicho servidor escuchará por dos direcciones de red: La dirección IP: 192.168.7.200 de la interfaz virtual eth0:0 y por la dir. IP 192.168.1.2 de la interfaz de la tarjeta de red eth0. Si necesitamos que escuche por más direcciones IP el servidor bastará con definir más interfaces virtuales. Como además tenemos activado el routing (posibilidad de enviar paquetes desde una red a otra distinta) con el script de /etc/rc.local:echo 1 > /proc/sys/net/ipv4/ip_forward, entonces si disponemos de más interfaz de red (eth1, wlan0, etc....), dicho servidor FTP también escuchará por las nuevas direcciones IP que tengan asociadas esas nuevas interfaces.

Como consecuencia tendremos un servidor FTP instalado en nuestra máquina anfitrión y que atiende a peticiones de la máquina virtual (que actúa como cliente FTP) y se conecta al servidor FTP a través de la dir. IP: 192.168.7.200 y desde el exterior de la máquina, desde otras máquinas reales (que también actuarán como clientes FTP) que se conectan al servidor FTP a través de la dir. IP: 192.168.1.2

En el caso del supuesto B) se puede conseguir instalar el servidor FTP en la máquina virtual de modo que cualquier ordenador o máquina virtual conectado a nuestra máquina anfitrión podrá ser cliente FTP de este servidor.

La única pega que presenta este método es que si deseas configurar la máquina virtual como servidor o cliente DHCP no te funcionará, ya que se necesita que tengan establecidas una dirección IP fija las tarjetas de red eth0:0, eth0:1, tap1, tap2 y las tarjetas de red definidas en las máquinas virtuales.

Buena suerte, espero que os funcione y si tenéis alguna duda o para lo que queráis, enviarme vuestros comentarios.

Hay otros métodos diferente al mío para configurar la red, aunque no lo he probado parece interesante el artículo del blog de Vicente Navarro.

20 comentarios:

elkaribou dijo...

Magnífico artículo Ramón.

Muy "currado" y sin duda de gran ayuda para tod@s los que se aventuren a utilizar VirtualBox.

Te doy las gracias por tomarte la molestia y, sobre todo, el tiempo que se necesita para hacer un post tan bueno como este.

Un saludo...

PD.- ¡¡Nos estás mal acostumbrando con el "nivelazo" de los últimos artículos!!, ggg

Ramón José Martínez Cuevas dijo...

Gracias José!!

Le he echado muchas horas para descubrir como se configuraba la red en VirtualBox, incluso hubo momentos en que pensé abandonar el propósito de conseguir acceder vía red desde otros ordenadores a la máquina virtual. Pero al final lo hice ;-)

Espero no defraudar en próximos artículos, pero no serán tan densos y con tanto contenido como este.

Salu2!!

Anónimo dijo...

José Ramón entre las 15.30 y las 20.30 he estado intentando hacer lo que tu has explicado, pero sin éxito. Tenía que haber leído este artículo antes. Muchas gracias. RafaLuque

Ramón José Martínez Cuevas dijo...

Me alegra ver que sirve de algo mi artículo.

Gracias a ti Rafa Luque ;-)

Arise dijo...

Genial el artículo. Te felicito
Gracias a ti en 2 minutos he configurado la red de la maquina virtual y va perfecta.

Arise dijo...

Aunque lo que no me funciona es la supuesta comunicación con el Pc anfitrión.
(o quizas lo que yo piensa que es, no es lo que yo quiero hacer jeje, que puede ser)
Es que intento compartir una carpeta entre mi Pc y la maquina virtual, pero no lo consigo (ni que vea los pen drives) :-S

Ramón José Martínez Cuevas dijo...

Hola!!

Si tienes conexión de red entre el Pc anfitrión y la máquina virtual, es decir, se pueden hacer ping mutuamente entre los dos, entonces se puede compartir una carpeta entre la máquina anfitrión y la máquina virtual mediante un servidor NFS, también con Samba.

Pero independientemente de tener o no conectividad entre la máquina virtual y la anfitrión, también se puede hacer instalando los guest additions en la máquina virtual, mira este enlace:

http://doc.ubuntu-es.org/VirtualBox y mira como se instalan los guest additions y las carpetas compartidas

Salu2 y suerte ;-)

Arise dijo...

Entré en el enlace que me dijiste, y añadí lo que necesitaba para los usb y los Guest Additions para poder compartir la carpeta .
Conseguí añadirle el directorio, pero el problema me surge en uno de los pasos.
Dice que en una vez ejecutada la maquina virtual, se hace clic con el botón derecho del ratón y en conectar a unidad de red.
El problema viene a la hora de ponerle ahí la dirección de la carpeta.
Si le doy a buscar, me la encuentra y el me pone la ruta, pero luego cuando va a establecer la conexión con la carpeta....sorpresa! dice que no la encuentra.

Cachis....con lo bien que iba..y me falla en el final :-P, eso es mala suerte.

Ramón José Martínez Cuevas dijo...

Hola Arise!!

Una solución para compartir usb de forma muy fácil es fijarte donde se monta el lápiz usb cuando lo conectas en el Ubuntu (S.O Anfitrión), lo puedes averiguar ejecutando el comando mount y viendo que muestra. Normalmente el usb se montará en el directorio /dev/sdb1 ó /dev/sdb2, por lo tanto el truco está en compartir la carpeta /dev/sdb1 o la que corresponda con la máquina virtual (Windows o el sistema operativo que tengas en la máquina virtual)

Salu2!!

Anónimo dijo...

Muy bueno. Hasta ahora habia visto tutoriales de como montar un router o Server Virtual, pero nadie explicaba lo de las Interfaces.

Muchas Gracias
Fernando Barraza

Ramón José Martínez Cuevas dijo...

Hola Fernando!!

Gracias por tu comentario, me anima bastante ver que bastante tiempo después de hacer el artículo ha despertado el interés de la gente y he podido enseñar algo a los demás.

Salu2!!

Arise dijo...

Los USB pude configurarlos y funcionan perfectamente.
Lo unico que no puedo es compartir una carpeta entre ubuntu y la maquina virtual (de manera que para pasar archivos a la maquina virtual me las tengo que apañar con un pendrive jeje)

Segui las instrucciones de la pagina que me dejaste pero no hay manera...

Ramón José Martínez Cuevas dijo...

Hola Arise!!

Has conseguido lo más complicado que es que te funcione el usb, para compartir una carpeta entre windows y Linux no debería dar muchos problemas.

Te recomiendo visitar los siguientes enlaces:

VirtualBox Ubuntu León apartados 13 y 14

doc ubuntu directorio compartido Sigue los pasos allí descritos y a ver si tienes suerte.

Salu2!!

Arise dijo...
Este comentario ha sido eliminado por el autor.
Arise dijo...

Aleluya!! conseguí compartir la carpeta (entre los enlaces que dejaste y algo que hice yo, no se que...la carpeta se comparte)

Ahora me toca otra cosa más difícil, aunque me da que esto ya no va a ser posible...¿Se puede compartir todo un Disco duro con la maquina virtual? ¿Un disco que no es en el que esta montado Ubuntu, sino uno secundario?

Ramón José Martínez Cuevas dijo...

Hola Arise!!

Si el disco no está montado en Ubuntu no vas a poder en teoría.

Para compartir un disco lo primero que hay que hacer es que lo reconozca el sistema operativo anfitrión: en este caso Ubuntu.

Luego solamente tienes que compartir la carpeta donde se monto el disco (por ejemplo podría ser /media/sda5, para averiguar donde están montados los discos ejecuta el comando mount o ve el contenido del archivo /etc/fstab) y ya está!! Así de fácil, Como has conseguido compartir una carpeta no deberías tener mayores problemas.

Un saludo!!

Arise dijo...

Intenté compartir el disco, pero no me deja. Me dice que no puedo hacerlo porque no tengo permisos.
Intenté cambiarlos entrando al disco a través del nautilus y me dice que no puedo cambiar los permisos.

¿Podria ser porque son discos que están en ntfs y que por ello ubuntu solo es capaz de verlos y guardar información pero no habilitar permisos? [No tengo ni idea, y puede que me equivoque porque no se nada de esto pero..]

Creo que tendre que encontrar la forma de apañármelas, aunque sea pasando los documentos a través de la carpeta compartida [que de Ubuntu a la maquina virtual funciona, pero a la inversa no. desde la maquina virtual no me deja escribir nada en la carpetita]

Yo y mis problemas xD [Cada vez que ves un comentari mio ya te hecharas a temblar jajaja]

Ramón José Martínez Cuevas dijo...

Hola Arise!!

Disculpa el retraso en contestar pero he estado muy atareado últimamente.


Si quieres cambiar los permisos se puede hacer abriendo una terminal de comandos y escribes el siguiente comando:

sudo nautilus

le metes la contraseña y ya puede cambiar el permiso de lo que quieras desde el navegador

Consulta este documento para más información:
Permisos Espero te valga.

Un saludo!!

Arise dijo...

Hola Ramón!

Retraso disculpado, no pasa nada jeje.

Ya intenté cambiar los permisos a través del terminal con el $sudo nautilus (y mira que siempre me funciona y ese comando em lo tengo más sabido que ni se jeje) pero no me deja. Parece que no le gusta a ubuntu el disco ese.

De todas formas mirare el documento ese a ver si me sirve de algo, y ya te contaré :-)

Saludos!!

Ramón José Martínez Cuevas dijo...

Hola Arise!!

No hay solución sencilla para este problema y sobre todo desde la lejanía de internet, quizás sea conveniente que el dispositivo que tengas montado no tenga los permisos por defecto necesarios.


Consulta el siguiente documento que aloje en mi curso en Moodle sobre Linux Tienes que acceder pinchando en el botón "acceder como Invitado"

Luego en el tema 4 de sistema de archivos tienes un pdf que te habla del montaje del sistema de ficheros

Salu2!!