Cómo configurar un punto de montaje NFS en Ubuntu 20.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 eficaz de acceder a sistemas remotos a través de una red. Funciona bien en situaciones en las que se debe acceder regularmente a los recursos compartidos.

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

Prerrequisitos

Utilizaremos dos servidores en este tutorial, uno compartirá parte de tu sistema de archivos con el otro. Para seguirlo, necesitarás:

  • Dos servidores Ubuntu 20.04. Cada uno de estos debe tener un usuario no root con privilegios sudo. También un firewall configurado con UFW y una red privada, si está disponible para ti.

En este tutorial, nos referimos al servidor que comparte tus directorios como host y al servidor que monta estos directorios como client. Necesitarás saber la dirección IP de ambos. Asegúrate de utilizar 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 client_ip. Por favor sustitúyelos según sea necesario.

Paso 1 – Descarga e instalación de los componentes

Comenzaremos instalando los componentes necesarios en cada servidor.

En el host

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

Una vez que estos paquetes estén instalados, debes cambiar al servidor client.

En el cliente

En el servidor client, necesitamos instalar un paquete llamado nfs-common, que proporciona la funcionalidad NFS sin incluir ningún componente del servidor. Nuevamente, actualiza el índice del paquete local antes de la instalación para asegurarte de tener información actualizada:

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 separados, con diferentes ajustes de configuración. Esto para ilustrar dos formas clave en que los montajes NFS se pueden configurar con respecto al acceso de superusuario.

Los superusuarios pueden hacer cualquier cosa en cualquier parte de tu sistema. Sin embargo, los directorios montados en NFS no son parte del sistema en el que están montados. Por lo tanto, de manera predeterminada, el servidor NFS se niega a realizar operaciones que requieren privilegios de superusuario.

Esta restricción predeterminada significa que los superusuarios en el client no pueden escribir archivos como root y reasignar la propiedad. Tampoco pueden realizar cualquier otra tarea de superusuario en el montaje NFS.

A veces, sin embargo, hay usuarios confiables en el sistema client que necesitan realizar estas acciones en el sistema de archivos montado. Empero que no necesitan acceso de superusuario en el host. Puedes configurar el servidor NFS para permitir esto. No obstante, presenta un elemento de riesgo, ya que dicho usuario podría obtener acceso de root a todo el sistema host.

Ejemplo 1 – Exportar un montaje de uso general

En el primer ejemplo, crearemos un montaje NFS de uso general que use el comportamiento NFS predeterminado. Esto para dificultar que un usuario con privilegios de root en la máquina client interactúe con el host utilizando esos privilegios de superusuario del client.

Puedes usar algo como esto para almacenar archivos que se cargaron usando un sistema de administración de contenido.  También lo puedes usar para crear espacio para que los usuarios compartan fácilmente archivos de un proyecto.

Primero, debes crear el directorio compartido:

Ya que estamos creando con sudo, el directorio es propiedad del host del usuario root:

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

Ahora estás listo para exportar este directorio.

Ejemplo 2 – Exportar el directorio de inicio

En el segundo ejemplo, el objetivo es hacer que los directorios principales de los usuarios almacenados en el host disponible en los servidores client. Mientras permites a los administradores de confianza de los servidores client el acceso que necesitan para gestionar convenientemente los usuarios.

Para hacer esto, exportaremos el directorio /home. Como ya existe, no necesitamos crearlo. Tampoco cambiaremos los permisos. Si lo hiciéramos, podría dar lugar a una serie de problemas para cualquier persona con un directorio de inicio en la máquina host.

Paso 3 – Configuración de las exportaciones NFS en el servidor host

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

En la máquina host, debes abrir el archivo /etc/exports en tu editor de texto con privilegios de root:

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

Tendremos que crear una línea para cada uno de los directorios que planeamos compartir. Asegúrate de cambiar la parte client_ip que se muestra aquí a tu dirección IP real:

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

  • rw: Esta opción le da al equipo client acceso de lectura y escritura al volumen.
  • sync: Esta opción obliga a NFS a escribir cambios en el disco antes de responder. Esto da como resultado 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 de subárbol, que es un proceso en el que el host debe verificar si el archivo todavía está disponible en el árbol exportado para cada solicitud. Esto puede causar muchos problemas cuando se cambia el nombre de un archivo mientras tienes abierto el client. En casi todos los casos, es mejor deshabilitar esta opción.
  • no_root_squash: De forma predeterminada, NFS traduce las solicitudes de un usuario root de forma remota en un usuario sin privilegios en el servidor. Es una característica de seguridad para evitar que una cuenta root en el client use el sistema de archivos del host como rootno_root_squash deshabilita este comportamiento para ciertas acciones.

Guardar cambios

Cuando termines de hacer tus cambios, debes guardar y cerrar el archivo. Luego, para que los recursos compartidos estén disponibles para los clientes que configuraste, reinicia el servidor NFS con el siguiente comando:

Sin embargo, antes de poder usar los nuevos recursos compartidos, deberás asegurarte de que las reglas del firewall permitan el tráfico a los recursos compartidos.

Paso 4 – Ajustar del firewall en el host

Primero, verifiquemos el estado del firewall para ver si está habilitado y, de ser así, para ver qué está permitido actualmente:

En nuestro sistema, solo se permite el tráfico SSH, por lo que tendremos que 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, debido a que ufw también verifica /etc/services para el puerto y el protocolo de un servicio, aún podemos agregar NFS por nombre.

Las mejores prácticas recomiendan que habilites la regla más restrictiva que aún permitirá el tráfico que deseas permitir. Por lo tanto, en lugar de habilitar el tráfico desde cualquier lugar, seremos específicos.

Debes usar el siguiente comando para abrir el puerto 2049 en el host y asegúrate de sustituir la dirección IP de tu client:

Puedes verificar el cambio escribiendo:

Deberías ver el tráfico permitido desde el puerto 2049 en la salida:

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

Paso 5 – Creación de puntos de montaje y montaje de directorios en el cliente

Ahora que el servidor host está configurado y sirve tus recursos compartidos, prepararemos a nuestro client.

Para que los recursos compartidos remotos estén disponibles en client, necesitamos montar los directorios en el host que queremos compartir en directorios vacíos en client.

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

Crearemos dos directorios para nuestros montajes:

Ahora que tenemos una ubicación para colocar los recursos compartidos remotos y hemos abierto el firewall, podemos montar los recursos compartidos utilizando la dirección IP de nuestro servidor host:

Estos comandos montarán los recursos compartidos de la computadora host en la máquina client. Puedes verificar que se hayan montado correctamente de varias maneras. Puedes verificar esto con un comando mount o findmnt, pero df –h proporciona una salida más legible:

Las dos acciones que montamos aparecen en la parte inferior. Como se montaron desde el mismo sistema de archivos, muestran el mismo uso de disco. Para ver cuánto espacio se está utilizando realmente debajo de cada punto de montaje, debes usar el comando de uso del disco du y la ruta del montaje.

El indicador –s proporciona un resumen del uso en lugar de mostrar el uso de cada archivo. La salida –h imprime información legible.

Por ejemplo:

Esto nos muestra que el contenido de todo el directorio de inicio usa solo 36K del espacio disponible.

Paso 6 – Prueba de acceso NFS

A continuación, debes probar el acceso a los recursos compartidos escribiendo algo para cada uno de ellos.

Ejemplo 1 – El propósito general Compartir

Primero, escribe un archivo de prueba para compartir /var/nfs/generalc:

Luego, la propiedad el archivo:

Debido a que montamos este volumen sin cambiar el comportamiento predeterminado de NFS y creamos el archivo como usuario root de la máquina client través del comando sudo, la propiedad del archivo se establece de manera predeterminada en nobody:nogroup.

Los superusuarios del client no podrán realizar acciones administrativas típicas. Por ejemplo, cambiar el propietario de un archivo o crear un nuevo directorio para un grupo de usuarios, en este recurso compartido montado en NFS

Ejemplo 2 – El directorio de inicio compartido

Para comparar los permisos del recurso compartido de uso general con el recurso compartido del directorio de inicio, debes crear un archivo en /nfs/home, así:

Luego debes observar la propiedad del archivo:

Creamos home.test como root usando el comando sudo, exactamente de la misma manera 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 la máquina client actúen como root. Esto hace que la administración de las cuentas de los usuarios sea mucho más conveniente. Al mismo tiempo, significa que no tenemos que dar a estos usuarios acceso root en el host.

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

Podemos montar los recursos compartidos NFS remotos automáticamente en el arranque agregándolos al archivo /etc/fstab en el client.

Debes abrir este archivo con privilegios de root en tu editor de texto:

Al final del archivo, debes agregar una línea para cada una de nuestras acciones. Se verán así:

Nota: Puedes encontrar más información sobre las opciones que estamos especificando en la página de manual de NFS. Puedes acceder a esto ejecutando el siguiente comando:

El cliente montará automáticamente las particiones remotas en el arranque, aunque puede llevar unos minutos establecer la conexión y que los recursos compartidos estén disponibles.

Paso 8 – Desmontar un recurso compartido remoto NFS

Si ya no deseas que el directorio remoto se monte en tu sistema, puedes desmontarlo. Puedes hacerlo saliendo de la estructura de directorios del recurso compartido y desmontando, de esta manera:

Debes tomar nota de que el comando se denomina umount no unmount como podrías esperar.

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

Si también deseas evitar que se vuelvan a montar en el próximo reinicio, debes editar /etc/fstab y eliminar la línea. También puedes comentarla colocando un caracter # al comienzo de la línea. Asimismo, puedes evitar el montaje automático quitando la opción auto, que te permitirá seguir montándolo manualmente.

Conclusión

En este tutorial, creamos un host NFS e ilustramos algunos comportamientos clave de NFS creando dos montajes NFS diferentes, que compartimos con un cliente NFS.

Si estás buscando implementar NFS en producción, es importante tener en cuenta que el protocolo en sí no está cifrado. En los casos en que estás compartiendo a través de 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 tus datos.