---
title: "Cómo configurar redes virtuales con libvirt en Ubuntu 24.04"
description: "Configura redes virtuales de libvirt en Ubuntu 24.04: NAT, reservas DHCP, redes aisladas, enrutadas y en puente con netplan para conectar tus VMs KVM a la LAN."
category: "Virtualization VPS"
language: es
source: https://cubepath.com/es/docs/virtualization-vps/configuracion-de-red-virtual-con-libvirt
updated: 2026-09-25
---
# Cómo configurar redes virtuales con libvirt en Ubuntu 24.04
libvirt gestiona las redes de las máquinas virtuales KVM con redes virtuales: cada una es un bridge de Linux en el anfitrión (`virbr0`, `virbr1`...) con, opcionalmente, DHCP y DNS servidos por dnsmasq y reglas de firewall para NAT o enrutamiento. Elegir el modo adecuado decide si tus VMs pueden salir a Internet, si son accesibles desde fuera y si pueden hablar entre ellas.
En este tutorial revisarás la red NAT por defecto, reservarás IPs fijas por DHCP, crearás una red aislada y una enrutada, y conectarás VMs directamente a la red física mediante un bridge configurado con netplan, todo en Ubuntu 24.04.
## Requisitos previos
- Un anfitrión con Ubuntu 24.04 LTS con KVM y libvirt instalados, y tu usuario en el grupo `libvirt` con `LIBVIRT_DEFAULT_URI=qemu:///system`. La guía de instalación de KVM/QEMU en Linux explica cómo prepararlo.
- Al menos una VM. Los ejemplos usan `vm1`.
- Para la red en puente: acceso a la consola del servidor (IPMI, KVM remoto o consola del proveedor), porque un error en netplan puede cortar la conexión SSH.
## Modos de red de libvirt
| Modo | Salida a Internet | Accesible desde fuera | Uso típico |
|---|---|---|---|
| NAT (por defecto) | Sí, con la IP del anfitrión | No | Laboratorios, VMs que solo necesitan salir |
| Aislada | No | No | Redes internas entre VMs, bases de datos, pruebas |
| Enrutada | Sí, sin NAT | Sí, si la red externa tiene ruta hacia la subred | Subredes propias enrutadas al anfitrión |
| Puente (bridge) | Sí, como un equipo más de la LAN | Sí | VMs con IP de la red física |
## Paso 1: Revisar la red NAT por defecto
Al instalar libvirt se crea la red `default`: NAT sobre `192.168.122.0/24`, con el anfitrión en `192.168.122.1` haciendo de puerta de enlace, DHCP y DNS. Lista las redes:
```bash
virsh net-list --all
```
```output
Name State Autostart Persistent
--------------------------------------------
default active yes yes
```
Muestra su definición:
```bash
virsh net-dumpxml default
```
```xml
default
2b9f4c1e-6d0a-4f7e-9c3b-8a1d5e2f7c60
```
En el anfitrión, la red es el bridge `virbr0`:
```bash
ip -brief addr show virbr0
```
```output
virbr0 UP 192.168.122.1/24
```
Las concesiones DHCP muestran qué IP tiene cada VM:
```bash
virsh net-dhcp-leases default
```
```output
Expiry Time MAC address Protocol IP address Hostname Client ID or DUID
-----------------------------------------------------------------------------------------------------------
2026-09-25 12:41:05 52:54:00:3b:8a:12 ipv4 192.168.122.57/24 vm1 ff:56:50:4d:98:...
```
libvirt activa por sí mismo el reenvío IP (`net.ipv4.ip_forward`) y añade las reglas de NAT al arrancar la red; no hace falta configurarlas a mano.
## Paso 2: Reservar una IP fija por DHCP
Para que una VM tenga siempre la misma IP sin configurarla dentro del invitado, crea una reserva DHCP ligada a su MAC. Obtén la MAC de la VM:
```bash
virsh domiflist vm1
```
```output
Interface Type Source Model MAC
-------------------------------------------------------------
vnet0 network default virtio 52:54:00:3b:8a:12
```
Añade la reserva a la red `default`. `--live` la aplica a la red en marcha y `--config` la guarda de forma persistente:
```bash
virsh net-update default add ip-dhcp-host "" --live --config
```
Comprueba que aparece en la definición:
```bash
virsh net-dumpxml default | grep "host mac"
```
```output
```
La VM recibirá la nueva IP cuando renueve la concesión. Reiníciala o renueva DHCP desde dentro, y verifica con `virsh domifaddr vm1`. Elige IPs fijas que no choquen con otras reservas; si quieres separarlas del rango dinámico, reduce el `` de la red con `virsh net-edit default`.
## Paso 3: Crear una red aislada
Una red aislada conecta VMs entre sí y con el anfitrión, sin salida a Internet. Es útil para el tráfico interno, por ejemplo entre una aplicación y su base de datos. Crea el archivo XML:
```bash
nano ~/red-interna.xml
```
```xml
interna
```
Al no tener elemento ``, libvirt no crea reglas de NAT ni de reenvío. Define la red, iníciala y márcala para arrancar con el sistema:
```bash
virsh net-define ~/red-interna.xml
virsh net-start interna
virsh net-autostart interna
```
Verifica que está activa:
```bash
virsh net-list
```
```output
Name State Autostart Persistent
--------------------------------------------
default active yes yes
interna active yes yes
```
Añade a `vm1` una segunda interfaz conectada a esta red, en caliente y de forma persistente:
```bash
virsh attach-interface vm1 network interna --model virtio --live --config
```
Dentro de la VM aparecerá una nueva interfaz (por ejemplo `enp7s0`). En las imágenes cloud de Ubuntu, netplan solo configura por DHCP la interfaz inicial, así que añade la nueva en el invitado:
```bash
sudo nano /etc/netplan/60-interna.yaml
```
```yaml
network:
version: 2
ethernets:
enp7s0:
dhcp4: true
dhcp4-overrides:
use-routes: false
```
`use-routes: false` evita que esta interfaz añada una ruta por defecto que compita con la de la red NAT. Aplica la configuración en la VM y comprueba la IP:
```bash
sudo chmod 600 /etc/netplan/60-interna.yaml
sudo netplan apply
ip -brief addr
```
Sustituye `enp7s0` por el nombre real que muestre `ip link` en tu VM. Repite con otra VM y comprueba que se ven con `ping` entre sus IPs `10.10.10.x`.
## Paso 4: Crear una red enrutada
En modo enrutado, el anfitrión reenvía el tráfico de la subred de las VMs sin NAT: las VMs salen con sus propias IPs. Tiene sentido cuando dispones de una subred que tu router o proveedor enruta hacia la IP del anfitrión. Si nadie en la red externa sabe llegar a esa subred, el tráfico de vuelta se perderá.
Crea la definición, sustituyendo `10.20.0.0/24` por tu subred:
```bash
nano ~/red-enrutada.xml
```
```xml
enrutada
```
Define e inicia la red:
```bash
virsh net-define ~/red-enrutada.xml
virsh net-start enrutada
virsh net-autostart enrutada
```
En el router de tu red, añade una ruta estática hacia `10.20.0.0/24` con la IP del anfitrión como siguiente salto. Si el router es otro servidor Linux, sería:
```bash
sudo ip route add 10.20.0.0/24 via your_server_ip
```
Para comprobarlo, conecta una VM a la red `enrutada` y haz `ping` a su IP `10.20.0.x` desde un equipo de la red externa.
## Paso 5: Conectar las VMs a la red física con un bridge
En modo puente, las VMs se conectan a la misma red que la interfaz física del anfitrión y obtienen IPs de esa red, como cualquier otro equipo. Hay que convertir la interfaz física en miembro de un bridge `br0` que pasa a tener la IP del anfitrión.
> Importante: muchos proveedores de hosting solo aceptan tráfico de la MAC de la interfaz física del servidor y descartan las MAC de las VMs. Antes de usar un bridge en un servidor alojado, confirma con tu proveedor cómo se asignan IPs adicionales a VMs. En una LAN propia funciona sin más.
Identifica la interfaz física y la configuración actual de netplan:
```bash
ip -brief link
ls /etc/netplan/
```
Haz una copia de seguridad del archivo actual (el nombre puede variar, por ejemplo `50-cloud-init.yaml`):
```bash
sudo cp /etc/netplan/50-cloud-init.yaml ~/50-cloud-init.yaml.bak
```
Edita la configuración para que la IP pase de la interfaz física al bridge. Este ejemplo usa la interfaz `eno1` y una IP estática; sustituye las direcciones por las tuyas:
```bash
sudo nano /etc/netplan/50-cloud-init.yaml
```
```yaml
network:
version: 2
ethernets:
eno1:
dhcp4: false
bridges:
br0:
interfaces:
- eno1
addresses:
- 192.168.1.50/24
routes:
- to: default
via: 192.168.1.1
nameservers:
addresses:
- 1.1.1.1
- 9.9.9.9
parameters:
stp: false
forward-delay: 0
```
Si el archivo lo genera cloud-init, evita que lo sobrescriba en el siguiente arranque:
```bash
echo 'network: {config: disabled}' | sudo tee /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg
```
Aplica los cambios con `netplan try`, que revierte la configuración automáticamente si no confirmas con `Enter` en 120 segundos. Así no te quedas sin acceso si algo falla:
```bash
sudo netplan try
```
Verifica que la IP está ahora en `br0`:
```bash
ip -brief addr show br0
```
```output
br0 UP 192.168.1.50/24
```
Crea una red de libvirt que use ese bridge, para poder conectar VMs por nombre de red:
```bash
nano ~/red-puente.xml
```
```xml
puente
```
```bash
virsh net-define ~/red-puente.xml
virsh net-start puente
virsh net-autostart puente
```
En este modo libvirt no ofrece DHCP: la VM obtendrá la IP del DHCP de tu red o tendrás que configurarla estática dentro del invitado. Conecta una VM:
```bash
virsh attach-interface vm1 network puente --model virtio --live --config
```
Comprueba desde otro equipo de la LAN que llegas a la IP que haya recibido la VM.
## Paso 6: Gestionar y eliminar redes
Para editar una red persistente, usa `net-edit`. La mayoría de los cambios se aplican al reiniciar la red, lo que desconecta momentáneamente las VMs que la usan:
```bash
virsh net-edit interna
virsh net-destroy interna
virsh net-start interna
```
Tras reiniciar una red, las VMs en marcha pierden su conexión con el bridge. Reconéctalas apagándolas y arrancándolas con `virsh shutdown` y `virsh start`.
Para eliminar una red, detenla y borra su definición:
```bash
virsh net-destroy enrutada
virsh net-undefine enrutada
```
Antes, desconecta las interfaces de las VMs que la usen con `virsh detach-interface vm1 network --mac 52:54:00:xx:xx:xx --live --config`, usando la MAC que muestre `virsh domiflist vm1`.
## Solución de problemas
- **`error: Failed to start network ... Network is already in use by interface`**: la subred de la red choca con otra interfaz del anfitrión. Elige otra subred en el XML.
- **`virsh net-start` falla por el bridge `br0` en modo puente**: el bridge no existe en el sistema. Comprueba con `ip link show br0` que netplan lo creó.
- **Las VMs no obtienen IP en una red NAT o aislada**: comprueba que la red está `active` con `virsh net-list` y que dnsmasq está en marcha con `ps aux | grep dnsmasq`. Revisa si el invitado usa DHCP en esa interfaz.
- **Las VMs en NAT no salen a Internet tras instalar un firewall**: libvirt añade sus reglas al arrancar la red; si recargaste el firewall después, reinicia libvirt con `sudo systemctl restart libvirtd` para que vuelva a crearlas.
- **Te quedas sin conexión al configurar el bridge**: si no confirmaste `netplan try`, la configuración se revierte sola. Si usaste `netplan apply`, entra por la consola del servidor y restaura la copia de seguridad.
## Conclusión
Has revisado la red NAT de libvirt, fijado IPs por DHCP, creado una red aislada para tráfico interno, una red enrutada sin NAT y un bridge para conectar VMs a la red física. Como siguientes pasos:
- Publica servicios de VMs en red NAT con un proxy inverso (Nginx o HAProxy) en el anfitrión.
- Combina una red aislada para el tráfico interno con NAT o puente solo en las VMs que lo necesiten.
- Consulta la documentación de formato de redes de libvirt (`https://libvirt.org/formatnetwork.html`) para IPv6, DNS y otras opciones.