NFS: Sistemas de Archivos en Red

El sistemas de archivos en red (NFS - Network File System) le permite montar un directorio de un host remoto en su árbol de directorios local como si de un dispositivo físico se tratase; lo cual le permitirá acceder a archivos y directorios remotos como si estuviera accediendo a ficheros locales, compartir directorios comunes en sistemas similares o incluso crear terminales diskless. En este tutorial se le guiará en la configuración de una red NFS.

Preparar el kernel
Para poder usar NFS, ya sea como cliente o servidor, precisará activar soporte para NFS en el kernel. Si no está seguro si tiene activado soporte para NFS en su kernel, puede verificarlo consultando /proc/filesystems

agd-desktop # cat /proc/filesystems | grep -i nfs
nodev nfs
nodev nfsd

En este caso, como podrá observar, está compilado el soporte para NFS en modo servidor (nfsd) y cliente (nfs). Tenga en cuenta de que si usted ha compilado el soporte para nfs como módulo, en /proc/filesystems no habrá referencias a él hasta que lo cargue. Si usted tiene duda, siempre puede consultar los módulos disponibles usando lsmod; y si la salida es larga filtre el contenido con lsmod | grep -i nfs.

Si precisa activar el soporte para NFS, podrá hacerlo en:
.config - Linux Kernel v2.6.36-gentoo-r8 ConfigurationFile systems
 [*] Network File Systems
  <*> NFS client support
  [*] NFS client support for NFS version 3
  [*] NFS client support for the NFSv3 ACL protocol extension
  [ ] NFS client support for NFS version 4
  <*> NFS server support
  [*] NFS server support for NFS version 3
  [*] NFS server support for the NFSv3 ACL protocol extension
  [ ] NFS server support for NFS version 4 (EXPERIMENTAL)


Configurar el servidor NFS
Por defecto no se comparte ningún directorio por NFS, y es usted quien deberá indicar que directorios desea exportar a otras máquinas. El archivo de configuración del servidor de NFS (/etc/exports) se estructura en líneas, donde cada una define el directorio a exportar seguido del ordenador -u ordenadores- que tiene acceso al recursos compartido y entre paréntesis las opciones de exportación separadas por comas. A continuación podrá ver un ejemplo de un archivo de configuración de NFS:
agd-desktop # nano /etc/exports
# /etc/exports: NFS file systems being exported.  See exports(5).
/usr/portage 192.168.1.120(sync,ro,no_subtree_check)
/usr/portage/distfiles 192.168.1.120(sync,rw,subtree_check,no_root_squash)
/tmp 192.168.1.120(sync,rw,subtree_check,no_root_squash)
/media/net-rw/donkey/incoming 192.168.1.120(sync,rw,subtree_check,all_squash,anonuid=1003,anongid=100) 192.168.1.0/24(sync,ro,all_squash,subtree_check)
/media/net-rw/donkey/temp 192.168.1.120(sync,rw,subtree_check,all_squash,anonuid=1003,anongid=100)

Las opciones más comunes son:
  • ro El directorio será exportado en modo solo lectura.
  • rw El directorio será exportado en modo solo lectura-escritura.
  • root_squash Mapea las peticiones con uid 0 (usuario root) a uid 65534 (normalmente asociado al usuario nobody).
  • no_root_squash Permite el acceso como usuario root, desde el cliente, al directorio exportado.
  • all_squash Mapea todas las uid y gid a la cuenta anónima.
  • anonuid y anongid Permite especificar el uid y el gid de la cuenta anónima.
  • subtree_check Verifica que el archivo solicitado por el cliente se encuentra dentro del árbol del directorio exportado. Supone un aumento de la seguridad cuando está exportando un subdirectorio de un sistema de ficheros.
  • no_subtree_check Desactiva la verificación. Supone un aumento de velocidad en las transferencias. Es común utilizarlo cuando exporta un sistema de ficheros al completo.
  • sync Responde a las peticiones de escritura del cliente después de que estás sean trasladadas al disco. Previene perdidas y corrupciones de datos al ser apagado el equipo.
  • async Responde a las peticiones de escritura del cliente antes de que estás sean trasladadas al disco. Si ocurre un apagado repentino, supondrá la pérdida y/o corrupción de datos.
  • link_relative Convierte los enlaces simbólicos a enlaces relativos.
  • link_absolute No convierte los enlaces simbólicos a enlaces relativos.

Si cambia la configuración de /etc/exports, recuerde recargar los nuevos valores con exportfs -ra
Si usted quiere consultar la lista de host que están accediendo a sus recursos compartidos a través de NFS, puede hacerlo usando el comando showmount. Además con las opciones -a, -d y -e podrá ampliar la información mostrando host:recurso compartido, recurso compartido y la lista de directorios a exportar respectivamente. La opción que normalmente se usa, por ser la más completa es showmount -a.
agd-desktop # showmount -a
All mount points on agd-desktop:
192.168.1.120:/home/p2p/mldonkey/incoming
192.168.1.120:/home/p2p/mldonkey/temp
192.168.1.120:/media/net-rw/donkey/incoming
192.168.1.120:/media/net-rw/donkey/temp
192.168.1.120:/tmp
192.168.1.120:/usr/portage
192.168.1.120:/usr/portage/distfiles
192.168.1.121:/media/net-rw/donkey/incoming
192.168.1.136:/tmp


Configurar el cliente NFS
Recuerde que los clientes, al igual que el servidor, deben tener soporte para NFS en el kernel ya sea compilado estáticamente o como módulo. Para acceder a un directorio exportado por un servidor NFS, deberá montarlo dentro de su árbol de directorios, a través del comando mount (mount -t nfs servidor-nfs:ruta directorio-donde-montar opciones) o bien añadiendo una entrada a su /etc/fstab para que se automonte en el inicio del sistema
agd-server # mount -vt nfs 192.168.1.20:/media/net-rw/donkey/incoming /media/donkey/
mount.nfs: timeout set for Tue Apr 26 09:17:09 2011
mount.nfs: trying text-based options 'vers=4,addr=192.168.1.20,clientaddr=192.168.1.120'
mount.nfs: mount(2): Protocol not supported
mount.nfs: trying text-based options 'addr=192.168.1.20'
mount.nfs: prog 100003, trying vers=3, prot=6
mount.nfs: trying 192.168.1.20 prog 100003 vers 3 prot TCP port 2049
mount.nfs: prog 100005, trying vers=3, prot=17
mount.nfs: trying 192.168.1.20 prog 100005 vers 3 prot UDP port 47384
192.168.1.20:/media/net-rw/donkey/incoming on /media/donkey type nfs (rw)

La lista de opciones que pueden ser pasadas a mount las puede leer en la página man de mount, aunque las más interesantes son:
  • timeo=n Establece el tiempo, expresado en décimas de segundos, que esperará el cliente de NFS al servidor de NFS.
  • hard Marca el volumen para ser montado físicamente. Cuando expira el tiempo de operación, muestra un error por consola y continua indefinidamente.
  • soft Marca el volumen para ser montado lógicamente. Cuando expira el tiempo de operación, se produce un error de E/S y el proceso que intentaba acceder al disco es informado. 
  • initr Permite enviar una señal para interrumpir una llamada NFS. Con esta opción podrá abortar la operación cuando el servidor no responde.
En la práctica deberá usar las opciones hard o soft en función del tipo de información que este compartiendo.  Si está creando un terminal tonto, le interesará usar la opción hard para evitar que ante un eventual colapso de la red los terminales dejen de funcionar. Usar la opción initr es importante cuando trabaja con un montaje de tipo hard, ya que en caso de que el servidor se vuelva inaccesible le permitirá abortar el acceso a NFS y retomar el control.

Si desea que su sistema monte automáticamente, en cada inicio del sistema, los directorios exportados por un servidor NFS, deberá añadir una entrada al fichero /etc/fstab. Su /etc/fstab deberá quedar similar a:
agd-server # nano /etc/fstab
# /etc/fstab: static file system information.
/dev/vda1  /boot  ext2  defaults,noatime  1  2
/dev/vda2  /  ext4  defaults  0  1
/dev/vdb1  none  swap  sw  0  0
192.168.1.20:/usr/portage /usr/portage nfs defaults 0 0
192.168.1.20:/usr/portage/distfiles /usr/portage/distfiles nfs defaults 0 0
192.168.1.20:/media/net-rw/donkey/incoming /media/p2p/mldonkey nfs defaults 0 0
192.168.1.20:/media/net-rw/donkey/temp /home/p2p/mldonkey/temp nfs defaults 0 0
192.168.1.20:/tmp /tmp nfs defaults 0 0

2 comentarios:

#
Mr. Brown Dispatcher dijo...

Hace ya un buen saco de años que no utilizo NFS entre otras cosas por su débil seguridad basada en la dirección IP del cliente. He leído el post y he visto que la configuración se asemeja a la que utilizaba y que existe una implementación que hace uso de ACLs. ¿Es esta una mejora en la seguridad importante? Y si fuese así ¿sería merecedora de un nuevo post con su configuración?

Saludos.

#
Antonio Guillen dijo...

Mr. Brown no soy un usuario de ACLs, y por tanto tal vez mi visión sea errada, pero a mi modo de ver ACLs no aporta seguridad sino plasticidad.

El control de acceso sigue la misma política independientemente de que usemos ACLs o no: si estas en la lista de host permitidos puedes pasar, y una vez dentro tus privilegios serán determinados por quien seas (por tu usuario) así como la configuración del directorio exportado.

El extra de las listas de control de acceso radica en que no estás limitado a propietario-grupo-otros, sino que puedes especificar una política mucho más amplia, con muchos usuarios y cada uno de ellos con distintos permisos.

Publicar un comentario en la entrada

Recuerde que puede utilizar algunos códigos HTML como <b>para negrita</b>, <i>para cursiva</i> y <a href="URL">para enlaces</a>.