Como hacer un puente (bridge) para máquinas virtuales VirtualBox
¿Qué es VirtualBox?
VirtualBox es un programa que permite crear máquinas virtuales con todo lo necesario para funcionar, es decir, simula un disco duro, memoria RAM, dispositivos de red, Video, Audio...para que puedas instalar sobre ella cualquier sistema operativo (Windows, Linux, BSD...).
Por supuesto todos los recursos (RAM,Disco Duro...) que utiliza los coge de tu ordenador real (anfitrión en la jerga VirtualBox) con lo cual deberá tener una máquina que pueda mover al menos los requisitos de los sistemas operativos del Anfitrión y de la máquina virtual (Huésped en la jerga de VirtualBox).
¿Porqué hacer un puente de red?
En un principio una máquina virtual puede tener acceso a internet configurando la red como acceso NAT. Pero esto es en muchos casos insuficiente. Al usar el modo NAT de red en una máquina virtual hacemos que no se pueda comunicar por red con la máquina anfitrión ni con otras máquinas en la red anfitrión.
Solamente se comunica con otras máquinas huésped y esto para hacer pruebas de nuevas funcionalidades es un inconveniente grande ya que no podríamos probar la nueva funcionalidad con el entorno que vamos a usar.
Sin embargo haciendo un puente de red integraríamos la máquina virtual en la red “real”, en el entorno en el que va a ser usado, de modo que todas las máquinas de la red se ven entre sí.
Basta de cháchara y empecemos de una vez, entiendo que VirtualBox ya ha sido instalado y está funcionando correctamente:
Lo primero de todo hay que instalar las uml-utilities que nos permitirán crear interfaces de red virtuales (conocidas normalmente como tap) y también instalar bridge-utils que permite hacer puente de red entre interfaces (tarjetas de red):
apt-get install uml-utilities bridge-utils
Acto seguido añadimos al usuario que va a usarse al grupo uml-net:
gpasswd -a adri uml-net
Copiamos la configuración antigua de red por si las moscas:
cp /etc/network/interfaces /etc/network/interfaces.old
Editamos el fichero de configuración de red:
vi /etc/network/interfaces
Y añadimos lo siguiente al final del archivo:
auto tap0
iface tap0 inet manual
up ifconfig $IFACE 0.0.0.0 up
down ifconfig $IFACE down
tunctl_user usuario
Levantamos la interfaz tap0 que acabamos de crear:
ifup tap0
Creamos el puente o bridge:
brctl addbr br0
Y metemos en el puente a las interfaces que queremos se vean entre sí:
brctl addif br0 eth2
brctl addif br0 tap0
Ponemos como pasarela (gateway) la ip de nuestro router para el dispositivo puente y así tener comunicación con el exterior.
route add default gw 192.168.1.1 dev br0
Configuramos la interfaz de red virtual con la ip 0.0.0.0 , esto es muy importante que tenga esa ip y no otra. Si haces luego un ipconfig verás que no aparece ip aunque tu ya has puesto la 0.0.0.0
ifconfig tap0 0.0.0.0 up
Levantamos el puente:
ifup br0
Editamos el fichero de configuración de red para añadir las líneas en amarillo:
vi /etc/netwok/interfaces
auto br0
iface br0 inet dhcp
bridge_ports all tap0
Comentamos el resto de interfaces eth, de tal manera que tan solo queden las interfaces loopback (lo), los tap (en este caso tap0 solamente) y la interfaz bridge br0. Se pueden añadir más interfaces de red (tap1, tap2, tap3...)
Reiniciamos la red:
/etc/init.d/networking restart
Cambiamos la permisos de /dev/net/tun a lectura y escritura para todo el mundo:
chmod 666 /dev/net/tun
Configuramos cada máquina virtual en el apartado red (recuerda que no debe haber dos máquinas con misma dirección MAC así que pulsa al botón generar un par de veces):
Conectar a: Interface Anfitrión
Marcamos: Cable conectado
Nombre de la interface: tap0
That's All folks!!
P.D: A continuación pongo como lo tengo en mi ordenador y la salida de algunos comandos por si te pierdes. En mi caso hay un tap1 que realmente no uso pero está para el que necesite más de un interfaz virtual:
Fichero /etc/network/interfaces
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).
# The loopback network interface
auto lo
iface lo inet loopback
# The primary network interface
allow-hotplug eth2
#auto eth2
#iface eth2 inet dhcp
#Interfaz virtual para VirtualBox
auto tap0
iface tap0 inet manual
up ifconfig $IFACE 0.0.0.0 up
down ifconfig $IFACE don
tunctl_user adri
auto tap1
iface tap1 inet manual
up ifconfig $IFACE 0.0.0.0 up
down ifconfig $IFACE down
tucntl_user adri
auto br0
iface br0 inet dhcp
bridge_ports all tap0
Salida del comando ifconfig (como puede verse paso olímpicamente del tap1):
br0 Link encap:Ethernet HWaddr 00:11:09:DD:CC:99
inet addr:192.168.1.5 Bcast:192.168.1.255 Mask:255.255.255.0
inet6 addr: fe80::211:9ff:fedd:cc99/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:16031 errors:0 dropped:0 overruns:0 frame:0
TX packets:17260 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:4906103 (4.6 MiB) TX bytes:8761298 (8.3 MiB)
eth2 Link encap:Ethernet HWaddr 00:11:09:DD:CC:99
inet addr:192.168.1.5 Bcast:192.168.1.255 Mask:255.255.255.0
inet6 addr: fe80::211:9ff:fedd:cc99/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:28191 errors:0 dropped:0 overruns:0 frame:0
TX packets:31426 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:10872769 (10.3 MiB) TX bytes:15032623 (14.3 MiB)
Interrupt:21 Base address:0x2000
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:711 errors:0 dropped:0 overruns:0 frame:0
TX packets:711 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:128514 (125.5 KiB) TX bytes:128514 (125.5 KiB)
tap0 Link encap:Ethernet HWaddr 00:FF:2B:DC:86:71
inet6 addr: fe80::2ff:2bff:fedc:8671/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:166 errors:0 dropped:0 overruns:0 frame:0
TX packets:65 errors:0 dropped:265 overruns:0 carrier:0
collisions:0 txqueuelen:500
RX bytes:19316 (18.8 KiB) TX bytes:33168 (32.3 KiB)
Salida del comando route (Los destinos default tardan siempre un poco más en salir):
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.1.0 * 255.255.255.0 U 0 0 0 eth2
192.168.1.0 * 255.255.255.0 U 0 0 0 br0
default 192.168.1.1 0.0.0.0 UG 0 0 0 br0
default 192.168.1.1 0.0.0.0 UG 0 0 0 eth2