Si virtualizamos bajo Linux/LXD sabremos que este soporta tanto contenedores como máquinas virtuales KVM, el acceso a estas últimas puede ser por puerto serie como VNC, el problema que presenta esta última opción es que es necesario un servidor LXD cliente para lanzar la sesión gráfica, es decir, no podemos acceder a la interfaz VNC a no ser que tengamos un Linux con LXD instalado en local actuando como cliente VNC.
En este tutorial vamos a instalar una Ubuntu server bajo Bhyve donde instalaremos LXD y mediante forwarding SSH lanzaremos la sesión gráfica en nuestro sistema FreeBSD.
El tutorial se compone de las siguientes secciones:
VM-Bhyve:
El primer paso será instalar vm-bhyve el gestor de máquinas virtuales tal como se indica en este artículo anterior.
Descargamos la imagen cloud de Ubuntu server:
Podemos ver las imágenes disponibles;
DATASTORE FILENAME
default ubuntu-22.04-server-cloudimg-amd64.img
Creamos la VM importando nuestra key SSH:
Arrancamos la VM y comprobamos que haya arrancado correctamente:
vm list
NAME DATASTORE LOADER CPU MEMORY VNC AUTO STATE
ubuntu-cloud default grub 4 8G - No Running (78823)
Las imágenes cloud no permiten asignar una ip estática, así que tendremos que averiguar la ip asignada por DHCP en base a su dirección MAC:
fping -ag 192.168.69.0/24
arp -a |grep $MAC
? (192.168.69.209) at 58:9c:fc:07:fd:05 on em0 expires in 1200 seconds [ethernet]
Accedemos a la VM:
Asignamos un password al usuario root y ubuntu:
passwd
passwd ubuntu
Ahora que los usuarios tienen password también podremos acceder por consola si así lo deseamos:
Deshabilitamos la configuración de red por cloud:
network: {config: disabled}
Asignamos una ip estática y configuramos un bridge con la misma MAC que la mostrada en la configuración de la VM, de este modo si necesitamos debugear problemas y localizar la VM por la MAC será mas sencillo:
network:
version: 2
ethernets:
enp0s5:
dhcp4: false
bridges:
br0:
interfaces: [enp0s5]
addresses: [192.168.69.5/24]
routes:
- to: default
via: 192.168.69.200
nameservers:
search: [alfaexploit.com]
addresses: [8.8.8.8, 1.1.1.1]
Reiniciamos:
Volvemos a acceder:
sudo su -l
Instalamos las utilidades base y virt-viewer, x11-apps:
apt install net-tools bridge-utils virt-viewer x11-apps
LXD viene instalado por defecto en la imagen cloud.
Name Version Rev Tracking Publisher Notes
core20 20230622 1974 latest/stable canonical✓ base
lxd 5.0.2-838e1b2 24322 5.0/stable/… canonical✓ -
snapd 2.59.5 19457 latest/stable canonical✓ snapd
Realizamos la configuración inicial de LXD:
Would you like to use LXD clustering? (yes/no) [default=no]:
Do you want to configure a new storage pool? (yes/no) [default=yes]:
Name of the new storage pool [default=default]:
Name of the storage backend to use (ceph, cephobject, dir, lvm, zfs, btrfs) [default=zfs]: dir
Would you like to connect to a MAAS server? (yes/no) [default=no]:
Would you like to create a new local network bridge? (yes/no) [default=yes]: no
Would you like to configure LXD to use an existing bridge or host interface? (yes/no) [default=no]: yes
Name of the existing bridge or host interface: br0
Would you like the LXD server to be available over the network? (yes/no) [default=no]: no
Would you like stale cached images to be updated automatically? (yes/no) [default=yes]:
Would you like a YAML "lxd init" preseed to be printed? (yes/no) [default=no]:
Añadimos el usuario de acceso a algunos grupos administrativos:
exit
Añadimos con el usuario de acceso el remote LXD: hostkr0m
Consultamos los remotes:
+-----------------+------------------------------------------+---------------+-------------+--------+--------+--------+
| NAME | URL | PROTOCOL | AUTH TYPE | PUBLIC | STATIC | GLOBAL |
+-----------------+------------------------------------------+---------------+-------------+--------+--------+--------+
| hostkr0m | https://X.X.X.X:8443 | lxd | tls | NO | NO | NO |
+-----------------+------------------------------------------+---------------+-------------+--------+--------+--------+
| images | https://images.linuxcontainers.org | simplestreams | none | YES | NO | NO |
+-----------------+------------------------------------------+---------------+-------------+--------+--------+--------+
| local (current) | unix:// | lxd | file access | NO | YES | NO |
+-----------------+------------------------------------------+---------------+-------------+--------+--------+--------+
| ubuntu | https://cloud-images.ubuntu.com/releases | simplestreams | none | YES | YES | NO |
+-----------------+------------------------------------------+---------------+-------------+--------+--------+--------+
| ubuntu-daily | https://cloud-images.ubuntu.com/daily | simplestreams | none | YES | YES | NO |
+-----------------+------------------------------------------+---------------+-------------+--------+--------+--------+
Comprobamos que podamos ver las VMs del remote:
+-------------------------+---------+-------------------------+------+-----------------+-----------+
| NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS |
+-------------------------+---------+-------------------------+------+-----------------+-----------+
| ubuntu-desktop-test | RUNNING | 192.168.75.211 (enp5s0) | | VIRTUAL-MACHINE | 0 |
+-------------------------+---------+-------------------------+------+-----------------+-----------+
Cliente:
En nuestro pc debemos autorizar la ip de la VM para poder recibir el tráfico forwardeado de las X:
Arrancamos xclock para comprobar que todo funciona correctamente:
Arrancamos la sesión gráfica de la VM alojada en hostkr0m:
Troubleshooting:
Si estamos haciendo pruebas y reinstalaciones debemos comprobar que no haya ningún conflicto en el knownhosts de SSH o el X11forward no funcionará.