NFS HOWTO


Jaime Pérez Crespo ( japecre at pantuflo.escet.urjc.es)

Última actualización: 22 de Enero de 2004



Introducción

NFS, Network File System, es un servicio muy extendido en UNIX que permite compartir por red sistemas de ficheros, montándolos en máquinas remotas y utilizandolos de forma transparente como si fuesen parte del sistema de ficheros local. La gran ventaja de NFS es su tremenda facilidad de uso. La desventaja, con la que tendremos que lidiar, es que no incorpora ningún tipo de seguridad ni autenticación de los usuarios, por lo que puede suponer un agujero de seguridad importante en nuestro sistema si no se toman las precauciones necesarias.

En este pequeño tutorial aprenderemos a instalar y configurar un servidor y un cliente de NFS además de tomar las medidas de seguridad mínimas necesarias para protegernos de posibles ataques y asegurarnos de que el servicio es utilizado solamente por usuarios autorizados. Durante el mismo se utilizarán una máquina Red Hat 9 como servidor, y una máquina gentoo 1.4 como cliente, aunque los ejemplos son por supuesto aplicables a cualquier otra distribución de Linux.


Configuración del servidor

Entramos de lleno en la configuración de nuestro servidor bajo Red Hat 9 en este caso. Es necesario que en nuestro servidor habilitemos dos servicios del sistema, NFS, y portmap de uso imprescindible, ya que sin él, el demonio de NFS ni siquiera nos permitirá arrancar. Instalaremos ambos servicios de no haberlo hecho ya. Para ello utilizaremos apt-get, una herramienta original de Debian GNU/Linux que ha sido portada a Red Hat Linux. De no tener instalado apt-get, lo descargaremos e instalaremos como cualquier otro rpm desde aquí. Proseguiremos en este punto asumiendo que apt-get está instalado y configurado correctamente.


[root@mordor root]# apt-cache search portmap
portmap - A program which manages RPC connections.
[root@mordor root]# apt-get install portmap

Una vez hayamos instalado el servicio de RPC portmap, instalamos del mismo modo las utilidades de NFS:


[root@mordor root]# apt-cache search nfs
nfs-utils - NFS utlilities and supporting daemons for the kernel NFS server.
[root@mordor root]# apt-get install nfs-utils

Ya tenemos instalados ambos servicios. Ahora, pasamos a configurar NFS. Para ello debemos editar el fichero /etc/exports, en el que indicaremos que recursos exportará nuestro servidor y a qué máquinas les estará permitido acceder a dichos recursos. Utilizamos nuestro editor de textos preferido para editar este archivo, e iremos añadiendo líneas en la forma path host (opciones), donde path es el path absoluto del directorio que queremos compartir, host es el nombre o dirección IP de la máquina que podrá acceder a ese recurso, y opciones son los flags, separados por comas, que indican las opciones del servidor NFS para ese recurso completo. Por ejemplo:


/home rivendel (ro,sync,root_squash)
/tmp  rivendel (rw,sync,no_root_squash)

Con un fichero de configuración como éste, indicamos al servidor NFS que exporte dos directorios de nuestro sistema, /home y /tmp. Se da permiso para acceder a ambos recursos desde la máquina rivendel. En este caso, deberemos tener una entrada en nuestro fichero /etc/hosts que especifique la IP de esta máquina. El recurso /home se montará en modo de sólo lectura, mientras que /tmp tendrá permisos tanto de lectura como de escritura. Algunas de las opciones más comunes que se le pueden pasar al servidor por medio de este archivo son:

Una vez que hayamos terminado de configurar los recursos que queremos compartir, debemos ocuparnos de la seguridad tanto del servicio de RPC (portmap) como del servidor de NFS. Lo más sencillo en este caso es utilizar tcp wrappers. Utilizaremos los ficheros /etc/hosts.allow y /etc/hosts.deny para indicar las máquinas y servicios permitidos o denegados en nuestro sistema. Permitiremos el acceso tanto al servicio RPC como NFS a todas las máquinas de nuestra red local. Para ello escribiremos las siguientes líneas en /etc/hosts.allow:


portmap:192.168.0.0/255.255.255.0
nfsd:192.168.0.0/255.255.255.0

De este modo indicamos que se permite el acceso a los servicios portmap y nfsd desde cualquier IP perteneciente a la red local 192.168.0.0. En caso de usar otra red, deberemos modificar estas líneas acorde con nuestras necesidades. Configuraremos ahora /etc/hosts.deny:


portmap:ALL
nfsd:ALL

Es decir, denegamos el acceso a estos dos servicios a todos los clientes que no esten explícitamente autorizados en /etc/hosts.allow. Es posible que si no incluímos la línea restrictiva relativa a portmap en /etc/hosts.deny nuestro servicio NFS no arranque, de modo que es importante asegurarse de hacer las cosas bien en este punto.

Hecho esto, podemos pasar a arrancar los servicios de RPC y NFS:


[root@mordor root]# service portmap start
Iniciando portmapper:                                      [  OK  ]
[root@mordor root]# service nfs start
Inicio de los servicios NFS:                               [  OK  ]
Starting NFS quotas:                                       [  OK  ]
Inicialización del demonio NFS:                            [  OK  ]
Inicialización de NFS mountd:                              [  OK  ]

Ya tenemos listo nuestro servicio de NFS. Podemos hilar aún más fino y hacer que tanto el servicio RPC como NFS se arranquen como demonios al iniciar la máquina. Para hacer esto podemos usar la herramienta ntsysv de Red Hat, y sencillamente marcar con la barra espaciadora las opciones portmap y nfs.


Configuración del cliente

Pasamos ahora a configurar nuestro cliente o clientes del servicio de NFS. En realidad este paso será en la mayoría de las ocasiones casi trivial. Para empezar, debemos asegurarnos de que nuestra máquina soporta volúmenes NFS. Podemos hacer esto insertando el módulo de kernel de NFS, si es que efectivamente está compilado como módulo:


rivendel root # modprobe nfs
rivendel root # lsmod | grep nfs
nfs                   71928   0 (unused)
lockd                 51248   0 [nfs]
sunrpc                68668   0 [nfs lockd]

En este punto estamos seguros de que nuestro sistema soporta NFS. También es posible que el soporte para NFS esté compilado directamente en el núcleo y no como módulo. En tal caso podemos intentar montar directamente el directorio NFS exportado por nuestro servidor y observar el resultado. Si tenemos instaladas y configuradas las fuentes de nuestro núcleo, siempre podemos comprobar in situ si efectivamente tenemos soporte para NFS.


rivendel root # cd /usr/src/linux
rivendel root # make xconfig

Nos dirigimos a la sección de sistemas de ficheros del núcleo, File systems. Una vez allí, comprobamos los sistemas de ficheros de red, en Network File Systems. Un vistazo rápido debería servirnos para localizar la opción NFS file system support, y corroborar que esté incluida bien como módulo (m), bien directamente en el núcleo (y). En caso de no ser así, obviamente deberemos recompilar nuestro kernel incorporando el soporte para NFS, preferentemente como módulo.

Asumiremos una total seguridad de que nuestro sistema soporta sistemas de archivos NFS. De modo que el siguiente paso es directamente montar el directorio exportado por el servidor. Primero, crearemos un punto de montaje desde el que acceder a nuestro sistema de ficheros de red:


rivendel root # mkdir /mnt/nfsdir

Ya tenemos una ubicación donde montar nuestro directorio exportado. Ahora, sencillamente, lo montamos con el comando mount, casi como si de una partición normal se tratase:


rivendel root # mount servidor:/home /mnt/nfsdir -o nolock

Como se puede intuir, el manejo de volúmenes NFS es tan sencillo como si de cualquier otro tipo de partición se tratase. Incluimos la opción -o nolock para evitar que el comando mount arranque lockd y se quede de este modo colgado en ciertas ocasiones. A partir de aquí, podemos montar y desmontar la partición NFS como cualquier otra:


rivendel root # umount /mnt/nfsdir
rivendel root # mount -t nfs servidor:/home /mnt/nfsdir -o nolock

Para facilitar aún más las cosas, podemos incluir entradas en /etc/fstab para nuestros directorios exportados por NFS. Podemos restringir el acceso a sólo lectura, o permitir lectura y escritura si el directorio exportado también lo permite, dejar que los usuarios monten y desmonten directorios exportados a placer sin necesidad de la intervención del superusuario, o incluso hacer que ciertos directorios se monten automáticamente en el arranque del sistema. Como ejemplo:


servidor:/home         /mnt/nfsdir    nfs          rw,noauto,user,exec,intr,nolock       0 0

Configurando una entrada similar a ésta en /etc/fstab, podremos montar y desmontar el directorio /home del servidor en /mnt/nfsdir como cualquier usuario del sistema, para leer y escribir en ella (y ejecutar binarios). Sin embargo, el directorio ha de ser en este caso montado explícitamente (es decir, no se montará al inicio del sistema). Obsérvese la inclusión de los parámetros intr, que permite interrumpir operaciones en curso sobre un archivo montado por NFS, y nolock, necesario como se explicó anteriormente. Para más información sobre las opciones de mount y del fichero /etc/fstab, consultar sus respectivas páginas de manual.


Enlaces Interesantes

Linux NFS FAQ: http://nfs.sourceforge.net/
Página de manual de exports: http://unixhelp.ed.ac.uk/CGI/man-cgi?exports+5
Página de manual de fstab: http://unixhelp.ed.ac.uk/CGI/man-cgi?fstab+5
Página de manual de mount: http://unixhelp.ed.ac.uk/CGI/man-cgi?mount+8


Licencia

Este documento público puede ser distribuido y/o traducido libremente, siempre y cuando en el documento resultante se incluyan los datos del autor indicados en la cabecera, esta sección de licencia, y la url del documento original: