Cómo instalar el cliente y el servidor NFS en Ubuntu 20.04
El Sistema de Archivos en Red o NFS abreviado es un protocolo de sistema de archivos distribuido que te permite montar directorios remotos en tu servidor. NFS te permite acceder a archivos y carpetas desde otro servidor o cliente. Puedes escribir en ese servidor desde varios clientes o sistemas remotos a través de una red. Esta tecnología te da la flexibilidad de compartir un recurso en varios sistemas.
En este tutorial, aprenderemos a configurar un servidor NFS y a montar recursos compartidos NFS en un cliente utilizando Ubuntu 20.04.
Requisitos previos
- Dos sistemas Ubuntu 20.04. Cada servidor debe tener un usuario no root con privilegios sudo y el cortafuegos UFW configurado.
- Puedes configurar tanto el servidor como el cliente a través de una red privada. Para nuestro tutorial, utilizaré host_ip para denotar la dirección IP del servidor y client_ip para referirme a la dirección IP del cliente.
Paso 1 – Instalar NFS en el servidor y en el cliente
Anfitrión
Necesitamos instalar el paquete nfs-kernel-server
en el host para compartir sus directorios.
$ sudo apt update
$ sudo apt install nfs-kernel-server
Cliente
Para el cliente, instalaremos el paquete nfs-common
que permite al Cliente montar el directorio del host pero no puede alojar el directorio en sí.
$ sudo apt update
$ sudo apt install nfs-common
Paso 2 – Crear directorios compartidos en el host
Hay dos formas de conceder acceso a los directorios del host al cliente. Por defecto, el servidor NFS no permite operaciones que requieran privilegios sudo. Esto significa que los superusuarios del cliente no pueden escribir archivos como root, reasignar la propiedad o realizar cualquier tarea que requiera privilegios elevados.
Pero a veces, un cliente necesita realizar ciertas operaciones en el host que requieren privilegios elevados, pero no necesita acceso de superusuario para ello.
Primer método
Este es el método por defecto para compartir directorios. Hace difícil que un usuario root en el cliente pueda interactuar con el host utilizando privilegios elevados.
Primero, crea el directorio compartido.
$ sudo mkdir /var/nfs/general -p
Si realizas alguna operación de root en el cliente, NFS la traducirá a las credenciales de nobody:nogroup
en la máquina anfitriona. Por lo tanto, tenemos que dar la propiedad adecuada al directorio compartido.
$ sudo chown nobody:nogroup /var/nfs/general
Segundo método
En este caso, compartiremos el directorio raíz del host con el cliente. Esto permitirá a los usuarios root del cliente un acceso adecuado al host.
Como el directorio principal ya existe en el servidor anfitrión, no necesitamos crearlo. Tampoco es necesario cambiar los permisos en él, ya que creará múltiples problemas a los usuarios de la máquina anfitriona.
Paso 3 – Configurar NFS en el host
Es el momento de configurar el NFS para establecer la compartición.
Abre el archivo /etc/exports
en el servidor anfitrión.
$ sudo nano /etc/exports
Añade las siguientes líneas en la parte inferior, una por cada directorio que compartas.
/var/nfs/general client_ip(rw,sync,no_subtree_check)
/home client_ip(rw,sync,no_root_squash,no_subtree_check)
Repasemos todas estas opciones y lo que significan.
- rw: Esto da al cliente acceso de lectura y escritura en los directorios del host.
- sync: Esta opción obliga a NFS a escribir los cambios antes de responder. Significa que NFS terminará primero de escribir en el directorio anfitrión y luego responderá al cliente. Esto garantiza que se refleje el estado real del servidor anfitrión, pero puede ralentizar la velocidad de las operaciones con archivos.
- no_subtree_check: Esta opción desactiva la comprobación del subárbol. La comprobación del subárbol es una operación en la que, con cada petición NFS, el servidor debe comprobar que el archivo al que se accede está presente y que se encuentra en el árbol exportado. Esta operación causa problemas cuando los archivos a los que accede un cliente son renombrados. Por ello, es mejor dejarla desactivada en la mayoría de los casos. Tiene algunas implicaciones de seguridad leves, pero puede mejorar la fiabilidad.
- no_root_squash: Por defecto, NFS traduce todas las operaciones realizadas como root por el cliente a un usuario sin privilegios en el servidor. Esto se hace con la intención de mejorar la seguridad. Esta opción desactiva ese comportamiento para determinados recursos compartidos.
Cuando hayas terminado, cierra el archivo pulsando Ctrl + X e introduciendo Y cuando se te pida.
Reinicia el servidor NFS para aplicar los cambios.
$ sudo systemctl restart nfs-kernel-server
Paso 4 – Configurar el cortafuegos del host
La mejor práctica con NFS es habilitarlo específicamente para la dirección IP de cada cliente por separado, en lugar de permitir el acceso desde todas partes.
NFS utiliza el puerto 2049. Habilita el acceso para NFS mediante el siguiente comando.
$ sudo ufw allow from client_ip to any port nfs
Comprueba el estado para verificarlo.
$ sudo ufw status
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
2049 ALLOW 167.100.34.78
OpenSSH (v6) ALLOW Anywhere (v6)
Paso 5 – Crear puntos de montaje en el cliente
Ahora que nuestro host está configurado, es el momento de configurar el cliente.
Crea dos directorios para montajes en el cliente.
$ sudo mkdir -p /nfs/general
$ sudo mkdir -p /nfs/home
Ahora que hemos configurado todo en el host, podemos montar los recursos compartidos utilizando la dirección IP del host.
$ sudo mount host_ip:/var/nfs/general /nfs/general
$ sudo mount host_ip:/home /nfs/home
Puedes comprobar si se han montado correctamente con el siguiente comando.
$ df -h
Filesystem Size Used Avail Use% Mounted on
udev 448M 0 448M 0% /dev
tmpfs 99M 664K 98M 1% /run
/dev/vda1 25G 3.2G 21G 14% /
tmpfs 491M 0 491M 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 491M 0 491M 0% /sys/fs/cgroup
tmpfs 99M 0 99M 0% /run/user/1000
123.175.112.87:/var/nfs/general 25G 18G 6.3G 74% /nfs/general
123.175.112.87:/home 25G 18G 6.3G 74% /nfs/home
Puedes ver los dos recursos compartidos montados en la parte inferior de la lista. Como ambos se han montado desde el mismo sistema de archivos, muestran el uso total del disco y no el uso real de los directorios montados.
Para ver cuánto espacio real se está utilizando en cada montaje, utiliza el siguiente comando.
$ du -sh /nfs/general
36K /nfs/general
Paso 6 – Prueba de compartición NFS
Crea un archivo de prueba en el recurso compartido /var/nfs/general
.
$ sudo touch /nfs/general/general.test
Comprueba su propiedad.
$ ls -l /nfs/general/general.test
-rw-r--r-- 1 nobody nogroup 0 Aug 1 13:31 /nfs/general/general.test
Se ha montado utilizando las opciones NFS por defecto y, como hemos creado el archivo utilizando la raíz desde la máquina cliente, la propiedad en el host se ha transferido a nobody:nogroup
. Aquí, el usuario cliente no puede realizar tareas administrativas en la máquina del host.
Crea un archivo de prueba en el recurso compartido /nfs/home`.
$ sudo touch /nfs/home/home.test
Comprueba su propiedad.
$ ls -l /nfs/home/home.test
-rw-r--r-- 1 root root 0 Aug 1 13:32 /nfs/home/home.test
En este caso, como creamos el archivo de prueba utilizando el usuario root de la máquina cliente, la propiedad se mantuvo en la máquina anfitriona. Esto se debe a que utilizamos la bandera no_root_squash
que permitía que el usuario root de la máquina cliente fuera también usuario root en la máquina anfitriona.
Paso 7 – Montar recursos compartidos NFS durante el arranque
Estos montajes no se conservarán una vez que arranques la máquina cliente. Para hacerlos permanentes, tenemos que editar el archivo /etc/fstab
.
Abre el archivo /etc/fstab
para editarlo.
$ sudo nano /etc/fstab
Pega las siguientes líneas en la parte inferior del archivo. Cada línea corresponde a cada directorio que queremos que se monte en el momento del arranque.
. . .
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
Para conocer estas opciones, consulta la página man de nfs
.
$ man nfs
Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te pida.
Reinicia el servidor para comprobar los montajes.
$ sudo reboot
Accede al cliente-servidor y comprueba que los montajes están presentes.
$ df -h
Filesystem Size Used Avail Use% Mounted on
udev 448M 0 448M 0% /dev
tmpfs 99M 664K 98M 1% /run
/dev/vda1 25G 3.2G 21G 14% /
tmpfs 491M 0 491M 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 491M 0 491M 0% /sys/fs/cgroup
tmpfs 99M 0 99M 0% /run/user/1000
123.175.112.87:/var/nfs/general 25G 18G 6.3G 74% /nfs/general
123.175.112.87:/home 25G 18G 6.3G 74% /nfs/home
Paso 8 – Desmontar los recursos compartidos NFS
Una vez que no necesites los montajes NFS, puedes desmontarlos utilizando el siguiente comando.
$ sudo umount /nfs/home
$ sudo umount /nfs/general
Un error común es utilizar unmount
en lugar de umount
que es el comando real.
Comprueba que se han desmontado correctamente.
$ df -h
Filesystem Size Used Avail Use% Mounted on
udev 448M 0 448M 0% /dev
tmpfs 99M 664K 98M 1% /run
/dev/vda1 25G 3.2G 21G 14% /
tmpfs 491M 0 491M 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 491M 0 491M 0% /sys/fs/cgroup
tmpfs 99M 0 99M 0% /run/user/1000
También tendrás que borrar sus entradas del archivo /etc/fstab
para que no se vuelvan a montar en el arranque. También puedes simplemente descomentar sus entradas colocando un carácter #
delante en caso de que necesites volver a montarlos.