El sistema de archivos de red (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 los archivos de la máquina remota como si fueran archivos locales.
El protocolo NFS no está cifrado por defecto y, a diferencia de Samba, no proporciona autenticación de usuario. El acceso al servidor está restringido por las direcciones IP o los nombres de host de los clientes.
En este tutorial, repasaremos cómo configurar un servidor NFSv4 en Ubuntu 18.04. También le mostraremos cómo montar un sistema de archivos NFS en el cliente.
Requisitos previos #
Este ejemplo asume que usted tiene un servidor que ejecuta Ubuntu 18.04 y otro que ejecuta cualquier otra distribución de Linux. El servidor y los clientes deben ser capaces de comunicarse entre sí a través de una red privada. Si su proveedor de alojamiento no ofrece direcciones IP privadas, puede utilizar las direcciones IP públicas y configurar el cortafuegos del servidor para permitir el tráfico en el puerto 2049
sólo desde fuentes de confianza.
Las máquinas de este ejemplo tienen las siguientes IPs:
NFS Server IP: 192.168.33.10NFS Clients IPs: From the 192.168.33.0/24 range
Configurar el servidor NFS #
Comenzaremos por instalar y configurar el servidor NFS.
Instalar el servidor NFS #
Refresca el índice de paquetes e instala el paquete del servidor NFS:
sudo apt update
sudo apt install nfs-kernel-server
Una vez completada la instalación, los servicios NFS se iniciarán automáticamente.
Por defecto, en Ubuntu 18.04 la versión 2 de NFS está desactivada. Las versiones 3 y 4 están habilitadas. Puedes comprobarlo ejecutando el siguiente comando cat
:
sudo cat /proc/fs/nfsd/versions
-2 +3 +4 +4.1 +4.2
NFSv2 es bastante antiguo ya, 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 por defecto es suficiente en nuestro caso.
Creando los sistemas de archivos #
Cuando se configura un servidor NFSv4 es una buena práctica es utilizar un directorio raíz NFS global y enlazar el montaje de los directorios reales al punto de montaje del recurso compartido. En este ejemplo, utilizaremos el director /srv/nfs4
como raíz NFS.
Vamos a compartir dos directorios (/var/www
y /opt/backups
), con diferentes ajustes de configuración, para explicar mejor cómo se pueden configurar los montajes NFS.
El /var/www/
es propiedad del usuario y grupo www-data
y /opt/backups
es propiedad de root
.
Crea el sistema de archivos de exportación utilizando el comando mkdir
:
sudo mkdir -p /srv/nfs4/backups
sudo mkdir -p /srv/nfs4/www
Monta los directorios reales:
sudo mount --bind /opt/backups /srv/nfs4/backups
sudo mount --bind /var/www /srv/nfs4/www
Para que los montajes bind sean permanentes, abre el archivo /etc/fstab
:
sudo nano /etc/fstab
y añade las siguientes líneas:
/opt/backups /srv/nfs4/backups none bind 0 0/var/www /srv/nfs4/www none bind 0 0
Exportando los sistemas de ficheros #
El siguiente paso es definir los sistemas de ficheros que serán exportados por el servidor NFS, las opciones de compartición y los clientes que tienen permiso para acceder a esos sistemas de ficheros. Para ello abre el archivo /etc/exports
:
sudo nano /etc/exports
/etc/exports
también contiene comentarios que describen cómo exportar un directorio.En nuestro caso necesitamos exportar los directorios www
y backups
y permitir el acceso sólo de los clientes de la 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 NFS /srv/nfs
. El acceso a este volumen NFS sólo está permitido a los clientes de la subred 192.168.33.0/24
. La opción crossmnt
es necesaria para compartir directorios que son subdirectorios de un directorio exportado.
En la segunda línea se muestra cómo especificar múltiples reglas de exportación para un sistema de archivos. Exporta el directorio /srv/nfs4/backups
y permite sólo el acceso de lectura a todo el rango de 192.168.33.0/24
y tanto el acceso de lectura como de escritura a 192.168.33.3
. La opción sync
indica a NFS que escriba los cambios en el disco antes de responder.
La última línea debería explicarse por sí misma. Para más información sobre todas las opciones disponibles escribe man exports
en tu terminal.
Guarda el archivo y exporta las acciones:
sudo exportfs -ra
Tienes que ejecutar el comando anterior cada vez que modifiques el archivo /etc/exports
. Si hay algún error o advertencia se mostrará en la terminal.
Para ver las exportaciones activas actuales y su estado, utiliza:
sudo exportfs -v
La salida incluirá todas las acciones con sus opciones. Como puedes ver también hay opciones que no hemos definido en el archivo /etc/exports
. Esas son las opciones por defecto y si quieres cambiarlas tendrás que configurarlas explícitamente.
/srv/nfs4/backups192.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/backups192.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á activado por defecto. Esta es una de las opciones más importantes en cuanto a la seguridad de NFS. Evita que los usuarios root conectados desde los clientes tengan privilegios de root en los recursos compartidos montados. Mapeará el root UID
y GID
a nobody
nogroup
UID
GID
.
Para que los usuarios de los equipos cliente tengan acceso, NFS espera que los ID de usuario y grupo 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 a nombres y al revés.
Eso es todo. En este punto, has configurado un servidor NFS en tu servidor Ubuntu. Ahora puede pasar al siguiente paso y configurar los clientes y conectarse al servidor NFS.
Configuración del firewall #
Si ejecuta un firewall en su red, tendrá que añadir una regla que permita el tráfico en el puerto NFS.
Suponiendo que estás usando UFW
para gestionar tu firewall para permitir el acceso desde la 192.168.33.0/24
subred necesitas ejecutar el siguiente comando:
sudo ufw allow from 192.168.33.0/24 to any port nfs
Para verificar el cambio ejecuta:
sudo ufw status
La salida debe mostrar que el tráfico en el puerto 2049
está permitido:
To Action From-- ------ ----2049 ALLOW 192.168.33.0/24 22/tcp ALLOW Anywhere 22/tcp (v6) ALLOW Anywhere (v6)
Configurar los clientes NFS #
Ahora que el servidor NFS está configurado y los recursos compartidos están exportados el siguiente paso es configurar los clientes y montar los sistemas de archivos remotos.
También se pueden montar los recursos compartidos NFS en máquinas macOS y Windows, pero nosotros nos centraremos en los sistemas Linux.
Instalar el cliente NFS #
En las máquinas cliente sólo tenemos que instalar las herramientas necesarias para montar un sistema de archivos NFS remoto.
-
Instalar el cliente NFS en Debian y Ubuntu
El nombre del paquete que incluye los programas para montar sistemas de archivos NFS en las distribuciones basadas en Debian es
nfs-common
. Para instalarlo ejecuta:sudo apt update
sudo apt install nfs-common
-
Instala el cliente NFS en CentOS y Fedora
En Red Hat y sus derivados instala el paquete
nfs-utils
:sudo yum install nfs-utils
Montando sistemas de archivos #
Trabajaremos en la máquina cliente con IP 192.168.33.110
que tiene acceso de lectura y escritura al sistema de archivos /srv/nfs4/www
y acceso de sólo lectura al sistema de archivos /srv/nfs4/backups
.
Crea dos nuevos directorios para los puntos de montaje. Puedes crear estos directorios en la ubicación que quieras.
sudo mkdir -p /backups
sudo mkdir -p /srv/www
Monta 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 se puede utilizar el nombre de host en lugar de la dirección IP, pero tiene que ser resoluble por la máquina cliente. Esto se suele hacer mapeando el nombre de host a la IP en el archivo /etc/hosts
.
Cuando se monta un sistema de archivos NFSv4, hay que omitir el directorio raíz NFS, por lo que en lugar de /srv/nfs4/backups
hay que usar /backups
.
Verifica que los sistemas de archivos remotos están montados con éxito utilizando el comando mount o df
:
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% /devtmpfs 244M 0 244M 0% /dev/shmtmpfs 244M 4.5M 240M 2% /runtmpfs 244M 0 244M 0% /sys/fs/cgroup/dev/sda2 1014M 87M 928M 9% /boottmpfs 49M 0 49M 0% /run/user/1000192.168.33.10:/backups 9.7G 1.2G 8.5G 13% /backups192.168.33.10:/www 9.7G 1.2G 8.5G 13% /srv/www
Para que los montajes sean permanentes al reiniciar, abre el archivo /etc/fstab
:
sudo nano /etc/fstab
y añade las siguientes líneas:
192.168.33.10:/backups /backups nfs defaults,timeo=900,retrans=5,_netdev0 0192.168.33.10:/www /srv/www nfs defaults,timeo=900,retrans=5,_netdev0 0
Para encontrar más información sobre las opciones disponibles al montar un sistema de archivos NFS, escribe man nfs
en tu terminal.
Otra opción para montar los sistemas de archivos remotos es utilizar la herramienta autofs
o crear una unidad systemd.
Probando el acceso a NFS #
Probemos el acceso a los recursos compartidos creando un nuevo archivo en cada uno de ellos.
Primero, intenta crear un archivo de prueba en el directorio /backups
utilizando el comando touch
:
sudo touch /backups/test.txt
El sistema de archivos /backup
se exporta como de sólo lectura y como era de esperar verás un Permission denied
mensaje de error:
touch: cannot touch ‘/backups/test’: Permission denied
A continuación, intenta crear un archivo de prueba al directorio /srv/www
como raíz utilizando el comando sudo
:
sudo touch /srv/www/test.txt
De nuevo, verás el mensaje Permission denied
.
touch: cannot touch ‘/srv/www’: Permission denied
Si recuerdas el directorio /var/www
es propiedad del usuario www-data
y este recurso compartido tiene root_squash
que asigna el usuario root al usuario nobody
y al grupo nogroup
que no tiene permisos de escritura en el recurso compartido remoto.
Suponiendo que tienes un www-data
uso en la máquina cliente con el mismo UID
y GID
que en el servidor remoto (que debería ser el caso si por ejemplo, instalaste nginxen ambas máquinas) puedes probar a crear un archivo como usuario www-data
con:
sudo -u www-data touch /srv/www/test.txt
El comando no mostrará ninguna salida lo que significa que el archivo se ha creado con éxito.
Para verificarlo lista los archivos en el directorio /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
Desmontaje del sistema de archivos NFS #
Si ya no necesita el recurso compartido NFS remoto, puede desmontarlo como cualquier otro sistema de archivos montado utilizando el comando umount. Por ejemplo, para desmontar el recurso compartido /backup
debe ejecutar:
sudo umount /backups
Si el punto de montaje está definido en el archivo /etc/fstab
, asegúrate de eliminar la línea o comentarla añadiendo #
al principio de la línea.
Conclusión #
En este tutorial, hemos mostrado cómo configurar un servidor NFS y cómo montar los sistemas de archivos remotos en las máquinas cliente. Si estás implementando NFS en producción y compartiendo datos sensibles es una buena idea habilitar la autenticación kerberos.
Como alternativa a NFS, puedes usar SSHFSpara montar directorios remotos a través de una conexión SSH. SSHFS está encriptado por defecto y es mucho más fácil de configurar y utilizar.