NFS es un excelente protocolo para compartir archivos de forma rápida y sencilla a través de la red. Aunque no está diseñado para usuarios finales, es ideal para montar directorios desde máquinas remotas y obtener un buen rendimiento. La falta de autenticación en NFS, curiosamente, puede considerarse una ventaja. Esto no solo elimina la sobrecarga y complejidad de aplicaciones y protocolos adicionales, sino que también te obliga a planificar adecuadamente su uso, ya sea configurando un firewall o ejecutándolo sobre una VPN.
Sin embargo, si intentas montar un recurso NFS desde un contenedor LXC, es probable que obtengas un error del tipo “Permission denied” incluso siendo root:
example:~# mount x.x.x.x:/mnt/test-pool/test /mnt/nfs
mount: permission denied (are you root?)
example:~# whoami
root
¿Qué está ocurriendo?
Aislamiento en LXC
LXC es una tecnología de contenedores que, aunque similar a Docker, tiene diferencias significativas y satisface otras necesidades. Por ejemplo, es común ejecutar Docker dentro de un contenedor LXC, pero intentar lo contrario o ejecutar Docker dentro de Docker puede resultar extraño.
El aislamiento de LXC se basa parcialmente en AppArmor, que es precisamente lo que impide montar recursos NFS en un contenedor LXC. En Linux, NFS está implementado a nivel del kernel. Existen algunas implementaciones en espacio de usuario como unfs3
y nfs-ganesha
, pero no son muy populares ni confiables (y no logré que funcionaran).
¿Qué es el modo “privilegiado”?
LXC tiene un concepto llamado modo privilegiado, que por defecto está desactivado. Esto significa que los IDs de usuario de los contenedores LXC son diferentes a los del host. Por lo tanto, los procesos que se ejecutan como root (ID 0) dentro de un contenedor LXC no tendrán el mismo ID 0 en el host. Esto agrega una capa de seguridad adicional en caso de que un atacante logre escapar del aislamiento del contenedor, aunque sea poco probable.
En comparación, Docker no funciona de la misma manera: el ID dentro del contenedor es el mismo que en el host. Esto facilita la gestión de volúmenes, pero hace que sea más importante evitar ejecutar procesos de Docker como root.
En mi opinión, el término “privilegiado” no es el más adecuado, ya que sugiere que elimina más medidas de seguridad de LXC de las que realmente lo hace. Aunque no recomiendo usar este modo a menos que sea absolutamente necesario, su impacto no llega al nivel de la opción privileged: true
de Docker.
Compatibilidad con NFS
Para habilitar el soporte de NFS en un contenedor LXC, es necesario ajustar algunas de las restricciones de AppArmor. Existen guías en línea que indican cómo modificar los perfiles de AppArmor para permitir a LXC montar NFS, pero en mi experiencia, ninguna funcionó correctamente. Estas soluciones suelen implicar la creación de un perfil personalizado para LXC y forzar al contenedor a usarlo.
Sin embargo, hay formas comprobadas de habilitar NFS en contenedores privilegiados. Aunque no es ideal, puede ser necesario para algunos casos de uso.
Nota: Si conoces una solución para hacer que esto funcione en contenedores no privilegiados, ¡por favor compártela!
Montaje de NFS
Una vez realizados los cambios, reinicia el contenedor y podrás montar los recursos NFS como de costumbre. Para asegurarte de que los montajes persistan tras un reinicio, configura las entradas correspondientes en /etc/fstab
:
192.168.1.1:/data /mnt/data nfs defaults 0 0
O utiliza el método rápido desde la línea de comandos:
mount -t nfs 192.168.1.1:/data /mnt/data
Resumen rápido
¿Cómo montar recursos NFS dentro de un contenedor LXC?
- Crea un contenedor LXC privilegiado utilizando la distribución de tu preferencia.
- Una vez creado, modifica el archivo de configuración del contenedor (
/etc/pve/lxc/<id>.conf
en Proxmox) y añade la línea:features: mount=nfs
- Reinicia el contenedor.
- Monta el recurso NFS, por ejemplo:
mount -t nfs 192.168.1.1:/data /mnt/data