Introducción
Network File System (NFS) es un protocolo de sistema de archivos distribuido que permite compartir directorios remotos a través de una red. Con NFS, puede montar directorios remotos en su sistema y trabajar con archivos en la computadora remota como si fueran archivos locales.
El protocolo NFS no está cifrado de forma predeterminada y, a diferencia de Samba, no proporciona autenticación de usuario. El acceso al servidor está restringido por direcciones IP de cliente o nombres de host.
En este tutorial, veremos cómo configurar un servidor NFSv4 en Ubuntu 18.04 Bionic Beaver. También le mostraremos cómo montar un sistema de archivos NFS en el cliente.
Prerrequisitos
Este ejemplo supone que tiene un servidor con Ubuntu 18.04 y otro con cualquier otra distribución de Linux. El servidor y los clientes deben poder comunicarse entre sí a través de una red privada. Si su proveedor de alojamiento no ofrece direcciones IP privadas, puede usar direcciones IP públicas y configurar el firewall del servidor para permitir el tráfico en el puerto 2049
solo de fuentes confiables.
Las máquinas de este ejemplo tienen las siguientes direcciones IP:
NFS Server IP: 192.168.33.10
NFS Clients IPs: From the 192.168.33.0/24 range
Instale el servidor NFS
Actualice el índice del paquete e instale el paquete del servidor NFS:
sudo apt update
sudo apt install nfs-kernel-server
Una vez que se complete la instalación, los servicios NFS se iniciarán automáticamente.
De forma predeterminada, en Ubuntu 18.04 NFS versión 2 está deshabilitada. Las versiones 3 y 4 están habilitadas. Puede verificar esto ejecutando el siguiente comando cat
sudo cat /proc/fs/nfsd/versions
-2 +3 +4 +4.1 +4.2
NFSv2 es bastante antiguo ahora y no hay razón para habilitarlo.
Las opciones de configuración del servidor NFS se establecen en los archivos /etc/default/nfs-kernel-server
y /etc/default/nfs-common
. La configuración predeterminada es suficiente en nuestro caso.
Crea los sistemas de archivos
Al configurar un servidor NFSv4, es una buena idea utilizar un directorio raíz global de NFS y asignar los directorios reales al punto de montaje compartido. En este ejemplo, usaremos el director /srv/nfs4
como raíz de NFS.
Compartiremos dos directorios ( /var/www
y /opt/backups
), con diferentes ajustes de configuración, para explicar mejor cómo se pueden configurar los montajes NFS.
/var/www/
es propiedad del usuario y del grupo de www-data
/opt/backups
es propiedad de root
.
Cree el sistema de archivos de exportación usando el comando mkdir
sudo mkdir -p /srv/nfs4/backups
sudo mkdir -p /srv/nfs4/www
Monte los directorios reales:
sudo mount --bind /opt/backups /srv/nfs4/backups
sudo mount --bind /var/www /srv/nfs4/www
Para hacer que los montajes de enlace sean permanentes, abra el /etc/fstab
:
sudo nano /etc/fstab
Agrega las siguientes líneas:
/opt/backups /srv/nfs4/backups none bind 0 0
/var/www /srv/nfs4/www none bind 0 0
Guarde y cierre el archivo.
Exportar los sistemas de archivos
El siguiente paso es definir los sistemas de archivos que se exportarán desde el servidor NFS, las opciones de uso compartido y los clientes que pueden acceder a esos sistemas de archivos. Para hacer esto, abra el /etc/exports
:
sudo nano /etc/exports
El /etc/exports
también contiene comentarios que describen cómo exportar un directorio.
En nuestro caso, necesitamos exportar los www
y backups
y permitir el acceso solo desde el cliente de red 192.168.33.0/24
:
/srv/nfs4 192.168.33.0/24(rw,sync,no_subtree_check,crossmnt,fsid=0)
/srv/nfs4/backups 192.168.33.0/24(ro,sync,no_subtree_check) 192.168.33.3(rw,sync,no_subtree_check)
/srv/nfs4/www 192.168.33.110(rw,sync,no_subtree_check)
La primera línea contiene fsid=0
que define el directorio raíz de /srv/nfs
El acceso a este volumen NFS solo está permitido a los clientes de la subred 192.168.33.0/24
La crossmnt
es necesaria para compartir directorios que son subdirectorios de un directorio exportado.
La segunda línea muestra cómo especificar varias reglas de exportación para un sistema de archivos. Exporta el directorio /srv/nfs4/backups
que solo permite acceso de lectura a todo el rango de 192.168.33.0/24
y acceso de lectura y escritura a 192.168.33.3
. La sync
le dice a NFS que escriba los cambios en el disco antes de responder.
La última línea debería ser autoexplicativa. Para obtener más información sobre todas las opciones disponibles, escriba man exports
en su terminal.
Guarde el archivo y exporte los recursos compartidos:
sudo exportfs -ra
Debe ejecutar el comando anterior cada vez que cambie el /etc/exports
. En caso de errores o advertencias, se mostrarán en el terminal.
Para ver las exportaciones activas actuales y su estado, use:
sudo exportfs -v
La salida incluirá todas las acciones con sus opciones. Como puede ver, también hay opciones que no hemos definido en el /etc/exports
. Estas son opciones predeterminadas y si desea cambiarlas, debe configurarlas explícitamente.
/srv/nfs4/backups
192.168.33.3(rw,wdelay,root_squash,no_subtree_check,sec=sys,rw,secure,root_squash,no_all_squash)
/srv/nfs4/www 192.168.33.110(rw,wdelay,root_squash,no_subtree_check,sec=sys,rw,secure,root_squash,no_all_squash)
/srv/nfs4 192.168.33.0/24(rw,wdelay,crossmnt,root_squash,no_subtree_check,fsid=0,sec=sys,rw,secure,root_squash,no_all_squash)
/srv/nfs4/backups
192.168.33.0/24(ro,wdelay,root_squash,no_subtree_check,sec=sys,ro,secure,root_squash,no_all_squash)
En Ubuntu, root_squash
está habilitado de forma predeterminada. Esta es una de las opciones más importantes para la seguridad NFS. Evita que los usuarios root que hayan iniciado sesión desde los clientes tengan privilegios de root en recursos compartidos montados. Se trazará un mapa de raíz UID
y GID
a nobody
/nogroup
UID
/GID
.
Para que los usuarios de los equipos cliente tengan acceso, NFS espera que los ID de grupo y de usuario del cliente coincidan con los del servidor. Otra opción es utilizar la función idmapping de NFSv4 que traduce los ID de usuario y grupo en nombres y viceversa.
Eso es todo. En este punto, ha configurado un servidor NFS en su servidor Ubuntu. Ahora puede ir al siguiente paso y configurar los clientes y conectarse al servidor NFS.
Configurar el firewall
Si está ejecutando un firewall en su red, deberá agregar una regla que habilite el tráfico en el puerto NFS.
Suponiendo que está utilizando UFW
para administrar su firewall para permitir el acceso desde la 192.168.33.0/24
, debe ejecutar el siguiente comando:
sudo ufw allow from 192.168.33.0/24 to any port nfs
Para verificar que se ha realizado el cambio:
sudo ufw status
El resultado debe mostrar que se permite 2049
To Action From
-- ------ ----
2049 ALLOW 192.168.33.0/24
22/tcp ALLOW Anywhere
22/tcp (v6) ALLOW Anywhere (v6)
Configurar clientes NFS
Ahora que el servidor NFS está configurado y los recursos compartidos se exportan, el siguiente paso configurará los clientes y montará los sistemas de archivos remotos.
También puede montar el recurso compartido NFS en máquinas macOS y Windows, pero nos centraremos en los sistemas Linux.
Instalación del cliente NFS
En los equipos cliente, solo debe instalar las herramientas necesarias para montar un sistema de archivos NFS remoto.
Instale el cliente NFS en Debian y Ubuntu
El nombre del paquete que incluye programas para montar sistemas de archivos NFS en distribuciones basadas en Debian es nfs-common
. Para instalarlo, ejecute:
sudo apt update
sudo apt install nfs-common
Instale el cliente NFS en CentOS y Fedora
En Red Hat y sus derivados, instale el paquete nfs-utils
sudo yum install nfs-utils
Montaje de los sistemas de archivos
Trabajaremos en la computadora cliente con IP 192.168.33.110
que tiene acceso de lectura y escritura al /srv/nfs4/www
y acceso de solo lectura al sistema de archivos /srv/nfs4/backups
.
Cree dos nuevos directorios para los puntos de montaje. Puede crear estos directorios en cualquier ubicación deseada.
sudo mkdir -p /backups
sudo mkdir -p /srv/www
Monte los sistemas de archivos exportados con el comando mount
sudo mount -t nfs -o vers=4 192.168.33.10:/backups /backups
sudo mount -t nfs -o vers=4 192.168.33.10:/www /srv/www
Donde 192.168.33.10
es la IP del servidor NFS. También puede utilizar el nombre de host en lugar de la dirección IP, pero la computadora cliente debe poder resolverlo. Esto generalmente se hace asignando el nombre de host a la IP en el /etc/hosts
.
Al montar un sistema de archivos NFSv4, se debe omitir el directorio raíz de NFS, por lo que en lugar de /srv/nfs4/backups
use /backups
.
Verifique que los sistemas de archivos remotos estén montados correctamente mediante el df
o mount:
df -h
El comando imprimirá todos los sistemas de archivos montados. Las dos últimas líneas son los recursos compartidos montados:
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/VolGroup00-LogVol00 38G 1.7G 36G 5% /devtmpfs 236M 0 236M 0% /dev
tmpfs 244M 0 244M 0% /dev/shm
tmpfs 244M 4.5M 240M 2% /run
tmpfs 244M 0 244M 0% /sys/fs/cgroup
/dev/sda2 1014M 87M 928M 9% /boot
tmpfs 49M 0 49M 0% /run/user/1000
192.168.33.10:/backups 9.7G 1.2G 8.5G 13% /backups
192.168.33.10:/www 9.7G 1.2G 8.5G 13% /srv/www
Para hacer que los montajes sean permanentes al reiniciar, abra el /etc/fstab
:
sudo nano /etc/fstab
Agrega las siguientes líneas:
192.168.33.10:/backups /backups nfs defaults,timeo=900,retrans=5,_netdev 0 0
192.168.33.10:/www /srv/www nfs defaults,timeo=900,retrans=5,_netdev 0 0
Guarde y cierre el archivo.
Para obtener más información sobre las opciones disponibles al montar un sistema de archivos NFS, escriba man nfs
en la terminal.
Otra opción para montar sistemas de archivos remotos es usar la autofs
o crear una unidad systemd.
Prueba de acceso NFS
Probemos el acceso a los recursos compartidos creando un nuevo archivo para cada uno de ellos.
Primero, intente crear un archivo de prueba en el /backups
usando el comando touch
sudo touch /backups/test.txt
El sistema de archivos /backup
se exporta como de solo lectura y, como se esperaba, se mostrará un mensaje de error de Permission denied
touch: cannot touch '/backups/test': Permission denied
Luego, intente crear un archivo de prueba en el /srv/www
como root usando el comando sudo
sudo touch /srv/www/test.txt
Nuevamente, verá un mensaje de Permission denied
touch: cannot touch '/srv/www': Permission denied
Si recuerda que el directorio /var/www
es propiedad de los usuarios de www-data
root_squash
opción root_squash, que asigna el usuario root al usuario de nobody
y al nogroup
que no tiene permisos de escritura en el recurso compartido remoto.
Suponiendo que tiene un www-data
en la computadora cliente con el mismo UID
y GID
en el servidor remoto (que debería ser el caso si, por ejemplo, tiene nginx instalado en ambas computadoras), puede probar para crear un archivo como www-data
usuario con el siguiente comando:
sudo -u www-data touch /srv/www/test.txt
El comando no mostrará ningún resultado, lo que significa que el archivo se creó correctamente.
Para verificar esto, enumere los archivos en el /srv/www
:
ls -la /srv/www
La salida debería mostrar el archivo recién creado:
drwxr-xr-x 3 www-data www-data 4096 Jun 23 22:18.
drwxr-xr-x 3 root root 4096 Jun 23 22:29..
-rw-r--r-- 1 www-data www-data 0 Jun 23 21:58 index.html
-rw-r--r-- 1 www-data www-data 0 Jun 23 22:18 test.txt
Desmontar el sistema de archivos NFS
Si ya no necesita el recurso compartido NFS remoto, puede desmontarlo como cualquier otro sistema de archivos montado usando el comando umount. Por ejemplo, para desmontar el recurso compartido /backup
, hará lo siguiente:
sudo umount /backups
Si el punto de montaje está definido en el /etc/fstab
, asegúrese de eliminar la línea o comentarla agregando #
al principio de la línea.
Conclusión
En este tutorial, le mostramos cómo configurar un servidor NFS y cómo montar sistemas de archivos remotos en computadoras cliente. Si está implementando NFS en producción y comparte datos confidenciales, es una buena idea habilitar la autenticación Kerberos.
Como alternativa a NFS, SSHFS se puede utilizar para montar directorios remotos a través de una conexión SSH. SSHFS está encriptado de forma predeterminada y es mucho más fácil de configurar y usar.