En sistemas FreeBSD, el servicio NFS está conformado por cuatro demonios: el servidor NFS (nfsd), el cual sirve peticiones de clientes NFS; el demonio mountd, el cual lleva a cabo peticiones recibidas desde nfsd; el demonio nfsuserd, el cual gestiona la información de usuarios y grupos; y rpcbind, quien permite que los clientes NFS descubran qué puerto está utilizando el servidor NFS.

El demonio nfsd se encarga de servir peticiones NFS desde clientes. Este servicio es indispensable para que un sistema funcione como servidor NFS.

El protocolo NFS versión 4 (NFSv4), definido en la RFC 3530, difiere significativamente al protocolo NFS versión 3. Utiliza un conjunto de llamadas RPC compuestas que se realizan en orden. Incorpora el soporte para locking, lo cual implica que el servidor deja de ser stateless. Además incorpora varias características opcionales no presentes en la versión 3, tales como el soporte para ACLs, referrals (redirecciones de subárboles hacia otros servidores) y delegaciones (que permiten a un cliente operar sobre archivos de forma local).

NFSv4 no utiliza un protocolo de montaje separado, y asume que el servidor provee una estructura de árbol en forma de un único sistema de archivos, cuya raíz es el punto en el sistema de archivos local especificado por aquellas líneas en el archivo /etc/exports que comienzan con la cadena "V4:".

nfsd permite un subconjunto limitado de operaciones sobre árboles no exportados dentro del sistema de archivos local, por ende es posible atravesar el árbol no exportado hacia un subárbol exportado. De esta forma, el directorio raíz del árbol NFS puede estar en un sistema de archivos no exportado. La excepción es ZFS, el cual verifica los exports, entonces todos los sistemas de archivos ZFS bajo el directorio raíz de NFS deben ser exportados. Sin embargo, el árbol entero cuya raíz está en ese punto debe estar en un sistema de archivos exportable por NFS. Por defecto, la raíz de NFS coincide con el sistema de archivos raíz, si se cambia este valor a otra cosa diferente de /, los clientes NFSv4 requerirán utilizar puntos de montaje diferentes que aquellos NFS versión 2 y 3.

NFSv4 usa nombres para los usuarios y grupos en vez de números. En FreeBSD, el demonio que realiza el mapeo de usuarios y grupos es nfsuserd.

nfsuserd se encarga de cargar en el kernel información de usuarios y grupos para NFSv4. Es indispensable que esté en ejecución (tanto en clientes como servidores) para que NFSv4 funcione correctamente.

mountd (NFSv3) se encarga de servir solicitudes de montaje desde clientes. Escucha pedidos en un puerto (indicado en la configuración del servidor NFS). Toma la configuración de sistemas de archivos exportados (los cuales se pueden montar desde los clientes) desde el archivo /etc/exports y se encarga de autorizar las solicitudes de montaje (por dirección IP fuente o nombre de host). En el archivo /var/run/mountd.pid almacena el PID del proceso mountd corriendo actualmente, y en el archivo /var/db/mountdtab la lista actual de sistemas de archivos remotos montados (en clientes NFS).

El archivo /etc/exports especifica los puntos de montaje remotos para el protocolo NFS. Cada línea del archivo indica el punto de montaje y flags de exportación dentro de un sistema de archivos local, o la raíz del árbol NFSv4 para uno o más hosts. En una entrada de un punto de montaje, el primer campo especifica la ruta al directorio dentro de un sistema de archivos local que puede ser montado sólo por los clientes correspondientes. Hay tres formas de especificar un punto de montaje (ver el manual para mayor detalle). Las rutas a los directorios exportados no deben tener enlaces simbólicos ni los componentes . y ... El segundo componente de una línea especifica cómo el sistema de archivos es exportado al conjunto de hosts. Los flags especifican si el sistema de archivos es exportado con permisos de escritura o sólo lectura y cómo el UID del cliente es mapeado al usuario en el servidor.

La herramienta showmount (NFSv3) muestra información de estado acerca de servidores NFS. Por defecto imprime los nombres de host que tienen sistemas de archivos NFS montados en el host local, aunque también se utiliza para consultar los puntos de montaje NFS disponibles en un servidor (utilizando la opción -e):

root@fbsd10:~ # showmount -e localhost
Exports list on localhost:
/zdata/mywebapp/www-data 192.168.1.19 10.1.1.111 10.1.1.240 
/zdata/mywebapp/postgres 192.168.1.19 10.1.1.111 10.1.1.240 

mountd utiliza RPC, un mecanismo para que un programa cliente pueda invocar a una función en un programa servidor remoto o en un espacio de direcciones diferente. Al momento de iniciar, mountd registra contra rpcbind la dirección en la cual está escuchando y los números de RPC que está preparado para servir.

El demonio rpcbind es un servicio universal que se encarga de mapear direcciones a números de programa RPC. Este servicio debe correr en un host para que sea capaz de realizar llamadas RPC. Cuando un servicio RPC inicia, registra en rpcbind la dirección en la cual está escuchando y los números de programas RPC que está preparado para servir. Cuando un programa cliente desea hacer una llamada RPC a un determinado número de programa, primero contacta a rpcbind para determinar la dirección donde los pedidos RPC deben ser enviados.

Por esta razón, el demonio rpcbind debe ser iniciado antes de cualquier servicio RPC, en este caso nfsd y mountd.

En general, los mecanismos RPC no son buenos para la seguridad, en el sentido que permiten que los servicios escuchen peticiones en puertos (o rangos de puertos) aleatorios, lo que dificulta o directamente imposibilita utilizar firewalls (ya que no es posible conocer con anticipación qué puertos será necesario abrir). Sin embargo, mountd cuenta con la capacidad de fijar el puerto en el que escucha a través de la opción -p, por ejemplo 879.

A su vez, es posible restringir la configuración del demonio nfsd para que escuche sólo en el puerto reservado 2049 mediante la opción nfs_reserved_port_only.

De esta forma, la configuración de NFS en el archivo /etc/rc.conf debe ser la siguiente:

nfs_server_enable="YES"
nfsv4_server_enable="YES"
nfs_reserved_port_only="YES"
nfs_client_enable="NO"
nfsuserd_enable="YES"
mountd_flags="-r -p 879"
mountd_enable="YES"
rpcbind_enable="YES"
rpc_lockd_enable="NO"
rpc_statd_enable="NO"

Al fijar los puertos en los que escuchan los diferentes servicios, es posible utilizar un firewall y abrir sólo aquellos necesarios para el funcionamiento de NFS:

111/tcp  - rpcbind
879/tcp  - mountd
2049/tcp - nfsd
689/udp  - nfsuserd

Los demonios rpc.lockd y rpc.statd son parte de la especificación XNFS que proveen servicios de bloqueo de archivos y registros. En general no se utilizan, excepto que alguna aplicación explícitamente lo requiera.

Finalmente, la herramienta nfsstat (NFSv3 y NFSv4) muestra estadísticas de actividad de clientes y servidores NFS.

root@fbsd10:~ # nfsstat
Client Info:
Rpc Counts:
  Getattr   Setattr    Lookup  Readlink      Read     Write    Create    Remove
        0         0         0         0         0         0         0         0
   Rename      Link   Symlink     Mkdir     Rmdir   Readdir  RdirPlus    Access
        0         0         0         0         0         0         0         0
    Mknod    Fsstat    Fsinfo  PathConf    Commit
        0         0         0         0         0
Rpc Info:
 TimedOut   Invalid X Replies   Retries  Requests
        0         0         0         0         0
Cache Info:
Attr Hits    Misses Lkup Hits    Misses BioR Hits    Misses BioW Hits    Misses
        0         0         0         0         0         0         0         0
BioRLHits    Misses BioD Hits    Misses DirE Hits    Misses Accs Hits    Misses
        0         0         0         0         0         0         0         0

Server Info:
  Getattr   Setattr    Lookup  Readlink      Read     Write    Create    Remove
  1979622    247303    188772        16    181643     88579      8814     54106
   Rename      Link   Symlink     Mkdir     Rmdir   Readdir  RdirPlus    Access
      515        12         0         0         0     32559         0    166453
    Mknod    Fsstat    Fsinfo  PathConf    Commit
        0         0         0         0     35349
Server Ret-Failed
                0
Server Faults
            0
Server Cache Stats:
   Inprog      Idem  Non-idem    Misses
        0         0         0   2542096
Server Write Gathering:
 WriteOps  WriteRPC   Opsaved
    88579     88579         0

Referencias

Network File System (NFS)

man nfsv4
man nfsd
man nfsuserd
man mountd
man exports
man rpcbind
man rpc.lockd
man rpc.statd0
man rc.conf
man showmount
man nfsstat


Tal vez pueda interesarte


Compartí este artículo