Compartiendo recursos con NFS

¿Que es NFS?

Network File System o NFS, es un protocolo del nivel de aplicación. NFS nos ofrece la posibilidad de utilizar recursos compartidos de diferentes máquinas como si estas fueran locales, es decir, podemos tener acceso a un directorio de una máquina remota de una manera transparente para el usuario, dando la impresión de que esa carpeta a la que accedemos esta en nuestra computadora.

NFS fue desarrollado por Sun Microsystems en 1984 para proveer de conectividad entre máquinas fuera cual fuera el sistema operativo y el protocolo de transporte. Este protocolo esta incluido en sistemas Unix y Linux.

El sistema NFS, al igual que muchos otros protocolos, se basan en la conexión cliente-servidor. NFS permite un ahorro de espacio en las estaciones de trabajo, ya que los datos se encuentran centralizados en un único equipo (servidor) y las estaciones acceden al disco del servidor de manera transparente. Cabe destacar que las operaciones realizadas con NFS son Síncronas.

Primeros pasos

Lo primero que necesitamos para proceder a montar un sistema de ficheros NFS, es un Servidor NFS. Para ello necesitaremos instalar los siguientes paquetes:

portmap
nfs-kernel-server
nfs-common

Configurando el servidor

Es el momento de configurar nuestro servidor. Para ello, sera necesario editar los ficheros:
/etc/exports <- Aquí indicaremos los recursos compartidos
/etc/hosts.allow <- Aquí indicaremos los sistemas que tendrán acceso a nuestros recursos
/etc/hosts.deny <- Aquí indicaremos los sistemas a los cuales se les rechazará el acceso

De echo, editando solamente el fichero /etc/exports el servidor NFs funcionaria correctamente, pero tendríamos un gran problema de seguridad, por lo que es necesario editar todos los ficheros comentados tal y como se indicará posteriormente.

Editando /etc/exports

Este fichero contiene una lista de entradas. Cada una de las entradas especificadas, indicará el directorio/recurso que será compartido. A continuación explicaremos de manera básica como configurar dicho fichero, para mas información, el equipo de FreeTux recomendamos leer el manual en linea de exports ($ man exports) para una completa descripción de las posibilidades de configuración del fichero.

una entrada típica del fichero exports podría ser:

directorio_servidor cliente1 (opción1,opción2)
cliente2 (opcion1,opcion2)

Dónde:

directorio_servidor = El directorio que vamos a compartir de nuestro servidor. Todos los subdirectorios incluidos en este también serán compartidos.
cliente1 y cliente2= Estación de trabajo a la cual damos acceso. Están pueden ser indicadas por su dirección DNS o por IP. En caso de indicar la dirección DNS, esta debe poder ser resuelta, ya sea, usando un servidor DNS o estableciendo la relación de nombre de host e IP en nuestro fichero /etc/hosts para que nuestro servidor pueda resolver la IP.
Opcion1,2= Estas opciones indican el nivel de acceso al recurso compartido. Estas pueden ser algunas de las que pueden ser utilizadas:

ro: Read-only: solo lectura, la máquina en cuestión solo dispondrá de acceso de lectura al recurso compartido.
rw: Read-write: Lectura/escritura, la máquina dispondrá de los permisos lectura/escritura sobre el recurso compartido.
no_root_squash: Cualquier fichero creado por root aparecerá como si hubiera sido creado por el usuario nobody en el servidor. Si esta opción esta activa, el usuario root del cliente dispondrá de los permisos de root dentro del recurso del servidor, algo que debería ser evitado por las implicaciones de seguridad que podrían tener.
sync: Esta opción evita la corrupción de datos si el servidor se reinicia.

A continuación, os mostramos un fichero /etc/exports de muestra:

/usr/local cliente_remoto1 (ro)
/home/cliente2 cliente_remoto2 (rw)

Esto indica lo siguiente:

Habilitamos que el equipo de nombre “cliente_remoto1” (el cual debe estar dado de alta en hosts para que pueda ser resuelta su dirección IP) tiene acceso de solo lectura al directorio local /usr/local
Habilitamos además para el equipo “cliente_remoto2” el directorio /home/cliente2, para el cual dispone de permisos de lectura/escritura y podrá ser utilizado como almacenamiento para dicho equipo.

Podemos también habilitar el acceso para rangos de IPs especificos, para ello utilizaremos la dirección de red y la mascara, como por ejemplo:

/home/recurso_compartido 192.168.0.0/255.255.255.0 (ro)

Con esta linea habilitamos el recurso para las 254 direcciones dentro de la red 192.168.0.1/255 siendo la 255 de Broadcast.

NOTA: Debemos evitar exportar recursos en FAT o VFAT, pues este sistema de ficheros no ha sido diseñado para compartirse y puede no funcionar del todo correctamente.

Los ficheros /etc/hosts.allow y /etc/hosts.deny

Estos ficheros son específicos para computadoras que pueden utilizar en la red los servicios de nuestra máquina. Cada linea de este fichero indica un servicio y el listado de máquinas.

Cuando nuestra máquina recibe una petición de servicio, lo primero que hace nuestro servidor es chequear el fichero hosts.allow en busca de alguna regla, en la cual este especificada la máquina que solicita el servicio. Si existe, dicha máquina podrá utilizar el servicio.
Si la máquina no es encontrada en hosts.allow, el siguiente paso es buscar en el fichero hosts.deny para comprobar nuevamente si aparece una regla que afecte a la máquina que solicita el servicio. Si existe, se deniega el acceso.
Si la máquina no dispone de ninguna regla que le afecte dispondrá de acceso a los servicios ofrecidos por el servidor.

Las conexiones pueden controlarse a nivel de red, deshabilitando puertos o filtrando IPS, pero este fichero nos ayuda a depurar aun mas la seguridad en nuestro servidor. Lo primero que haremos será añadir los servicios que serán utilizados para el mapeo de recursos, denegaremos todo acceso por defecto y de este modo solo dejaremos entrar aquellos que hayamos especificado en nuestro fichero hosts.allow.

El primer demonio que deberemos restringir es “portmapper”. Este demonio es el responsable para que lo clientes encuentren los servicios NFS. Restringir dicho demonio es la mejor defensa que podemos habilitar para que defender nuestro sistema NFS, ya que no es posible conocer si existe un servicio NFS en dicho servidor. El primer paso, pues sera editar el fichero /etc/hosts.deny, las sintaxis de cada linea son:

Servicio:IP (ALL indica que son todas las IPS)

En nuestro caso, añadiremos las siguientes lineas:

portmap:ALL
lockd:ALL
mountd:ALL
rquotad:ALL
statd:ALL

Muchos administradores editan dicho fichero y incluyen una única entrada (ALL:ALL) el cual deniega todos los servicios a todas las IPS. Este es un buen método de seguridad, pero es necesario disponer del conocimiento necesario para saber que servicios deben ser accesibles para habilitarlos a hosts.allow, además de tenerlo constantemente presente, ya que en caso de instalar un nuevo servicio deberemos habilitarlo también.

Lo siguiente que debemos hacer es editar el fichero hosts.allow para garantizar el acceso a los servicios que especifiquemos. La sintaxis del fichero es la siguiente:

service: host o red, host o red, …

Cada host será un cliente con acceso. Supongamos que queremos dar acceso a una máquina llamada test1 con IP 192.168.0.3. Entonces editaremos el fichero hosts.allow y añadiremos la siguiente linea:

portmap: 192.168.0.3

Si quisiéramos añadir mas clientes, solo deberíamos añadir las ips a continuación separándolos mediante una “,”.

portmap: 192.168.0.3 , 192.168.0.4

y lo mismo haremos para el resto de servicios necesarios:

lockd: 192.168.0.3 , 192.168.0.4
mountd: 192.168.0.3 , 192.168.0.4
rquotad: 192.168.0.3 , 192.168.0.4
statd: 192.168.0.3 , 192.168.0.4

Si el número de máquinas es muy elevado es posible utilizar red/mascara tal y como se había comentado anteriormente para habilitar el recurso.

Comprobaciones

Para comprobar que los servicios necesarios están activos, realizaremos las siguientes comprobaciones:

$ ps aux | grep portmap

Comprobando que portmap esta levantado. Tras ello realizaremos lo siguiente:

$ rpcinfo -p localhost

Rpcinfo realiza una llamada de procedimiento remoto (RPC) a un servidor RPC e informa de lo que encuentra. Deberemos fijarnos sobretodo que nfs aparece. El resto de servicios que aparecen son también importantes y pueden ser habilitados y deshabilitados por host en host.allow y hosts.deny

Una vez hayamos echo los cambios necesarios en los ficheros indicados, debemos hacer el demonio nfsd lea de nuevo el fichero exports, para ello podemos reiniciar el servicio nfsd o realizar lo siguiente:

$ sudo exportfs -ra

Con ello obligamos a nfsd a releer y cargar el fichero exports.

Montando el recurso compartido en la máquina cliente

Tras haber realizado el proceso de configuración del servidor es necesario proceder a configurar el montaje del recurso compartido en el equipo cliente. Es necesario que este habilitado el modulo nfs o que este incluido en el kernel además de disponer los servicios portmap, lockd y statd para que funcione correctamente. Tras dicha comprobación procederemos a realizar el montaje del disco compartido.

Suponemos que tenemos un servidor llamado server1.test, del cual hemos decidido compartir una carpeta llamada /home/recursos. Primeramente crearemos un punto de montaje en nuestro equipo, dónde realizaremos el montaje de ese disco. Un lugar podría ser /mnt, por lo que crearemos una carpeta en esta ubicación:

$ mkdir /mnt/punto_montaje

Una vez realizado, realizaremos lo siguiente:

$ mount server1.test:/home/recursos /mnt/punto_montaje

Esto montara el recurso compartido, haciendo que la carpeta /mnt/punto_montaje sea realmente la carpeta /home/recursos.

Montando el recurso automáticamente al arrancar el sistema

Para ello deberemos añadir una linea en nuestro fichero /etc/fstab. Este fichero indica los puntos que son montados durante el arranque de nuestro sistema. Por ello añadiremos una linea lo cual hará que e recurso remoto sea añadido a nuestro sistema de ficheros nada mas arrancar la máquina. Siguiendo con el ejemplo haríamos:

server1.test:/home/recursos /mnt/punto_montaje nfs rw,hard,intr 0 0

Para mas detalles relacionados con NFS recomendamos la lectura del manual online NFS en la siguiente dirección, http://nfs.sourceforge.net/nfs-howto/.

2 comentarios to “Compartiendo recursos con NFS”

  1. sinergiatec Says:

    Esto si que es una magnífica guía de cómo trabajar con NFS!!

  2. cristiansan Says:

    Muchas gracias Sinergiatec, de echo era mi artículo para una revista libre llamada Freetux, no se a que ha sido debido, pero han dejado de publicar números por lo que imagino que han quedado faltos de gente. Debido a los meses de espera he decidido al fin publicarlo, ya que la intención de esta guia es que este al alcance de cualquiera que lo necesite.

    De nuevo, gracias!😀

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s


A %d blogueros les gusta esto: