Servidor NFS en Ubuntu

Publicado el 04 noviembre 2015 por José José Molino Ortega @BlogLinceus

NFS (Network File System, o sistema de archivos en red) es un protocolo cuya finalidad es la de proporcionar sistemas de archivos distribuidos en un entorno de red local. Básicamente lo que hacemos con NFS es que diversos clientes pueden acceder a ficheros remotos como si se tratase de ficheros locales.

Una vez tengamos instalados los paquetes necesarios para el funcionamiento del servidor, vamos a editar tres ficheros que serán /etc/exports, /etc/hosts.deny y /etc/hosts.allow. La misión de estos ficheros es clara: el primero de ellos nos permitirá indicar qué vamos a exportar, el segundo indicará los hosts que tendrán denegado el acceso y el tercero indicará qué equipos tienen permiso para conectarse a nosotros.

Empezaremos por /etc/exports. En él tendremos que indicar une nueva línea por cada fichero a compartir. La estructura que tendrá dicha línea es la siguiente.

directorio_compartir equipo(opcion1, opcion2, opcion3)

Cabe destacar que a la hora de indicar el equipo podremos hacerlo de tres formas diferentes. Si disponemos de resolución DNS y conocemos su nombre podemos utilizarlo. También podemos hacer uso de su IP o, si así lo requerimos, podemos exportar el directorio a una red concreta indicando su dirección de red y su máscara correspondiente.

En cuanto a las opciones que vemos en el formato de la línea son las siguientes:

    ro | rw: Si marcamos la opción ro le estaremos diciendo que el directorio se exporte como sólo lectura. Esta opción es la que esta por defecto. Si optamos por rw se permitirá la escritura en el directorio. Dependiendo de las características de la red debemos elegir una u otra.
    sync | async : Tratamos la sincronización con el servidor. Se recomienda respetar el protocolo NFS escogiendo la opción sync. Si optamos por async obtendríamos una mejora del rendimiento, pero supondría un riesgo en la consistencia de la información.
    root_squash | no_root_squash | all_squash : Esta opción nos permite enmascarar el acceso de los usuarios remotos. root_squash hará que un usuario identificado como root en el cliente remoto tendrá los privilegios de un usuario anónimo. no_root_squash evitaría este enmascaramiento y le otorgaría los privilegios que normalmente tiene. all_squash relizaría la operación de enmascarado con cualquier usuario.

Para entender mejor lo anteriormente explicado vamos a ver un ejemplo de lo que sería un fichero /etc/exports típico:

/home/linceus/datosCompartir 192.168.0.0(ro,sync,all_squash)

Una vez configurado el fichero exports vamos a hacer lo mismo con hosts.allow y hosts.deny. Ninguno de ellos es obligatorio pero se recomienda su configuración para garantizar la seguridad de los datos. Ambos poseen la misma estructura:

servicio: host [o red/mascara_subred], host [o red/mascara_subred], ....

Cambiar servicio por el servicio que vamos a permitir o denegar. En nuestro caso serán portmap y rpc.nfsd. Estos dos servicios se encargan de descubrir el puerto que está en escucha para NFS y para realizar la comunicación, respectivamente. Hay que tener en cuenta que NFS se basa en RPC y que este requiere de portmap para realizar un mapeado de puertos.

Para relizar una correcta configuración de nuestro servidor, vamos a tener en cuenta la seguridad y, por ello, es recomendable que en el hosts.deny bloqueemos portmap, ya que como se ha explicado, aunque sí se permita NFS éste requiere del portmap para funcionar. Si lo bloqueamos, ningún cliente que no esté en el hosts.allow podrá acceder a NFS. Para bloquearlo introduciremos la siguiente línea:

En el fichero hosts.allow vamos a permitir el acceso tanto a portmap como a nfs para los clientes que nosotros consideremos adecuados. En este ejemplo se considerará nuestra red como potenciales clientes.

portmap:192.168.0.0/255.255.255.0

nfs:192.168.0.0/255.255.255.0

Y con esto podemos dar por terminada la configuración de nuestro servidor.

Configuración desde el cliente

Ahora que hemos finalizado nuestras tareas en el servidor, queda montar en el cliente el directorio que estamos exportando. Un directorio exportado se monta en el cliente como un volumen con sistema de ficheros NFS. Digamos que es similar a una partición de un disco duro o a una memoria USB. Utilizaremos el siguiente comando.

linceus@cliente:~$ mount -t nfs direccion_servidor:/home/linceus/datosCompartir /home/usuario/datos

En este ejemplo cabe destacar varias cosas. La primera de ellas es que la opción -t nos permite decidir el sistema de archivos del volumen que estamos montando, en este caso NFS. Otra cosa que conviene tener en cuenta es que estamos montando nuestro volumen sobre un directorio que ya tiene que existir. Puesto que lo que hacemos es traernos el contenido del directorio exportado a nuestro directorio local. Si es un directorio que nos interesa tener disponible desde que arrancamos el equipo podría ser interesante meter el volumen en el fichero fstab para que se monte automáticamente al arrancar