Cómo configurar un montaje NFS en Ubuntu 18.04

Introducción

NFS, o Sistema de Archivos de Red, es un protocolo de sistema de archivos distribuido que te permite montar directorios remotos en tu servidor. Esto te permite administrar el espacio de almacenamiento en una ubicación diferente y escribir en ese espacio desde múltiples clientes. NFS proporciona una forma relativamente estándar y eficiente de acceder a sistemas remotos a través de una red y funciona bien en situaciones donde los recursos compartidos deben ser accedidos regularmente.

En esta guía, aprenderás cómo instalar el software necesario para la funcionalidad de NFS en Ubuntu 18.04, configurar montajes NFS en un servidor y cliente, y montar y desmontar los recursos compartidos remotos.

Prerrequisitos

Usaremos dos servidores en este tutorial, con uno compartiendo parte de su sistema de archivos con el otro. Para completar este tutorial, necesitarás:

  • Dos servidores Ubuntu 18.04. Cada uno de estos debe tener un usuario no root con privilegios de sudo configurados, un firewall configurado con UFW y redes privadas si están disponibles para ti.

A lo largo de este tutorial, nos referimos al servidor que comparte sus directorios como el anfitrión y al servidor que monta estos directorios como el cliente. Utilizaremos las siguientes direcciones IP como sustitutos de los valores del anfitrión y del cliente:

  • Anfitrión: 203.0.113.0
  • Cliente: 203.0.113.24

Cuando estas direcciones IP aparezcan en comandos y archivos de configuración, reemplázalas con tus propias direcciones IP respectivas del anfitrión y del cliente.

Paso 1 — Descargar e Instalar los Componentes

Comienza primero por instalar los componentes necesarios en cada servidor.

En el Anfitrión

En el servidor host, instala el paquete nfs-kernel-server, que te permitirá compartir tus directorios. Dado que esta es la primera operación que realizas con apt en esta sesión, actualiza tu índice de paquetes local antes de la instalación:

  1. sudo apt update

A continuación, instala el paquete:

  1. sudo apt install nfs-kernel-server

Una vez instalados estos paquetes, cambia al servidor cliente.

En el Cliente

En el servidor cliente, instala un paquete llamado nfs-common, que proporciona funcionalidad NFS sin incluir componentes del servidor. Nuevamente, actualiza el índice de paquetes local antes de la instalación para asegurarte de tener información actualizada:

  1. sudo apt update

Luego, instala el paquete:

  1. sudo apt install nfs-common

Ahora que ambos servidores tienen los paquetes necesarios, puedes comenzar a configurarlos.

Paso 2 — Crear los directorios compartidos en el Host

Vamos a compartir dos directorios separados con diferentes configuraciones para ilustrar dos formas clave en que se pueden configurar los montajes NFS con respecto al acceso de superusuario.

Los superusuarios pueden hacer cualquier cosa en cualquier lugar de su sistema. Sin embargo, los directorios montados a través de NFS no forman parte del sistema en el que están montados, por lo que, por defecto, el servidor NFS se niega a realizar operaciones que requieran privilegios de superusuario. Esta restricción predeterminada significa que los superusuarios en el cliente no pueden escribir archivos como root, reasignar la propiedad o realizar cualquier otra tarea de superusuario en el montaje NFS.

A veces, sin embargo, hay usuarios de confianza en el sistema cliente que necesitan realizar estas acciones en el sistema de archivos montado pero que no tienen necesidad de acceder como superusuario en el anfitrión. Puede configurar el servidor NFS para permitir esto, aunque introduce un elemento de riesgo, ya que dicho usuario podría obtener acceso de root al sistema anfitrión completo.

Ejemplo 1: Exportar un Montaje de Propósito General

En el primer ejemplo, creará un montaje NFS de propósito general que utiliza el comportamiento NFS predeterminado para dificultar que un usuario con privilegios de root en la máquina cliente interactúe con el anfitrión utilizando esos privilegios de superusuario del cliente. Podría usar algo así para almacenar archivos que se cargaron utilizando un sistema de gestión de contenido o para crear espacio para que los usuarios compartan archivos de proyecto.

Primero, cree un directorio compartido:

  1. sudo mkdir /var/nfs/general -p

Dado que lo estás creando con sudo, el directorio es propiedad del usuario root del anfitrión:

  1. ls -la /var/nfs/general
Output
total 8 drwxr-xr-x 2 root root 4096 Feb 7 23:21 . drwxr-xr-x 3 root root 4096 Feb 7 23:21 ..

NFS traducirá cualquier operación de root en el cliente a las credenciales nobody:nogroup como medida de seguridad. Por lo tanto, necesitas cambiar la propiedad del directorio para que coincida con esas credenciales:

  1. sudo chown nobody:nogroup /var/nfs/general

Ahora estás listo para exportar este directorio.

Ejemplo 2: Exportación del directorio principal

En nuestro segundo ejemplo, el objetivo es hacer que los directorios principales de usuario almacenados en el anfitrión estén disponibles en los servidores cliente, permitiendo a los administradores de confianza de esos servidores cliente el acceso que necesitan para gestionar usuarios convenientemente.

Para hacer esto, exportarás el directorio /home. Dado que ya existe, no necesitas crearlo. Tampoco cambiarás los permisos. Si lo hicieras, podría provocar una serie de problemas para cualquier persona con un directorio principal en la máquina anfitrión.

Paso 3 — Configuración de las exportaciones NFS en el servidor anfitrión

A continuación, nos sumergiremos en el archivo de configuración de NFS para configurar el intercambio de estos recursos.

En la máquina anfitrión, abre el archivo /etc/exports en tu editor de texto preferido con privilegios de root. Aquí usaremos nano:

  1. sudo nano /etc/exports

El archivo tiene comentarios que muestran la estructura general de cada línea de configuración. La sintaxis es la siguiente:

/etc/exports
directory_to_share    client(share_option1,...,share_optionN)

Necesitarás crear una línea para cada uno de los directorios que planeas compartir. Dado que nuestro cliente de ejemplo tiene una dirección IP de 203.0.113.24, nuestras líneas se verán así. Asegúrate de cambiar la dirección IP a la de tu cliente:

/etc/exports
/var/nfs/general    203.0.113.24(rw,sync,no_subtree_check)
/home       203.0.113.24(rw,sync,no_root_squash,no_subtree_check)

Aquí, estamos usando las mismas opciones de configuración para ambos directorios, con excepción de no_root_squash. Veamos qué significa cada una de estas opciones:

  • rw: Esta opción otorga al equipo cliente acceso de lectura y escritura al volumen.
  • sync: Esta opción obliga a NFS a escribir cambios en disco antes de responder. Esto resulta en un entorno más estable y consistente, ya que la respuesta refleja el estado real del volumen remoto. Sin embargo, también reduce la velocidad de las operaciones de archivo.
  • no_subtree_check: Esta opción evita la verificación de subárbol, que es un proceso donde el anfitrión debe verificar si el archivo aún está disponible en el árbol exportado para cada solicitud. Esto puede causar muchos problemas cuando un archivo es renombrado mientras el cliente lo tiene abierto. En casi todos los casos, es mejor deshabilitar la verificación de subárbol.
  • no_root_squash: De forma predeterminada, NFS traduce las solicitudes de un usuario root de forma remota en un usuario no privilegiado en el servidor. Esto se pensó como una característica de seguridad para evitar que una cuenta de root en el cliente pueda usar el sistema de archivos del host como root. no_root_squash deshabilita este comportamiento para ciertos compartidos.

Cuando hayas terminado de hacer tus cambios, guarda y cierra el archivo. Si estás utilizando nano, puedes hacer esto presionando CTRL + X, luego Y y ENTER. Luego, para que los compartidos estén disponibles para los clientes que configuraste, reinicia el servidor NFS con el siguiente comando:

  1. sudo systemctl restart nfs-kernel-server

Sin embargo, antes de que puedas usar los nuevos compartidos, necesitarás asegurarte de que el tráfico a los compartidos esté permitido por las reglas del firewall.

Paso 4 — Ajustar el Firewall en el Host

Primero, verifica el estado del firewall para confirmar si está habilitado y, en ese caso, revisa qué está permitido actualmente:

  1. sudo ufw status
Output
Status: active To Action From -- ------ ---- OpenSSH ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6)

En nuestro sistema, solo se permite el tráfico SSH, por lo que necesitaremos agregar una regla para el tráfico NFS.

Con muchas aplicaciones, puedes usar sudo ufw app list y habilitarlas por nombre, pero nfs no es una de ellas. Sin embargo, como ufw también verifica /etc/services para el puerto y protocolo de un servicio, aún puedes agregar NFS por nombre. La mejor práctica recomienda habilitar la regla más restrictiva que aún permita el tráfico que deseas permitir, así que en lugar de habilitar el tráfico desde cualquier lugar, serás específico.

Utiliza el siguiente comando para abrir el puerto 2049 en el host, asegurándote de sustituir la dirección IP de tu cliente:

  1. sudo ufw allow from 203.0.113.24 to any port nfs

Puedes verificar el cambio ejecutando lo siguiente:

  1. sudo ufw status

Deberías recibir una lista de tráfico permitido desde el puerto 2049 en la salida:

Output
Status: active To Action From -- ------ ---- OpenSSH ALLOW Anywhere 2049 ALLOW 203.0.113.24 OpenSSH (v6) ALLOW Anywhere (v6)

Esto confirma que UFW solo permitirá tráfico NFS en el puerto 2049 desde tu máquina cliente.

Paso 5 — Crear Puntos de Montaje y Montar Directorios en el Cliente

Ahora que el servidor host está configurado y sirve sus recursos compartidos, prepararás tu cliente.

Para hacer que los recursos compartidos remotos estén disponibles en el cliente, necesitas montar los directorios en el host que deseas compartir en directorios vacíos en el cliente.

Nota: Si hay archivos y directorios en tu punto de montaje, se ocultarán tan pronto como montes el recurso NFS. Para evitar la pérdida de archivos importantes, asegúrate de que si montas en un directorio que ya existe, ese directorio esté vacío.

Crea dos directorios para tus montajes. Ejecuta el siguiente comando para crear el primero::

  1. sudo mkdir -p /nfs/general

Luego ejecuta este comando para crear el segundo::

  1. sudo mkdir -p /nfs/home

Ahora que tienes un lugar para colocar los recursos remotos y has abierto el cortafuegos, puedes montar los recursos utilizando la dirección IP de tu servidor host, que en esta guía es 203.0.113.0:

  1. sudo mount 203.0.113.0:/var/nfs/general /nfs/general
  2. sudo mount 203.0.113.0:/home /nfs/home

Estos comandos montarán los recursos desde la computadora anfitriona en la máquina cliente. Puedes verificar que se montaron correctamente de varias maneras. Puedes verificarlo con un comando mount o findmnt, pero df -h proporciona una salida más legible que ilustra cómo se muestra el uso de disco de manera diferente para los recursos NFS:

  1. df -h
Output
Filesystem Size Used Avail Use% Mounted on udev 480M 0 480M 0% /dev tmpfs 99M 5.6M 94M 6% /run /dev/vda1 25G 1.3G 23G 6% / tmpfs 493M 0 493M 0% /dev/shm tmpfs 5.0M 0 5.0M 0% /run/lock tmpfs 493M 0 493M 0% /sys/fs/cgroup /dev/vda15 105M 4.4M 100M 5% /boot/efi tmpfs 99M 0 99M 0% /run/user/1000 203.0.113.0:/var/nfs/general 25G 1.3G 23G 6% /nfs/general 203.0.113.0:/home 25G 1.3G 23G 6% /nfs/home

Ambos recursos que montaste aparecen al final. Debido a que se montaron desde el mismo sistema de archivos, muestran el mismo uso de disco. Para verificar cuánto espacio se está utilizando realmente en cada punto de montaje, usa el comando de uso de disco du y la ruta del montaje. La bandera -s proporciona un resumen del uso en lugar de mostrar el uso para cada archivo. La bandera -h imprime una salida legible para humanos:

  1. du -sh /nfs/home
Output
44K /nfs/home

Esto te muestra que el contenido de todo el directorio home está utilizando solo 44K del espacio disponible.

Paso 6 — Prueba de acceso a NFS

A continuación, prueba el acceso a los recursos escribiendo algo en cada uno de ellos.

Ejemplo 1: El recurso de Propósito General

Primero, escribe un archivo de prueba en el recurso /var/nfs/general:

  1. sudo touch /nfs/general/general.test

Luego, verifica su propiedad:

  1. ls -l /nfs/general/general.test
Output
-rw-r--r-- 1 nobody nogroup 0 Feb 7 23:53 /nfs/general/general.test

Como montaste este volumen sin cambiar el comportamiento predeterminado de NFS y creaste el archivo como el usuario root de la máquina cliente a través del comando sudo, la propiedad del archivo se establece por defecto en nobody:nogroup. Los superusuarios de la cliente no podrán realizar acciones administrativas típicas, como cambiar el propietario de un archivo o crear un nuevo directorio para un grupo de usuarios, en este recurso montado por NFS.

Ejemplo 2: El recurso del Directorio de Inicio

Para comparar los permisos del recurso de Propósito General con el recurso del Directorio de Inicio, crea un archivo en /nfs/home de la misma manera:

  1. sudo touch /nfs/home/home.test

Entonces revisa la propiedad del archivo:

  1. ls -l /nfs/home/home.test
Output
-rw-r--r-- 1 root root 0 Feb 7 23:56 /nfs/home/home.test

Creaste home.test como root usando el comando sudo, exactamente de la misma manera en que creaste el archivo general.test. Sin embargo, en este caso está siendo propiedad de root porque anulaste el comportamiento predeterminado al especificar la opción no_root_squash en este montaje. Esto permite que tus usuarios root en la máquina cliente actúen como root y facilita la administración de cuentas de usuario. Al mismo tiempo, significa que no tienes que dar acceso root a estos usuarios en el anfitrión.

Paso 7 — Montar los Directorios Remotos NFS al Iniciar

Puedes montar automáticamente los recursos remotos NFS al iniciar añadiéndolos al archivo /etc/fstab en el cliente.

Abre el siguiente archivo con privilegios de root en tu editor de texto preferido:

  1. sudo nano /etc/fstab

Al final del archivo, agrega una línea para cada uno de tus recursos, como la siguiente:

/etc/fstab
. . .
203.0.113.0:/var/nfs/general    /nfs/general   nfs auto,nofail,noatime,nolock,intr,tcp,actimeo=1800 0 0
203.0.113.0:/home       /nfs/home      nfs auto,nofail,noatime,nolock,intr,tcp,actimeo=1800 0 0

Nota: Puedes encontrar más información sobre las opciones especificadas aquí en la página man de NFS. Puedes acceder a esto ejecutando el siguiente comando:

  1. man nfs

El servidor cliente montará automáticamente las particiones remotas al arrancar, aunque puede llevar unos momentos establecer la conexión y que los recursos compartidos estén disponibles.

Paso 8 — Desmontar un Recurso Remoto NFS

Si ya no desea que el directorio remoto esté montado en su sistema, puede desmontarlo moviéndose fuera de la estructura del directorio compartido y desmontándolo.

Primero cambie al directorio raíz:

  1. cd ~

Luego desmonte /nfs/home. Tenga en cuenta que el comando se llama umount no unmount como podría esperar:

  1. sudo umount /nfs/home

A continuación, desmonte /nfs/general:

  1. sudo umount /nfs/general

Esto eliminará los recursos compartidos remotos, dejando solo accesible su almacenamiento local:

  1. df -h
Output
Filesystem Size Used Avail Use% Mounted on udev 480M 0 480M 0% /dev tmpfs 99M 5.5M 94M 6% /run /dev/vda1 25G 1.3G 23G 6% / tmpfs 493M 0 493M 0% /dev/shm tmpfs 5.0M 0 5.0M 0% /run/lock tmpfs 493M 0 493M 0% /sys/fs/cgroup /dev/vda15 105M 4.4M 100M 5% /boot/efi tmpfs 99M 0 99M 0% /run/user/1000

Si también desea evitar que se vuelvan a montar en el próximo reinicio, edite /etc/fstab y elimine la línea o coméntela colocando un carácter # al principio de la línea. También puede evitar el montaje automático eliminando la opción auto, lo que le permitirá montarlo manualmente.

Conclusión

En este tutorial, creaste un host NFS e ilustraste algunos comportamientos clave de NFS al crear dos montajes NFS diferentes, que compartiste con tu cliente NFS. Si estás buscando implementar NFS en producción, es importante tener en cuenta que el protocolo en sí mismo no está encriptado. En casos donde estés compartiendo archivos a través de una red privada, esto puede no ser un problema. En otros casos, será necesario utilizar una VPN u otro tipo de túnel encriptado para proteger tus datos. Ten en cuenta que esto a menudo resulta en una reducción significativa del rendimiento. Si el rendimiento es un problema, considera usar SSHFS.

Source:
https://www.digitalocean.com/community/tutorials/how-to-set-up-an-nfs-mount-on-ubuntu-18-04