QEMU/Redes

De Wikilibros, la colección de libros de texto de contenido libre.

QEMU soporta redes emulando algunas de las tarjetas de red (NIC) más populares, y estableciendo LAN virtuales (VLAN). Hay cuatro formas en las que los huéspedes de QEMU pueden ser conectados: modo usuario, redirección de conexiones, redes Tap y VDE.

Red en modo usuario[editar]

Si no se especifican opciones de red, QEMU emulara por defecto una única tarjeta de red PCI Intel e1000 con un red en modo usuario que enlaza con la red del host. Los siguientes dos comandos son equivalentes:

qemu -m 256 -hda disk.img &
qemu -m 256 -hda disk.img -net nic -net user &

El sistema operativo guest verá una NIC E1000 con un servidor virtual DHCP en 10.0.2.2 y será asignada con una dirección a partir de 10.0.2.15. Un servidor DNS virtual será accesible en 10.0.2.3, y un servidor SAMBA virtual (si existe) será accesible en 10.0.2.4 permitiendo el acceso a ficheros en el host a través de compartición de ficheros de SAMBA.

La red en modo usuario es buena para permitir el acceso a recursos de red, incluyendo Internet. Por defecto, sin embargo, actúa como un cortafuegos y no permite el tráfico entrante. Tampoco soporta otros protocolos que no sean TCP y UDP - así, por ejemplo, ping y otras utilidades ICMP no funcionarán.

Redireccionamiento de puertos[editar]

Para permitir las conexiones de red hacia el sistema operativo guest bajo el modo usuario de red, se puede redirigir un puerto del sistema operativo host a un puerto del sistema operativo guest. Esto es muy útil para dar soporte a la compartición de ficheros, servidores web y servidores SSH desde el sistema operativo guest.

Así es como se configuraría QEMU con un Windows XP como guest compartiendo ficheros y páginas web bajo el modo usuario de red. El puerto TCP 5555 del host se redirige al puerto 80 del guest (el servidor web) y el puerto 5556 del host al puerto 445 del guest (red de Windows)::

qemu -m 256 -hda disk.img -redir tcp:5555::80 -redir tcp:5556::445 &
...
mkdir -p /mnt/qemu
mount -t cifs //localhost/someshare /mnt/qemu -o user=test,pass=test,dom=workgroup,port=5556
firefox http://localhost:5555/

NOTA: cuando se comparten carpetas desde el guest a través de la red de Windows, se debe especificar una contraseña para el usuario que mount usará para conectarse; si se intenta usar sin contraseña, mount fallará con un error de entrada/salida.

Interfaces TAP[editar]

QEMU puede usar interfaces TAP para proporcionar capacidad de red complete para el sistema operativo guest. Esto puede ser útil cuando el sistema operativo guest está ejecutando varios servicios de red y debe estar conectado a través de puertos estándar; cuando se requieren otros protocolos distintos de TCP y UDP; y cuando múltiples instancias de QEMU necesitan conectarse entre ella (aunque esto se puede conseguir en el modo usuario de red a través de Redireccionamiento de puertos, o a través de conexiones).

En Qemu 1.1 y posteriores, el asistente de puente de red puede configurar tun/tap por el usuario sin necesidad de scripts adicionales.

Para versions más antiguas, configurar una interfaz TAP es un poco más complicado que en modo usuario de red. Se requiere instalar red privada virtual (VPN) en el sistema operativo host, y después establecer un puente entre la red del host y la red virtual.

Así es como se haría con Fedora 8 con asignación estática de direcciones IP. El procedimiento debería ser muy similar en otras distrubuciones Linux, y probablemente no muy diferente en otros sistemas *nix.

Dispositivo TAP/TUN[editar]

Segun tuntap.txt, creamos primero el dispositivo:

   $ sudo mkdir /dev/net
   $ sudo mknod /dev/net/tun c 10 200
   $ sudo /sbin/modprobe tun

qemu-ifup[editar]

Primero, configurar un script para crear el Puente y levantar la interfaz TAP. Llamaremos a este script /etc/qemu-ifup.

#!/bin/sh 
# 
# script para levantar el dispositivo tun en QEMU en modo puenteado 
# el primer parametro es el nombre del dispositivo tap (ej. tap0)
#
# algunas constantes especificas del host local - cambiarlas para que se ajuste a su host
#
ETH0IPADDR=192.168.0.3
GATEWAY=192.168.0.1
BROADCAST=192.168.0.255
#
# Primero tiramos eth0, después lo levantamos con la dirección IP 0.0.0.0 
#
/sbin/ifdown eth0
/sbin/ifconfig eth0 0.0.0.0 promisc up
#
# Levantamos el dispositivo tap (el nombre sera el especificado como primer argumento en QEMU)
#
/usr/sbin/openvpn --mktun --dev $1 --user `id -un`
/sbin/ifconfig $1 0.0.0.0 promisc up
#
# crear el puente entre eth0 y el dispositivo tap
#
/usr/sbin/brctl addbr br0
/usr/sbin/brctl addif br0 eth0
/usr/sbin/brctl addif br0 $1
# 
# solo un puente para que los bucles no sean posibles, apagamos el STP (spanning tree protocol)
#
/usr/sbin/brctl stp br0 off 
# 
# Levantamos el puente con ETH0IPADDR y añadimos la ruta por defecto 
#
/sbin/ifconfig br0 $ETH0IPADDR netmask 255.255.255.0 broadcast $BROADCAST
/sbin/route add default gw $GATEWAY
#
# parar el cortafuegos - comentar esta línea si no se usa Firestarter
#
/sbin/service firestarter stop 

qemu-ifdown[editar]

También se necesitará un script para reiniciar la configuración de red después de salir de QEMU. Para ser consistente, lo llamaremos /etc/qemu-ifdown.

#!/bin/sh 
# 
# Script para tirar y borrar el puente br0 cuando salimos de QEMU 
# 
# Tirar eth0 y br0 
#
/sbin/ifdown eth0
/sbin/ifdown br0
/sbin/ifconfig br0 down 
# 
# Borrar el puente
#
/usr/sbin/brctl delbr br0 
# 
# Levantar eth0 en modo "normal" 
#
/sbin/ifconfig eth0 -promisc
/sbin/ifup eth0 
#
# Eliminar el dispositivo tap
#
/usr/sbin/openvpn --rmtun --dev $1
#
# Iniciar el cortafuegos de nuevo
# 
/sbin/service firestarter start 

Permitir a los usuarios ejecutar los scripts[editar]

En qemu 1.1 y posteriores solo hay que usar el de red, que no requiere ningún script y puede autoidentificarse como root.

Para versiones anteriores, los dos scripts anteriores se deben ejecutar como superusuario, para que puedan modificar las configuraciones de red del sistema. La mejor manera de conseguirlo es permitir a los usuarios de QEMU llamar a los scripts usando el comando sudo. Para configurar esto, hay que añadir lo siguiente al fichero /etc/sudoers:

User_Alias QEMUERS = fred, john, milly, ...

Cmnd_Alias QEMU = /etc/qemu-ifup, /etc/qemu-ifdown

QEMUERS ALL=(ALL) NOPASSWD: QEMU

Iniciar QEMU con una interfaz TAP[editar]

A continuación crear un script para iniciar QEMU con una VLAN, y que se restaure todo cuando finalice. Este utiliza tap0. Especificar script=no indica a QEMU que solo use el dispositivo tap sin llamar a los scripts - hacemos esto para que QEMU pueda ser ejecutado como un usuario normal, no root.

#!/bin/sh 
sudo /etc/qemu-ifup tap0
qemu -m 256 -hda disk.img -net nic -net tap,ifname=tap0,script=no,downscript=no
sudo /etc/qemu-ifdown tap0

Ejecutar el script, y éste creará la interfaz TAP, lo puenteará con eth0, ejecutará QEMU, y tirará el puente y la interfaz TAP cuando finalice..

Conexiones[editar]

QEMU puede conectar múltiples sistemas operativos guests en una VLAN usando conexiones TCP o UDP.

Esta descrito aquí

Servidor SMB[editar]

Si el sistema host tiene un servidor SMB instalado (SAMBA/CIFS en *nix), QEMU puede emular un servidor SMB virtual para el sistema guest usando la opción -–smb. Especificar la carpeta a compartir y esta estará disponible para el guest en \\10.0.2.4\qemu (or puede poner 10.0.2.4 en el fichero hosts o lmhosts como smbserver y conectarlo a \\smbserver\qemu).

qemu -m 256 disk.img -smb /usr/workspace/testing01

Esto no es estrictamente necesario, porque los guests en QEMU pueden acceder normalmente a los servidores SMB en el entorno del host. Puede ser muy útil, sin embargo, para la configuración de espacios de trabajo independientes para cada guest de QEMU sin necesidad de configurar las comparticiones SMB para cada uno.

Enlaces externos[editar]