sábado, 13 de marzo de 2010

Instalación de la interfaz virtual TUN/TAP en Fedora 12 para QEMU

Instalación de la interfaz virtual TUN/TAP en Fedora 12 para QEMU

Introducción

El blog estaba abandonado, más aún no había ninguna entrada sobre linux, en este sentido he sacrificado una tarde de verano para dejar este tutorial que espero que les sirva y le saquen provecho.

Las interfaces virtuales sirven para distintos propócitos, en mi caso necesito simular la plataforma ARM Integrator con una interfaz de red, que cuente con toda las características de una interfaz real. Si bien el simulador, QEMU, proporciona una interfaz virtual, está solo es accesible desde el simulador hacia afuera sin embargo no es posible acceder desde la pc hacia el simulador, en mi caso estoy simulando algunos servicios en la plataforma ARM Integrator y necesito una interfaz virtual con todas las características de una interfaz de red normal.

Despues de buscar en google la información necesaria (generalmente de foros y blogs de linux) logré la configuración correcta, estos pasos que voy a mostrar funcionan en Fedora 12, supongo que para otras versiones de Fedora (en su mayoría recientes) se seguirá un proceso similar. Para otras distribuciones los pasos varían un poco por lo que es mejor buscar el procedimiento para esa distribución específica.

Instalación

Buno, manos a la obra, en primer lugar necesitamos instalar los paquetes necesarios, en este caso necesitamos instalar bridge-utils que porporciona la funcionalidad de bridge (o switch cómo generalmente lo conocemos en Perú), adicionalmente necesitamos instalar tun que es el driver con el que se maneja las interfaces virtuales y finalmente necesitamos una herramienta llamanta tun-ctl la cual nos permite crear interfaces TAP empleando el driver TUN, resumiendo los paquetes son los siguientes

  1. bridge-utils: driver que proporciona funcionalidad de bridge

  2. tun: driver para manejar interfaces virtuales

  3. tun-ctl: herramienta para crear interfaces virtuales TAP

La instalación de estos paquetes lo hacemos empleando yum del modo siguiente

$sudo yun install bridge-utils tun-ctl

Como ven, no es necesario instalar tun ya que es parte del kernel lo que debemos hacer es intalarlo como módulo y verificar si el módulo se instalo correctamente esto lo hacemos así:

$sudo modprobe tun

Para verificar la instalación del driver podemos revisar la vitácora del sistema con este comando

$sudo tail /var/log/messages

entre las últimas lineas de deve de encontrar algo similar a lo siguiente

Mar 13 19:52:31 dpinspiron kernel: tun: Universal TUN/TAP device driver, 1.6

Mar 13 19:52:31 dpinspiron kernel: tun: (C) 1999-2004 Max Krasnyansky

adicionalmente podemos verificar si se ha registrado el dispositivo tun con el siguiente comando

$ ls -l /dev/net

debe mostrar la siguiente linea

crw-rw-rw-. 1 root root 10, 200 2010-03-13 09:08 tun

Si todo está de acuerdo a lo que muestro entonces podremos ir al siguiente paso que es la configuración

Configuración

En primer lugar vamos ha crear el archivo de configuración de la interfaz bridge, esta interfaz va a ser como nuestro switch al que luego le agregaremos las interfaces de red que deseemos, sin embargo esta interfaz bridge también puede tener una dirección ip asignada de manera estática o mediante dhcp, bueno sin más preambulo creamos el fichero ifcfg-br0

$sudo vi /etc/sysconfig/network-scripts/ifcfg-br0

con el siguiente contenido

# Interface bridge0

DEVICE=br0

ONBOOT=yes

BOOTPROTO=static

TYPE=Bridge

IPADDR=192.168.0.254

NETMASK=255.255.255.0

NM_CONTROLLED=no

PEERDNS=yes

la opción NM_CONTROLLED=no hace que el programa NetworkManager no administre de manera automática esta interfaz. A continuación debemos de editar la configuración de las interfaces ethernet que deseamos que formen parte del bridge, en mi caso sólo dispongo de la interfaz eth0, puesto que no es posible agragar interfaces wireless (al menos así dice la teoría y yo le creo). Bueno, entonces editamos la configuración de la interfaz de red eth0 de la siguiente manera

$ sudo vi /etc/sysconfig/network-scripts/ifcfg-eth0

y lo modificamos (o lo creamos en el caso que no exista) de la siguiente manera

# Interfaz Ethernet Eth0

DEVICE=eth0

HWADDR=00:1C:23:95:B6:A3

ONBOOT=yes

BOOTPROTO=static

IPADDR=192.168.0.1

NETMASK=255.255.255.0

TYPE=Ethernet

NM_CONTROLLED=no

BRIDGE=br0

En mi caso le he asignado una dirección estática debido a que salgo a internet por la red inalámbrica, sin embargo en el trabajo tendré con cambiarla por dhcp. Como se deben de haber percatado la opción BRIDGE=br0 hace que la interfaz eth0 forme parte del bridge (o como ya dije del switch por decirlo en de la manera coloquial). Bueno ahora sólo nos queda crear el archivo de configuración de nuestra interfaz virtual tap0 para esto creamos el fichero ifcfg-tap0

sudo vi /etc/sysconfig/network-scripts/ifcfg-tap0

el contenido de este fichero deberá ser el siguiente

# Interfaz Virtual TUN/TAP Tap0

DEVICE=tap0

ONBOOT=no

BOOTPROTO=static

TYPE=Tap

NM_CONTROLLED=no

BRIDGE=br0

En mi caso no es necesario asignarle una dirección ip puesto que será qemu el encargado de configurar la interfaz.

Inicialización

Si tenemos suerte entonces podemos reiniciar los servicios de red de la siguiente manera

$ sudo service network restart

El resultado debe ser el sigueinte

Shutting down interface br0: [ OK ]

Shutting down interface eth0: [ OK ]

Shutting down loopback interface: [ OK ]

Bringing up loopback interface: [ OK ]

Bringing up interface eth0: [ OK ]

Bringing up interface br0: [ OK ]

Y para terminar iniciamos la interfaz tap0

$ sudo ifup eth0

Verificación

Para verificar que todo haya salido de acuerdo a lo planeado ejecutamos el siguiente comando

$ ifconfig

la salida debe ser la sigueinte

br0 Link encap:Ethernet HWaddr 00:1C:23:95:B6:A3

inet addr:192.168.0.254 Bcast:192.168.0.255 Mask:255.255.255.0

inet6 addr: fe80::21c:23ff:fe95:b6a3/64 Scope:Link

UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1

RX packets:0 errors:0 dropped:0 overruns:0 frame:0

TX packets:34 errors:0 dropped:0 overruns:0 carrier:0

collisions:0 txqueuelen:0

RX bytes:0 (0.0 b) TX bytes:5373 (5.2 KiB)


eth0 Link encap:Ethernet HWaddr 00:1C:23:95:B6:A3

UP BROADCAST RUNNING PROMISC MULTICAST MTU:1500 Metric:1

RX packets:0 errors:0 dropped:0 overruns:0 frame:0

TX packets:0 errors:0 dropped:0 overruns:0 carrier:0

collisions:0 txqueuelen:1000

RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)

Interrupt:21


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:88 errors:0 dropped:0 overruns:0 frame:0

TX packets:88 errors:0 dropped:0 overruns:0 carrier:0

collisions:0 txqueuelen:0

RX bytes:5280 (5.1 KiB) TX bytes:5280 (5.1 KiB)


tap0 Link encap:Ethernet HWaddr AA:BA:D3:D9:89:F2

UP BROADCAST RUNNING PROMISC MULTICAST MTU:1500 Metric:1

RX packets:0 errors:0 dropped:0 overruns:0 frame:0

TX packets:0 errors:0 dropped:6 overruns:0 carrier:0

collisions:0 txqueuelen:500

RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)


wlan0 Link encap:Ethernet HWaddr 00:1C:26:98:60:67

inet addr:192.168.1.34 Bcast:192.168.1.255 Mask:255.255.255.0

inet6 addr: fe80::21c:26ff:fe98:6067/64 Scope:Link

UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1

RX packets:150927 errors:0 dropped:0 overruns:0 frame:0

TX packets:101489 errors:0 dropped:0 overruns:0 carrier:0

collisions:0 txqueuelen:1000

RX bytes:203655276 (194.2 MiB) TX bytes:10828922 (10.3 MiB)

Debemos de tener como mínimo nuestra interfaz br0, eth0 y tap0. Puden darse cuanta que en mi caso mi interfaz eth0 no tiene la dirección ip, sospecho que esto se debe a que no está con el cable de red sin embargo le podemos asignar una dirección ip manualmente con el comando

$ sudo ifconfig eth0 192.168.0.1

Adicionalmente podemos ususar la herramienta brctl

$ brctl show

bridge name bridge id STP enabled interfaces

br0 8000.001c2395b6a3 no eth0

tap0

pan0 8000.000000000000 no

Como se puede observar las interfaces eth0 y tap0 forman parte del br0

Finalización

Con está interfaz virtual podemos proporcionar full conectividad a nuestras máquinas virtuales que corremos con virtual box o qemu, en mi caso estoy empleando qemu para simular la plataforma ARM Integrator por lo que inicio el simulador de la sigueinte manera

sudo qemu-system-arm -kernel images/zImage -initrd images/initrd.gz -append "console=ttyAMA0 root=/dev/ram0 rw ramdisk_size=90000" -nographic -net nic -net tap,ifname=tap0,script=no

Eso ha sido todo, cualquier información no duden en preguntar. Saludos y hasta la próxima.