Clase 5: Práctica: QEMU/KVM + libvirt
Objetivos del proyecto
- Crear un escenario virtualizado con QEMU/KVM + libvirt en un servidor sin entorno gráfico.
- Practicar las distintas operaciones sobre los recursos virtualizados que hemos aprendido en esta unidad.
- Vamos a crear una infraestructura con un servidor web que sirva el contenido estático desde un directorio compartido por un servidor NAS.
Se deberá entregar un documento pdf con la documentación donde se expliquen las operaciones realizadas. El documento tendrá al menos los siguientes apartados:
- Título
- Índice
- Introducción
- Instalación de QEMU / KVM + libvirt
- Creación y configuración de la infraestructura
- Instalación de servicios
- Otras operaciones
- Comprobaciones finales
Tienes que tener en cuenta:
- Puedes poner más apartados o cambiar los nombres que yo he puesto.
- Los apartados pueden tener subapartdos.
- Los apartados y subapartados deben estar numerados.
- El índice debe ser autogenerado.
- Todo el código debe tener una fuente monoespaciada.
Entorno de trabajo
La práctica la vamos a realizar en una instancia de OpenStack. Elige el sabor m1.kvm para crear dicha instancia. En esa instancia instalaremos QEMU/KVM + libvirt.
Dado que OpenStack suele operar sobre redes encapsuladas (por ejemplo, con VXLAN o GRE), el tamaño efectivo de las tramas se reduce. Cuando usamos una instancia de OpenStack como servidor de virtualización, es necesario ajustar el tamaño máximo de los paquetes de red (MTU) para que coincida con el de la red del entorno. Configurar la red de libvirt con un MTU de 1442 evita problemas de comunicación entre las máquinas virtuales, garantizando que los paquetes se transmitan correctamente sin cortes ni errores.
Añade mi clave pública a la instancia.
En la documentación sólo tienes que indicar la IP flotante de la instancia.
Infraestructura que vamos a crear

- Redes que vamos a crear:
- Debes crear una nueva red de tipo NAT
defaultcon las mismas características que en tu host pero con MTU de 1442. - Crea una red muy aislada
red_intra, recuerda también configurar de manera adecuada el MTU.
- Debes crear una nueva red de tipo NAT
- Máquinas virtuales:
router:- Máquina virtual con Debian 13.
- Realiza la instalación por red.
- Está conectada a la red default y la red_intra.
- El hostname de esta máquina debe ser
router-tunombre. - Se debe poder acceder a ella por ssh con el usuario
usersin que te pida contraseña (configura tu clave pública y la mia). * El usuariouserdebe poder ejecutar el comandosudosin que te pida contraseña. - Está máquina se debe iniciar cada vez que arrancamos el host.
servidorNAS:- Máquina virtual con Alpine 3.22.
- Realiza la instalación desde una imagen ISO.
- Esta máquina debe tener un disco extra de 1Gb que deberás montar en el directorio
/srv/data. - El hostname de esta máquina debe ser
nas-tunombre. - Se debe poder acceder a ella por ssh con el usuario
usersin que te pida contraseña (configura tu clave pública y la mia). - Está máquina se debe iniciar cada vez que arrancamos el host.
servidorWeb:- Máquina virtual Ubuntu 24.04.
- Crea esta máquina usando clonación enlazada y configuración de cloud-init desde la imagen cloud.
- El hostname de esta máquina debe ser
web-tunombre. - Se debe poder acceder a ella por ssh con el usuario
usersin que te pida contraseña (configura tu clave pública y la mia). - Está máquina se debe iniciar cada vez que arrancamos el host.
- Configura la máquina router para que haga SNAT y permita que las máquinas tengan acceso al exterior (La configuración debe ser persistente.).
Instalación de servicios
- Instala el servidor web nginx en el
servidorWeb. - Para que podemos acceder desde el exterior a la página web, vamos a realizar dos configuraciones:
- Configuramos un proxy inverso en la instancia de OpenStack que envíe todas las peticiones al puerto 80 del
router. - Configuramos el
routerpara que podamos acceder al servidor web desde el exterior.
- Configuramos un proxy inverso en la instancia de OpenStack que envíe todas las peticiones al puerto 80 del
- Instala en el
servidorNASun servidor nfs y comparte el directorio/srv/datadonde has guardado una página web estática, una plantilla HTML con CSS o la página generada en IAW. En la página principal debe aparecer tu nombre completo y la fecha. - Monta en el
servidorWebel directorio compartido en/var/www/datay crea un Virtual Host que sirva ese sitio web usando el nombredata.tunombre.org.
Otras operaciones
- El disco donde tenemos la información de la página web en el
servidorNASse ha quedado pequeño. Redimensiona el disco y el sistema de ficheros a 2GB. - Realiza un snapshot a cada una de las máquinas para que podemos volver a ese estado si tenemos algún problema. Muestra la lista de snapshots.
Comprobaciones finales
Comprueba que el escenario funciona de forma correcta. Muestra en la documentación las comprobaciones que has realizado.
Comprueba lo siguiente: si cambias el contenido de la página web en el servidorNAS automáticamente accedemos a la página para comprobar que ha cambiado.
Nota sobre iptables y proxy inverso
En la práctica pone “Configuramos un proxy inverso en la instancia de OpenStack que envíe todas las peticiones al puerto 80 del router”. Hay que tener en cuenta que también se puede hacer con iptables, para ello:
- Activar el bit de forwarding.
-
Hay que crear una regla DNAT:
iptables -t nat -A PREROUTING -i ens3 -p tcp --dport 80 -j DNAT --to-destination 192.168.122.197:80 -
En este caso al crear la red
defaultcon libvirt se introducen reglas iptables muy restrictivas por lo que hay que permitir explícitamente que los paquetes pasen deens3avirbr0y al contrario, para ello:iptables -I FORWARD 1 -i ens3 -o virbr0 -p tcp --dport 80 -d 192.168.122.197 -j ACCEPT iptables -I FORWARD 2 -i virbr0 -o ens3 -p tcp --sport 80 -s 192.168.122.197 -j ACCEPT
Aunque también podemos hacerlo a nivel de aplicación usando un proxy inverso, por ejemplo suponiendo que tenemos nginx. En /etc/nginx/sites-available/default:
...
location / {
proxy_pass http://192.168.122.197/;
proxy_redirect http://192.168.122.197/ /;
include proxy_params;
}
...