- Introducido por Sun MicroSystems en 1985, y soportado por todos los Unices
- Versiones principales: NFSv2 y NFSv3
- NFSv4 en desarrollo (incluido en kernel 2.6,
ver www.citi.umich.edu/projects/nfsv4/)
- NFSv4 en desarrollo (incluido en kernel 2.6,
- NFSv2 y 3: protocolo sin estado: no hay pérdida de información si el servidor cae
- NFSv4 incorpora estado: mecanismo complejo de recuperación de caídas
- Comunicación mediante TCP o UDP
- normalmente UDP (NFSv4 usa TCP)
- Dos tipos de servidores en Linux:
- servidor en espacio de usuario: más lento y con problemas
- servidor en modo kernel: más rápido, menos características (versión por defecto)
- capítulo 17 (The Network File System) del libro UNIX System Administration Handbook (3a ed.), Evi Nemeth et.al.
- Linux NFS-HOWTO
- nfs.sourceforge.net
Características principales
Ejemplo de funcionamiento
Procesos implicados
NFS se basa en RPC (Remote Procedure Call)- el servicio portmap (también llamado rpcbind) debe estar disponible y activo
- convierte números de programas RPC en números de puertos
- utiliza el puerto 111
- necesario para aplicaciones que usen RPC
- el comando rpcinfo nos muestra información RPC
- en Debian, paquete portmap
- rpc.nfsd: implementa la parte de usuario del servidor NFS (atender y resolver las peticiones de acceso del cliente a archivos situados en el directorio remoto)
- rpc.mountd: proceso que recibe la petición de montaje desde un cliente NFS y chequea para mirar si coincide con un sistema de ficheros actualmente exportado, y si el cliente tiene permisos suficientes para montar dicho directorio
- rpc.rquotad: proporciona información de cuotas a usuarios remotos
- rpc.statd: implementa el protocolo NSM (Network Status Monitor); proporciona un servicio de notificación de reinicio, cuando NFS cae; lo usa el servicio de bloqueo de ficheros lockd
- rpc.lockd: servicio de bloqueo de ficheros (NFS lock manager, NLM); no necesario en kernels modernos (>= 2.4) en los que el boqueo es realizado por el kernel
- Usa autenticación basada en Kerberos mediante los siguientes servicios:
- rpcsec_gss (cliente rpc.gssd, servidor rpc.svcgssd): autenticación de la conexión cliente-servidor
- rpc.idmapd: mapeo entre UIDs (o GIDs) y nombres de usuario (o nombres de grupos)
Instalación de NFS en Debian
Antes de utilizar NFS, ya sea como servidor o como cliente, el kernel debe tener compilado el soporte NFS- podemos comprobarlo consultando los tipos de filesystems soportados por el sistema de ficheros virtual (VFS) en /proc/filesystems
# cat /proc/filesystems
ext2
nodev proc
nodev devpts
nodev nfs - Si no está tendríamos que recompilar el kernel activando el soporte NFS
Servidor NFS
- Instalar el paquete nfs-kernel-server y nfs-common
- nfs-kernel-server proporciona rpc.nfsd, rpc.mountd, y para NFSv4 rpc.svcgssd
- nfs-common proporciona rpc.lockd, rpc.statd, y para NFSv4 rpc.gssd y rpc.idmapd
- Configurar los directorios a exportar: fichero /etc/exports
- Ejemplo de fichero /etc/exports
/projects (ro) proj*.usc.es(rw)
/home 193.144.84.0/24(rw,root_squash,sync)
/pub (ro,all_squash) - exporta /projects de sólo lectura para todo el mundo y lectura/escritura para los sistemas proj*.usc.es
- Algunas opciones de la exportación:
- rw/ro exporta el directorio en modo lectura/escritura o sólo lectura
- root_squash mapea los requerimientos del UID/GID 0 al usuario anónimo (por defecto usuario nobody, con UID/GID 65534); es la opción por defecto
- no_root_squash no mapea root al usuario anónimo
- all_squash mapea todos los usuarios al usuario anónimo
- squash_uids/squash_gids especifica una lista de UIDs o GIDs que se deberían trasladar al usuario anónimo
squash_uids=0-15,20,25-50
- anonuid/anongid fija el UID/GID del usuario anónimo (por defecto 65534)
- subtree_check/no_subtree_check si se exporta un subdirectorio (no un filesystem completo) el servidor comprueba que el fichero solicitado esté en el árbol de directorios exportado
- sync modo síncrono: requiere que todas las escrituras se completen antes de continuar; es opción por defecto
- async modo asíncrono: no requiere que todas las escrituras se completen; más rápido, pero puede provocar pérdida de datos en una caída
- secure los requerimientos deben provenir de un puerto por debajo de 1024
- insecure los requerimientos pueden provenir de cualquier puerto
- Para más opciones man exports
- Cada vez que se modifica este fichero se debe ejecutar el comando exportfs para actualizar el servidor
# exportfs -ra
- ver man exportfs para opciones del comando
- Ejemplo de fichero /etc/exports
- Iniciar el demonio:
# /etc/init.d/nfs-kernel-server start
- Comprobar los directorios exportados con showmount
# showmount --exports localhost
- showmount muestra información de un servidor NFS: directorios que exporta, directorios montados por algún cliente y clientes que montan los directorios
- Podemos ver las estadísticas del servidor NFS con nfsstat
Cliente NFS
El cliente NFS en Linux está integrado en el nivel del Sistema de Ficheros Virtual (VFS) del kernel- no necesita un demonio particular de gestión (en otros UNIX, demonio biod)
- Instalar (si no está ya instalado) el paquete nfs-common
- Montar los directorios remotos con mount -t nfs o añadir una entrada en fstab (ver Tema 4: Montado de los sistemas de ficheros)
- Ejemplo de uso con mount:
# mount -t nfs 193.144.84.0:/home /mnt/home
- Ejemplo de entrada en fstab
193.144.84.0:/home /mnt/home nfs rw 0 0
- Automount se usa frecuentemente con NFS (ver la parte de Autofs en Tema 4: Montado de los sistemas de ficheros)
- Ejemplo de uso con mount:
- rsize=n/wsize=n especifican el tamaño del datagrama utilizado por los clientes NFS cuando realizan peticiones de lectura/escritura (pueden ajustarse para optimizar)
- hard el programa accediendo al sistema de ficheros remoto se colgará cuando el servidor falle; cuando el servidor esté disponible, el programa continuará como si nada (opción más recomendable)
- soft cuando una petición no tiene respuesta del servidor en un tiempo fijado por timeo=t el cliente devuelve un código de error al proceso que realizó la petición (puede dar problemas)
Consideraciones de seguridad en NFS
NFS no fue diseñado pensando en la seguridad:- Los datos se transmiten en claro
- Usa el UID/GID del usuario en el cliente para gestionar los permisos en el servidor:
- El usuario con UID n en el cliente obtiene permisos de acceso a los recursos del usuario con UID n en el servidor (aunque sean usuarios distintos)
- Un usuario con acceso a root en un cliente podría acceder a los ficheros de cualquier usuario en el servidor (no a los de root, si se usa la opción root_squash)
- Usar NFS sólo en Intranets seguras, donde los usuarios no tengan acceso de administrador en sus sistemas
- Evitar el acceso a NFS desde fuera de la Intranet
- Bloquear los puertos TCP/UDP 111 (portmap) y 2049 (nfs)
- Usar NFSv4 con RPCSEC_GSS, que incluye autenticación
- Usar versiones seguras de NFS (Secure NFS) o otros sistemas de ficheros (Self-certifying File System, SFS)