La virtualización anidada está permitida de forma predeterminada, por lo que, a menos que alguien modifique la restricción de virtualización anidada, no tendrás que hacer ningún cambio antes de crear máquinas virtuales anidadas en una organización, carpeta o proyecto. Si tu proyecto no pertenece a ninguna organización, la virtualización anidada está permitida de forma predeterminada y no puedes cambiar la restricción. Para obtener información sobre cómo modificar la restricción que determina si puedes crear máquinas virtuales anidadas, consulta Gestionar la restricción de virtualización anidada.
En este documento se describe cómo crear varios tipos de instancias de máquina virtual (VM) de nivel 2 (L2). Antes de crear una VM anidada, debes crear una VM de nivel 1 que tenga habilitada la virtualización anidada. Para obtener una descripción de las VMs de nivel 1 y nivel 2, consulta la descripción general de la virtualización anidada.
Después de crear una VM de nivel 1 con la virtualización anidada habilitada, puedes hacer lo siguiente:
- Crear una VM de nivel 2 con acceso a la red externa
- Crear una VM de nivel 2 con un puente de red privada a la VM de nivel 1
- Crear una VM de nivel 2 con acceso a la red desde fuera de la VM de nivel 1
Antes de empezar
-
Si aún no lo has hecho, configura la autenticación.
La autenticación verifica tu identidad para acceder a Google Cloud servicios y APIs. Para ejecutar código o ejemplos desde un entorno de desarrollo local, puedes autenticarte en Compute Engine seleccionando una de las siguientes opciones:
Select the tab for how you plan to use the samples on this page:
gcloud
-
Instala Google Cloud CLI. Después de la instalación, inicializa la CLI de Google Cloud ejecutando el siguiente comando:
gcloud init
Si utilizas un proveedor de identidades (IdP) externo, primero debes iniciar sesión en la CLI de gcloud con tu identidad federada.
- Set a default region and zone.
REST
Para usar las muestras de la API REST de esta página en un entorno de desarrollo local, debes usar las credenciales que proporciones a la CLI de gcloud.
Instala Google Cloud CLI. Después de la instalación, inicializa la CLI de Google Cloud ejecutando el siguiente comando:
gcloud init
Si utilizas un proveedor de identidades (IdP) externo, primero debes iniciar sesión en la CLI de gcloud con tu identidad federada.
Para obtener más información, consulta el artículo Autenticarse para usar REST de la documentación sobre autenticación de Google Cloud .
Crear una VM de nivel 2 con acceso a la red externa
Crea una VM de nivel 2 con acceso a la red externa siguiendo este procedimiento. En este procedimiento se usa
qemu-system-x86_64
para iniciar la VM de nivel 2. Si estás usando otro procedimiento para crear una VM de nivel 2 y tienes problemas, reproduce el problema con este procedimiento antes de ponerte en contacto con el equipo de Asistencia.Crea una VM de nivel 1 que tenga habilitada la virtualización anidada.
Usa el comando
gcloud compute ssh
para conectarte a la VM:gcloud compute ssh VM_NAME
Sustituye
VM_NAME
por el nombre de la VM a la que quieras conectarte.Instala el paquete
qemu-kvm
más reciente:sudo apt update && sudo apt install qemu-kvm -y
Descarga una imagen del SO compatible con QEMU para usarla en la VM de nivel 2.
Usa el siguiente comando para iniciar la VM de nivel 2. Cuando se te solicite, inicia sesión con
user: root
,password: root
.sudo qemu-system-x86_64 -enable-kvm -hda IMAGE_NAME -m 512 -curses
Sustituye
IMAGE_NAME
por el nombre de la imagen del SO compatible con QEMU que quieras usar en la VM de nivel 2.Prueba que tu VM de nivel 2 tenga acceso externo:
user@nested-vm:~$ host google.com
Crear una VM de nivel 2 con un puente de red privada a la VM de nivel 1
Crea una VM de nivel 2 con un puente de red privada a la VM de nivel 1 que has creado anteriormente siguiendo este procedimiento. Para obtener información sobre cómo cambiar la unidad de transmisión máxima (MTU) predeterminada de tu red de VPC, consulta la descripción general de la unidad de transmisión máxima.
Crea una VM de nivel 1 que tenga habilitada la virtualización anidada.
Usa el comando
gcloud compute ssh
para conectarte a la VM:gcloud compute ssh VM_NAME
Sustituye
VM_NAME
por el nombre de la VM a la que quieras conectarte.Instala los paquetes necesarios para crear el puente privado:
sudo apt update && sudo apt install uml-utilities qemu-kvm bridge-utils virtinst libvirt-daemon-system libvirt-clients -y
Inicia la red predeterminada que viene con el paquete
libvirt
:sudo virsh net-start default
Ejecuta el siguiente comando para comprobar que tienes el puente
virbr0
:ip addr
El resultado debería ser similar al siguiente:
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1460 qdisc pfifo_fast state UP group default qlen 1000 link/ether 42:01:0a:80:00:15 brd ff:ff:ff:ff:ff:ff inet 10.128.0.21/32 brd 10.128.0.21 scope global eth0 valid_lft forever preferred_lft forever inet6 fe80::4001:aff:fe80:15/64 scope link valid_lft forever preferred_lft forever 3: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000 link/ether 52:54:00:8c:a6:a1 brd ff:ff:ff:ff:ff:ff inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0 valid_lft forever preferred_lft forever 4: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast master virbr0 state DOWN group default qlen 1000 link/ether 52:54:00:8c:a6:a1 brd ff:ff:ff:ff:ff:ff
Crea una interfaz
tap
para ir de la VM de nivel 1 a la VM de nivel 2:sudo tunctl -t tap0 sudo ifconfig tap0 up
Vincula la interfaz
tap
al puente privado:sudo brctl addif virbr0 tap0
Ejecuta el siguiente comando para verificar la configuración de la red puente:
sudo brctl show
El resultado debería ser similar al siguiente:
bridge name bridge id STP enabled interfaces virbr0 8000.5254008ca6a1 yes tap0 virbr0-nic
Descarga una imagen del SO compatible con QEMU para usarla en la VM de nivel 2.
Ejecuta
screen
y pulsa Intro en la petición de bienvenida:screen
Usa el siguiente comando para iniciar la VM de nivel 2. Cuando se te solicite, inicia sesión con
user: root
,password: root
.sudo qemu-system-x86_64 -enable-kvm -hda IMAGE_NAME -m 512 -net nic -net tap,ifname=tap0,script=no -curses
Sustituye
IMAGE_NAME
por el nombre de la imagen del SO compatible con QEMU que quieras usar en la VM de nivel 2.En la VM de nivel 2, ejecuta
ip addr show
para confirmar que la VM tiene una dirección en el espaciovirbr0
, por ejemplo,192.168.122.89
:user@nested-vm:~$ ip addr
Inicia un servidor web de marcador de posición en el puerto
8000
:user@nested-vm:~$ python -m http.server
Desconéctate de la sesión de
screen
conCtrl+A
,Ctrl+D
.Comprueba que tu VM de nivel 1 puede hacer ping a la VM de nivel 2. Para ello, sustituye la siguiente dirección IP por la dirección IP de la VM de nivel 2:
curl 192.168.122.89:8000
El resultado debería ser similar al siguiente:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"><html> <title>Directory listing for /</title> <body> <h2>Directory listing for /</h2> <hr> <ol> <li><a href=".aptitude/">.aptitude/</a> <li><a href=".bashrc">.bashrc</a> <li><a href=".profile">.profile</a> </ol> <hr> </body> </html>
Crear una VM de nivel 2 con acceso a la red desde fuera de la VM de nivel 1
Puedes configurar una VM de nivel 2 con una IP de alias para que las VMs que no estén en la VM de nivel 1 puedan acceder a la VM de nivel 2. Sigue este procedimiento para crear una VM de nivel 2 con acceso a la red mediante una IP de alias desde fuera de la VM de nivel 1 que has creado anteriormente. Para obtener información sobre cómo crear direcciones IP de alias, consulta Configurar intervalos de IP de alias.
En el siguiente procedimiento se da por supuesta una subred creada anteriormente llamada
subnet1
. Si ya tienes una subred con otro nombre, sustituyesubnet1
por el nombre de tu subred o crea una subred con el nombresubnet1
.Crea una VM de nivel 1 con la virtualización anidada habilitada e incluye un intervalo de IPs alias y compatibilidad con el tráfico HTTP/HTTPS:
gcloud
gcloud compute instances create VM_NAME --enable-nested-virtualization \ --tags http-server,https-server --can-ip-forward \ --min-cpu-platform "Intel Haswell" \ --network-interface subnet=subnet1,aliases=/30
Sustituye
VM_NAME
por el nombre de la VM de nivel 1.REST
POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances { ... "name": VM_NAME, "tags": { "items": [ http-server,https-server ], }, "canIpForward": true, "networkInterfaces": [ { "subnetwork": "subnet1", "aliasIpRanges": [ { "ipCidrRange": "/30" } ], } ], "minCpuPlatform": "Intel Haswell", "advancedMachineFeatures": { "enableNestedVirtualization": true }, ... }
Haz los cambios siguientes:
PROJECT_ID
: el ID del proyectoZONE
: la zona en la que se creará la VMVM_NAME
: el nombre de la VM
Usa el comando
gcloud compute ssh
para conectarte a la VM. Si tienes problemas para conectarte a la máquina virtual, prueba a restablecerla o a modificar las reglas del cortafuegos.gcloud compute ssh VM_NAME
Sustituye
VM_NAME
por el nombre de la VM a la que quieras conectarte.Actualiza la VM e instala los paquetes necesarios:
sudo apt update && sudo apt install uml-utilities qemu-kvm bridge-utils virtinst libvirt-daemon-system libvirt-clients -y
Inicia la red predeterminada que viene con el paquete
libvirt
:sudo virsh net-start default
Ejecuta el siguiente comando para comprobar que tienes el puente
virbr0
:user@nested-vm:~$ ip addr
Verifica que el resultado sea similar al siguiente:
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1460 qdisc pfifo_fast state UP group default qlen 1000 link/ether 42:01:0a:80:00:15 brd ff:ff:ff:ff:ff:ff inet 10.128.0.21/32 brd 10.128.0.21 scope global eth0 valid_lft forever preferred_lft forever inet6 fe80::4001:aff:fe80:15/64 scope link valid_lft forever preferred_lft forever 3: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000 link/ether 52:54:00:8c:a6:a1 brd ff:ff:ff:ff:ff:ff inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0 valid_lft forever preferred_lft forever 4: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast master virbr0 state DOWN group default qlen 1000 link/ether 52:54:00:8c:a6:a1 brd ff:ff:ff:ff:ff:ff
Crea una interfaz
tap
para ir de la VM de nivel 1 a la VM de nivel 2:sudo tunctl -t tap0 sudo ifconfig tap0 up
Vincula la interfaz
tap
al puente privado:sudo brctl addif virbr0 tap0
Ejecuta el siguiente comando para verificar la configuración de la red puente:
sudo brctl show
Verifica que el resultado sea similar al siguiente:
bridge name bridge id STP enabled interfaces virbr0 8000.5254008ca6a1 yes tap0 virbr0-nic
Descarga una imagen del SO compatible con QEMU para usarla en la VM de nivel 2.
Ejecuta
screen
y pulsa Intro en la petición de bienvenida:screen
Usa el siguiente comando para iniciar la VM anidada. Cuando se te solicite, inicia sesión con
user: root
,password: root
.sudo qemu-system-x86_64 -enable-kvm -hda IMAGE_NAME -m 512 -net nic -net tap,ifname=tap0,script=no -curses
Sustituye
IMAGE_NAME
por el nombre de la imagen del SO compatible con QEMU que quieras usar en la VM de nivel 2.En la VM de nivel 2, ejecuta
ip addr
para confirmar que la VM de nivel 2 tiene una dirección en el espacio virbr0, como192.168.122.89
:user@nested-vm:~$ ip addr
Inicia un servidor web de marcador de posición en el puerto
8000
:user@nested-vm:~$ python -m http.server
Desconéctate de la sesión de
screen
conCtrl+A
,Ctrl+D
.Prueba que tu VM de nivel 1 puede hacer ping a la VM de nivel 2. Para ello, sustituye la dirección IP que aparece a continuación por la dirección IP de la VM de nivel 2:
curl 192.168.122.89:8000
Verifica que la respuesta de la VM de nivel 2 sea similar a la siguiente:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"><html> <title>Directory listing for /</title> <body> <h2>Directory listing for /</h2> <hr> <ol> <li><a href=".aptitude/">.aptitude/</a> <li><a href=".bashrc">.bashrc</a> <li><a href=".profile">.profile</a> </ol> <hr> </body> </html>
En la VM de nivel 1, configura
iptables
para permitir la redirección de la VM de nivel 1 a la VM de nivel 2. En el caso de la imagen del SO de nivel 2 que se usa en estas instrucciones, debes vaciar las tablas de IP:sudo iptables -F
Determina la IP de alias de la VM L1:
ip route show table local
Comprueba que el resultado sea similar al siguiente. En este ejemplo, hay dos direcciones IP asociadas al dispositivo Ethernet
eth0
de la VM de nivel 2. La primera,10.128.0.2
, es la dirección IP principal de la VM de nivel 2, que devuelvesudo ifconfig -a
. La segunda,10.128.0.13
, es la dirección IP de alias de la VM de nivel 2.local 10.128.0.2 dev eth0 proto kernel scope host src 10.128.0.2 broadcast 10.128.0.2 dev eth0 proto kernel scope link src 10.128.0.2 local 10.128.0.13/30 dev eth0 proto 66 scope host broadcast 127.0.0.0 dev lo proto kernel scope link src 127.0.0.1 local 127.0.0.0/8 dev lo proto kernel scope host src 127.0.0.1 local 127.0.0.1 dev lo proto kernel scope host src 127.0.0.1 broadcast 127.255.255.255 dev lo proto kernel scope link src 127.0.0.1 broadcast 192.168.122.0 dev virbr0 proto kernel scope link src 192.168.122.1 linkdown local 192.168.122.1 dev virbr0 proto kernel scope host src 192.168.122.1 broadcast 192.168.122.255 dev virbr0 proto kernel scope link src 192.168.122.1 linkdown
Ejecuta los siguientes comandos para reenviar el tráfico de la IP de alias de ejemplo
10.128.0.13
a la IP de ejemplo192.168.122.89
de la máquina virtual de nivel 2:echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward sudo iptables -t nat -A PREROUTING -d 10.128.0.13 -j DNAT --to-destination 192.168.122.89 sudo iptables -t nat -A POSTROUTING -s 192.168.122.89 -j MASQUERADE sudo iptables -A INPUT -p udp -j ACCEPT sudo iptables -A FORWARD -p tcp -j ACCEPT sudo iptables -A OUTPUT -p tcp -j ACCEPT sudo iptables -A OUTPUT -p udp -j ACCEPT
Para obtener información sobre cómo solucionar problemas con
iptables
, consultaiptables
no reenvía tráfico.Verifica el acceso a la VM de nivel 2 desde fuera de la VM de nivel 1. Para ello, inicia sesión en otra VM que esté en la misma red que la VM de nivel 1 y haz una solicitud
curl
a la IP de alias. Sustituye la dirección IP que aparece a continuación por la IP de alias de la VM de nivel 2:user@another-vm:~$ curl 10.128.0.13:8000
Comprueba que la respuesta de
curl
sea similar a la siguiente:<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"><html> <title>Directory listing for /</title> <body> <h2>Directory listing for /</h2> <hr> <ol> <li><a href=".aptitude/">.aptitude/</a> <li><a href=".bashrc">.bashrc</a> <li><a href=".profile">.profile</a> </ol> <hr> </body> </html>
Siguientes pasos
A menos que se indique lo contrario, el contenido de esta página está sujeto a la licencia Reconocimiento 4.0 de Creative Commons y las muestras de código están sujetas a la licencia Apache 2.0. Para obtener más información, consulta las políticas del sitio web de Google Developers. Java es una marca registrada de Oracle o sus afiliados.
Última actualización: 2025-09-12 (UTC).
-