Tutorial

Cómo configurar NFS Mount en Ubuntu 20.04

UbuntuNetworkingUbuntu 20.04

Introducción

NFS, o Network File System (Sistema de archivos en red) es un protocolo de sistema de archivos distribuido que le permite montar directorio remotos en su servidor. Esto le permite gestionar 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 sobre una red y funciona bien en aquellas situaciones en las que debe accederse a los recursos regularmente.

En esta guía repasaremos cómo instalar el software necesario para la funcionalidad NFS en Ubuntu 20.04, configuraremos dos montajes NFS en un servidor y cliente, y montaremos y desmontaremos los intercambios remotos.

Requisitos previos

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

  • Dos servidores Ubuntu 20.04. Cada uno de estos debería tener un usuario no root con privilegios sudo, un firewall configurado con UFW y una red privada, si está disponible.

A lo largo de este tutorial, nos referimos al servidor que comparte sus directorios como el host y al servidor que monta estos directorios como el client. Necesitará conocer la dirección IP de ambos. Asegúrese de usar la dirección de red privada, si está disponible.

A lo largo de este tutorial, nos referiremos a estas direcciones IP por los marcadores de posición host_ip y client_ip. Sustituya según sea necesario.

Paso 1: Descargar e instalar los componentes

Comenzaremos instalando los componentes necesarios en cada servidor.

En el host

En el servidor host, instale el paquete nfs-kernel-server, que le permitirá compartir sus directorios. Ya que esta es la primera operación que está realizando con apt en esta sesión, actualice su índice de paquetes locales antes de la instalación:

  • sudo apt update
  • sudo apt install nfs-kernel-server

Una vez instalados estos paquetes, cambie al servidor cliente.

En el cliente

En el servidor cliente, debemos instalar un paquete llamado nfs-common, que proporciona funcionalidad NFS sin incluir componentes del servidor. De nuevo, actualice el índice de paquetes locales antes de la instalación para garantizar que tiene información actualizada:

  • sudo apt update
  • sudo apt install nfs-common

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

Paso 2: Crear los directorios compartidos en el host

Vamos a compartir dos directorios independientes, con diferentes ajustes de configuración, para ilustrar dos formas clave en las que pueden configurarse los montajes NFS con respecto al acceso de un súper usuario.

Los súper usuarios pueden hacer cualquier cosa en cualquier parte del sistema. Sin embargo, los directorios montados en NFS no son parte del sistema sobre el cual se montan, de forma que por defecto, el servidor NFS rechaza realizar operaciones que requieran privilegios de súper usuario. Esta restricción predeterminada significa que los súper usuarios en el client no pueden escribir archivos como root, reasignar propiedad, o realizar cualquier otra tarea de súper usuario en el montaje NFS.

A veces, sin embargo, existen usuarios de confianza en el sistema client que necesitan realizar estas acciones sobre el sistema de archivo montado pero no tienen necesidad de acceso de súper usuario en el host. Puede configurar el servidor NFS para permitir esto, aunque introduce un elemento de riesgo, ya que como tal un usuario podría obtener acceso root a todo el sistema host.

Ejemplo 1: Exportar un montaje de finalidad general

En el primer ejemplo, crearemos un montaje NFS de finalidad general que utiliza el comportamiento NFS para hacer que sea difícil para un usuario con privilegios root sobre el equipo cliente interactuar con el host usando los privilegios de súper usuario del cliente. Puede usar algo como esto para guardar los archivos que se subieron usando un sistema de administración de contenidos o para crear espacio para que los usuarios compartan fácilmente los archivos de los proyectos.

Primero, cree el directorio compartido:

  • sudo mkdir /var/nfs/general -p

Ya que estamos creándolo con sudo, el directorio es propiedad del usuario root del host:

  • ls -la /var/nfs/general
Output
drwxr-xr-x 2 root root 4096 May 14 18:36 .

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

  • sudo chown nobody:nogroup /var/nfs/general

Ahora está listo para exportar este directorio.

Ejemplo 2: Exportar el directorio de inicio

En nuestro segundo ejemplo, el objetivo es hacer que los directorios de inicio del usuario guardados en el host estén disponibles en los servidores cliente, permitiendo al mismo tiempo a los administradores de confianza de esos servidores cliente el acceso para administrar convenientemente a los usuarios.

Para hacer esto, exportaremos el directorio /home. Debido a que ya existe, no necesitamos crearlo. No cambiaremos los permisos tampoco. Si lo hiciésemos, podría provocar varios problemas para cualquiera con un directorio de inicio en el equipo host.

Paso 3: Configurar las exportaciones NFS en el servidor host

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

En el equipo host, abra el archivo /etc/exports en su editor de texto con privilegios root:

  • 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)

Deberemos crear una línea para cada uno de los directorios que queremos compartir. Asegúrese de cambiar el marcador de posición client_ip mostrado aquí a su dirección IP real:

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

Aquí, estamos usando las mismas opciones de configuración para ambos directorios con la excepción de no_root_squash. Vamos a echar un vistazo a lo que significa cada una de estas opciones:

  • rw: esta opción proporciona al equipo client acceso de lectura y escritura para el volumen.
  • sync: esta opción fuerza a NFS a escribir los cambios en el 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 comprobación del subtree, que es un proceso por el cual el host debe comprobar si el archivo está realmente disponible aún en el árbol exportado para cada solicitud. Esto puede causar muchos problemas cuando se cambia el nombre a un archivo mientras el client lo tiene abierto. En casi todos los casos, es mejor deshabilitar la comprobación del subtree.
  • no_root_squash: por defecto, NFS traduce las solicitudes desde un usuario root remotamente a un usuario sin privilegios en el servidor. Esto estaba pensado como función de seguridad para evitar que una cuenta root en el client usara el sistema de archivos del host como root. no_root_squash deshabilita este comportamiento para ciertos intercambios.

Una vez que termine de hacer estos cambios, guarde y cierre el archivo. A continuación, para hacer que los intercambios estén disponibles para los clientes que ha configurado, reinicie el servidor NFS con el siguiente comando:

  • sudo systemctl restart nfs-kernel-server

Antes de poder usar realmente los nuevos intercambios, sin embargo, deberá asegurar que las reglas del firewall permiten ese tráfico a los intercambios.

Paso 4: Ajustar el firewall en el host

Primero, vamos a comprobar el estado del firewall para ver si está habilitado, y si es así, para ver qué permite actualmente:

  • 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, así que necesitaremos añadir una regla para el tráfico NFS.

Con muchas aplicaciones, puede usar sudo ufw app list y habilitarlas por su nombre, pero nfs no es una de esas. Sin embargo, debido a que ufw también comprueba /etc/services para el puerto y el protocolo de un servicio, aún podemos añadir NFS por nombre. Las buenas prácticas recomiendan que permita la regla más restrictiva que seguirá permitiendo el tráfico que desea permitir, de forma que permitir el tráfico desde cualquier sitio, será específico.

Utilice el siguiente comando para abrir el puerto 2049 en el host, asegurando de sustituir la dirección IP del client:

  • sudo ufw allow from client_ip to any port nfs

Puede verificar el cambio escribiendo lo siguiente:

  • sudo ufw status

Debería ver el tráfico permitido desde el puerto 2049 en el resultado:

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á el tráfico NFS en el puerto 2049 desde nuestro equipo client.

Paso 5: Crear puntos de montaje y directorios de montaje en el cliente

Ahora que el servidor host se configura y presenta sus intercambios, prepararemos nuestro client.

Para hacer que los intercambios remotos estén disponibles en el client, debemos montar los directorios en el host que queremos compartir para vaciar los directorios en el client.

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

Crearemos dos directorios para nuestros montajes:

  • sudo mkdir -p /nfs/general
  • sudo mkdir -p /nfs/home

Ahora que tenemos una ubicación para poner los intercambios remotos y hemos abierto el firewall, podemos montar los intercambios usando la dirección IP de nuestro servidor host:

  • sudo mount host_ip:/var/nfs/general /nfs/general
  • sudo mount host_ip:/home /nfs/home

Estos comandos montarán los intercambios desde el equipo host sobre el equipo client. Puede comprobar que se montan correctamente de varias formas. Puede comprobar esto con un comando mount o findmnt, pero df-h proporciona una resultado más legible:

  • df -h
Output
Filesystem Size Used Avail Use% Mounted on udev 474M 0 474M 0% /dev tmpfs 99M 936K 98M 1% /run /dev/vda1 25G 1.8G 23G 8% / tmpfs 491M 0 491M 0% /dev/shm tmpfs 5.0M 0 5.0M 0% /run/lock tmpfs 491M 0 491M 0% /sys/fs/cgroup /dev/vda15 105M 3.9M 101M 4% /boot/efi tmpfs 99M 0 99M 0% /run/user/1000 10.132.212.247:/var/nfs/general 25G 1.8G 23G 8% /nfs/general 10.132.212.247:/home 25G 1.8G 23G 8% /nfs/home

Ambos intercambios que montamos aparecen en la parte inferior. Debido a que se montaron a partir del mismo sistema de archivos, muestran el mismo uso de disco. Para ver cuánto espacio se está usando bajo cada punto de montaje, utilice el comando de uso del disco du y la ruta del montaje. El indicador -s proporciona un resumen de uso en vez de mostrar el uso de cada archivo. -h imprime un resultado legible por el ser humano.

Por ejemplo:

  • du -sh /nfs/home
Output
36K /nfs/home

Esto nos muestra que el contenido de todo el directorio de inicio está usando solo 36k del espacio disponible.

Paso 6: Probar el acceso NFS

A continuación, vamos a acceder a los intercambios escribiendo algo a cada uno de ellos.

Ejemplo 1: El intercambio de finalidad general

Primero, escriba un archivo de prueba al intercambio /var/nfs/general:

  • sudo touch /nfs/general/general.test

A continuación, compruebe su propiedad:

  • ls -l /nfs/general/general.test
Output
-rw-r--r-- 1 nobody nogroup 0 Aug 1 13:31 /nfs/general/general.test

Debido a que montamos este volumen si cambiar el comportamiento predeterminado de NFS y creamos el archivo como el usuario root del equipo cliente a través del comando sudo, la propiedad del archivo cae a nobody:nogroup. Los súper usuarios del cliente no podrán realizar las acciones administrativas típicas, como cambiar el propietario de un archivo o crear un nuevo directorio para un grupo de usuarios en este intercambio montado en NFS.

Ejemplo 2: El intercambio del directorio de inicio

Para comparar los permisos del intercambio de finalidad general con el intercambio del directorio de inicio, cree un archivo en /nfs/home de la misma forma:

  • sudo touch /nfs/home/home.test

A continuación observe la propiedad del archivo:

  • ls -l /nfs/home/home.test
Output
-rw-r--r-- 1 root root 0 Aug 1 13:32 /nfs/home/home.test

Creamos home.test como root usando el comando sudo, exactamente de la misma forma en que creamos el archivo general.test. Sin embargo, en este caso es propiedad de root porque anulamos el comportamiento predeterminado cuando especificamos la opción no_root_squash en este montaje. Esto permite que nuestros usuarios root en el equipo cliente actúe como root y hace que la administración de las cuentas de usuario sea mucho más conveniente. Al mismo tiempo, significa que no tenemos que proporcionar a estos usuarios acceso root en el host.

Paso 7: Montaje de los directorios NFS remotos en el arranque

Podemos montar los intercambios NFS remotos automáticamente al arranque añadiéndolos al archivo /etc/fstab en el client.

Abra este archivo con privilegios root en su editor de texto:

  • sudo nano /etc/fstab

En la parte inferior del archivo, añada una línea para cada uno de nuestros intercambios. Tendrán el siguiente aspecto:

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

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

  • man nfs

El client montará automáticamente las particiones remotas en el arranque, aunque puede tardar algo de tiempo en establecer la conexión y para que los intercambios estén disponibles.

Paso 8: Desmontar un intercambio remoto NFS

Si ya no desea que el directorio remoto se monte en su sistema, puede desmontarlo saliendo de la estructura del directorio del intercambio y desmontando, de esta forma:

  • cd ~
  • sudo umount /nfs/home
  • sudo umount /nfs/general

Observe que el comando se llama umount no unmount como podría esperar.

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

  • df -h
Output
Filesystem Size Used Avail Use% Mounted on udev 474M 0 474M 0% /dev tmpfs 99M 936K 98M 1% /run /dev/vda1 25G 1.8G 23G 8% / tmpfs 491M 0 491M 0% /dev/shm tmpfs 5.0M 0 5.0M 0% /run/lock tmpfs 491M 0 491M 0% /sys/fs/cgroup /dev/vda15 105M 3.9M 101M 4% /boot/efi tmpfs 99M 0 99M 0% /run/user/1000

Si también desea impedir que se vuelvan a montar en el siguiente reinicio, edite /etc/fstab y elimine la línea u omítala colocando un carácter # al principio de la línea. También puede evitar el montaje automático eliminado la opción auto, que le permitirá montarlo manualmente.

Conclusión

En este tutorial, creamos un host NFS e ilustramos algunos comportamientos NFS claves al crear dos montajes NFS diferentes, que compartimos con un cliente NFS.

Si desea implementar NFS en producción, es importante observar que el protocolo no está cifrado. En los casos en que esté compartiendo sobre una red privada, esto puede no ser un problema. En otros casos, será necesaria una VPN o algún otro tipo de túnel cifrado para proteger sus datos.

Creative Commons License