Cuando se está trabajando con equipos en una red local, seguro que nos encontramos con la necesidad de permitir que ciertos equipos accedan al disco duro de un equipo remoto. Una de las formas de hacerlo es utilizar NFS (Network File System). Utilizando NFS podemos exportar un directorio de un equipo (servidor) para que sea utilizado por otros equipos (clientes) tanto en modo solo lectura como de lectura-escritura.

Para instalarlo solo hay que teclear el siguiente comando:

sudo apt-get install nfs-kernel-server nfs-common portmap

Para tener una idea de qué acabamos de instalar, puedo deciros que portmap sirve para transformar identificadores de programa RPC en direcciones DARPA. Para ver un ejemplo de funcionamiento, se puede ejecutar el siguiente comando:

abian@server:~$ rpcinfo -p
program vers proto   port
100000    2   tcp    111  portmapper
100000    2   udp    111  portmapper
100024    1   udp  39034  status
100024    1   tcp  58076  status
100003    2   udp   2049  nfs
100003    3   udp   2049  nfs
100003    4   udp   2049  nfs
100021    1   udp  34156  nlockmgr
100021    3   udp  34156  nlockmgr
100021    4   udp  34156  nlockmgr
100003    2   tcp   2049  nfs
100003    3   tcp   2049  nfs
100003    4   tcp   2049  nfs
100021    1   tcp  44829  nlockmgr
100021    3   tcp  44829  nlockmgr
100021    4   tcp  44829  nlockmgr
100005    1   udp  49504  mountd
100005    1   tcp  46117  mountd
100005    2   udp  49504  mountd
100005    2   tcp  46117  mountd
100005    3   udp  49504  mountd
100005    3   tcp  46117  mountd

Por otra parte, nfs-common contiene los binarios necesarios para utilizar el servicio NFS tanto en el cliente como en el servidor (lockd, statd, showmount, y nfsstat). Nfs-kernel-server contiene el soporte para el kernel de linux necesario para poder transformar nuestro equipo en un servidor NFS. Por supuesto, este último paquete no será necesario en el cliente.

Ahora está claro lo que se ha instalado, se puede pasar a la correcta configuración del servidor. Para ello hay que editar tres ficheros.

  1. El fichero /etc/exports contendrá una línea por cada directorio que se desee exportar. Por ejemplo, con el siguiente contenido estaríamos indicando que el equipo con la IP 192.168.10.25 tiene acceso de lectura y escritura al directorio /home/abian/test/ mientras que el equipo con la IP 192.168.10.26 tan sólo tiene acceso de lectura. He utilizado la opción no_subtree_check porque es la opción por defecto para la comprobación de subdirectorios pero puede que no sea la más aconsejable para un entorno de producción:

    abian@server:~$ cat /etc/exports
    /home/abian/test       192.168.10.25(rw,sync,no_subtree_check) 192.168.10.26(ro,sync,no_subtree_check)


    Éste es el ejemplo más sencillo, se puede exportar un directorio a una subred, utilizar opciones de mapeo de usuarios, escrituras asíncronas… Para ver más información y ejemplos útiles recomiendo (como siempre) utilizar el comando man:

    abian@server:~$ man exports

  2. El fichero /etc/hosts.allow contiene las directivas necesarias para controlar qué equipos acceden a qué servicios. En este caso tenemos que incluir dos líneas para que el sistema funcione.

    abian@server:~$ cat /etc/hosts.allow
    portmap:192.168.10.0/255.255.255.0
    nfs:192.168.10.0/255.255.255.0

    Con estas dos líneas estamos indicando que permita el acceso a todos los equipos de la subred 192.168.10.0 a los servicios portmap y nfs.

  3. El último fichero de configuración está relacionado con el anterior pero tiene justo la utilidad contraria. En /etc/hosts.deny hay que escribir las directivas adecuadas para impedir el acceso de algunos equipos a determinados servicios. Para hacer que Ramiro se sienta orgulloso de mi, voy a hacer publicidad de una de las mejores políticas de seguridad que conozco: “Permitir a todos y denegar a unos pocos” “Permitir a unos pocos y denegar al resto”. Por lo tanto en este archivo tan sólo debe aparecer la línea ALL: PARANOID.

    abian@server:~$ cat /etc/hosts.deny
    ALL: PARANOID

El servidor está completamente configurado. Para aplicar los cambios realizados en los distintos archivos de configuración, es recomendable/necesario reiniciar los servicios relacionados:

abian@server:~$ sudo /etc/init.d/portmap restart
abian@server:~$ sudo /etc/init.d/nfs-kernel-server restart

Para hacer una última comprobación se puede utilizar el comando exportfs:

abian@server:~$ exportfs
/home/abian/test
192.168.10.25
/home/abian/test
192.168.10.26

El siguiente paso es probar que realmente lo que hemos configurado funciona. Para ello hay que utilizar alguna máquina cliente (recordando que debe tener la IP 192.168.10.25 o 192.168.10.26) y utilizar el comando:

abian@client:~$ sudo apt-get install nfs-common
abian@client:~$ mkdir test
abian@client:~$ mount -t nfs server  /home/client/test/

Siempre es más cómodo utilizar para estos menesteres el fichero /etc/fstab. La línea necesaria en este fichero sería la siguiente:

server:/home/abian/test /home/client/test nfs timeo=10,intr

¿Algunas recomendaciones extras?

  • Muchos de los problemas de seguridad en las redes de las organizaciones o empresas vienen por el uso incorrecto de los servicios RPC o por vulnerabilidades en dichos servicios. Recomiendo encarecidamente mantener actualizado el software del servidor, tanto del kernel como del resto de los servicios. Además, el firewall se convierte en un elemento más importante si cabe (y sí, cabe) para impedir que se accedan a los servicios nfs y RCP desde el exterior de nuestra red local.
  • El sistema se puede hacer un lío con los identificadores de usuarios si intentamos escribir en el directorio que hemos exportado con un usuario que no existe en el servidor o algo similar. La utilización de un sistema centralizado de credenciales de usuario como LDAP podría solventar esta situación. Pero hasta que saque un rato para escribir un post sobre OpenLDAP os recomiendo la utilización de mappings de usuarios en la configuración del archivo /etc/exports. Utilizando anonuid=190 y anongid=110 podéis hacer creer al sistema que 190 es el user id del usuario anónimo pero puede corresponder al propietario del directorio que se está exportando. Lo mismo sucede con el anongid. El tercer y el cuarto campo del fichero /etc/passwd contienen respectivamente el identificador de usuario y grupo.

Espero que os haya resultado de utilidad. Un saludo