209.2 - Configuración del servidor NFS

Peso: 3

Introducción

NFS (Network File System) es el protocolo estándar para compartir sistemas de archivos en redes Unix/Linux. Permite que los clientes accedan a directorios remotos como si fueran locales. El examen LPIC-2 cubre la configuración del servidor y el cliente NFS, las diferencias entre NFSv3 y NFSv4, las opciones de seguridad y las configuraciones de rendimiento.

Instalación

# Debian/Ubuntu - Servidor
apt install nfs-kernel-server
 
# Debian/Ubuntu - Cliente
apt install nfs-common
 
# Red Hat/CentOS - Servidor
yum install nfs-utils
 
# Red Hat/CentOS - Cliente
yum install nfs-utils

Servicios relacionados

# Habilitar e iniciar el servidor NFS
systemctl enable nfs-server
systemctl start nfs-server
 
# Servicios auxiliares
systemctl enable rpcbind   # Necesario para NFSv3
systemctl start rpcbind

Diferencias entre NFSv3 y NFSv4

CaracterísticaNFSv3NFSv4
Protocolo de transporteUDP o TCPSolo TCP
PuertoPuertos dinámicos (requiere rpcbind)Solo puerto TCP 2049
SeguridadBasada en IP/hostKerberos integrado
Pseudo-filesystemNoSí (raíz única)
Bloqueo de archivosProtocolo separado (NLM)Integrado en el protocolo
Dependencia de rpcbindNo
ACLsNo nativasSoporte nativo
RendimientoBuenoMejorado con compuestos

Para el examen: NFSv4 utiliza exclusivamente el puerto TCP 2049 y no necesita rpcbind. NFSv3 requiere rpcbind (puerto 111) y utiliza puertos dinámicos para los servicios auxiliares (mountd, statd, lockd). Esta diferencia es crucial para la configuración de firewalls.

Configuración del servidor: /etc/exports

El archivo /etc/exports define qué directorios se comparten y con qué opciones.

Sintaxis básica

directorio   cliente(opciones)   [cliente2(opciones2)]

Ejemplos de configuración

# Compartir con un host específico
/srv/datos    192.168.1.10(rw,sync,no_subtree_check)
 
# Compartir con una red completa
/srv/datos    192.168.1.0/24(rw,sync,no_subtree_check)
 
# Compartir con un nombre de host
/srv/datos    cliente.empresa.com(rw,sync,no_root_squash)
 
# Compartir con comodín de dominio
/srv/datos    *.empresa.com(ro,sync)
 
# Compartir con múltiples clientes
/srv/datos    192.168.1.0/24(rw,sync) 10.0.0.0/8(ro,sync)
 
# Compartir con todos (peligroso, solo para pruebas)
/srv/publico  *(ro,sync,all_squash)

Para el examen: Es muy importante no dejar espacio entre el cliente y el paréntesis de opciones. 192.168.1.0/24(rw) da acceso de lectura y escritura a esa red, mientras que 192.168.1.0/24 (rw) da acceso de lectura y escritura a TODOS los hosts (el espacio separa las dos entradas).

Opciones de exportación principales

OpciónDescripción
rwLectura y escritura
roSolo lectura (predeterminado)
syncEscrituras sincrónicas (más seguro, predeterminado)
asyncEscrituras asincrónicas (mejor rendimiento, riesgo de pérdida de datos)
no_subtree_checkDeshabilita la verificación de subárbol (recomendado)
subtree_checkHabilita la verificación de subárbol
root_squashMapea root remoto a anonuid/anongid (predeterminado)
no_root_squashPermite acceso como root desde el cliente
all_squashMapea todos los usuarios al usuario anónimo
no_all_squashNo mapea usuarios normales (predeterminado)
anonuid=UIDUID del usuario anónimo para squash
anongid=GIDGID del grupo anónimo para squash
secureRequiere que la conexión provenga de un puerto < 1024 (predeterminado)
insecurePermite conexiones desde cualquier puerto

Seguridad: Squashing de usuarios

root_squash (predeterminado)

# El usuario root del cliente se mapea al usuario anónimo (nobody/nfsnobody)
/srv/datos    192.168.1.0/24(rw,sync,root_squash)

Cuando un cliente accede como root (UID 0), el servidor lo trata como el usuario anónimo (normalmente nobody con UID 65534). Los demás usuarios mantienen sus UIDs originales.

no_root_squash

# El usuario root del cliente mantiene privilegios de root en el servidor
/srv/datos    192.168.1.0/24(rw,sync,no_root_squash)

Para el examen: no_root_squash es un riesgo de seguridad significativo porque permite que root en el cliente tenga privilegios de root sobre los archivos del servidor. Solo debe usarse en entornos controlados.

all_squash

# TODOS los usuarios se mapean al usuario anónimo
/srv/datos    192.168.1.0/24(rw,sync,all_squash,anonuid=1000,anongid=1000)

all_squash es útil para comparticiones públicas donde todos los accesos deben realizarse con un mismo usuario, independientemente del UID del cliente.

Comando exportfs

# Exportar todos los directorios definidos en /etc/exports
exportfs -a
 
# Re-exportar todos los directorios (recargar)
exportfs -ra
 
# Mostrar los directorios exportados actualmente
exportfs -v
 
# Exportar un directorio temporalmente (sin /etc/exports)
exportfs -o rw,sync 192.168.1.10:/srv/temporal
 
# Des-exportar un directorio específico
exportfs -u 192.168.1.10:/srv/datos
 
# Des-exportar todos los directorios
exportfs -ua

Para el examen: Después de modificar /etc/exports, se debe ejecutar exportfs -ra para aplicar los cambios sin reiniciar el servicio NFS. La opción -a aplica todas las entradas del archivo, y -r re-sincroniza la tabla de exportaciones.

Comando showmount

# Mostrar los directorios exportados de un servidor
showmount -e servidor
 
# Mostrar los directorios exportados del servidor local
showmount -e localhost
 
# Mostrar los clientes que tienen montajes activos
showmount -a servidor
 
# Mostrar solo los directorios montados
showmount -d servidor

NFSv4 - Pseudo Filesystem

NFSv4 introduce el concepto de pseudo-filesystem, que presenta todas las exportaciones bajo una raíz virtual única.

Configuración del pseudo-filesystem

# Definir la raíz del pseudo-filesystem
# En /etc/exports:
/srv/nfs4          *(ro,sync,fsid=0,crossmnt,no_subtree_check)
/srv/nfs4/datos    192.168.1.0/24(rw,sync,no_subtree_check)
/srv/nfs4/homes    192.168.1.0/24(rw,sync,no_subtree_check)
# Crear la estructura
mkdir -p /srv/nfs4/datos /srv/nfs4/homes
 
# Montar los directorios reales en la estructura del pseudo-filesystem
mount --bind /datos /srv/nfs4/datos
mount --bind /home /srv/nfs4/homes

Montaje del cliente NFSv4

# El cliente monta desde la raíz del pseudo-filesystem
mount -t nfs4 servidor:/ /mnt/nfs4
 
# O montar un subdirectorio específico
mount -t nfs4 servidor:/datos /mnt/datos

Para el examen: En NFSv4, la opción fsid=0 marca la raíz del pseudo-filesystem. Los clientes ven todas las exportaciones como subdirectorios de esta raíz. La opción crossmnt permite que el cliente atraviese los puntos de montaje automáticamente.

Montaje del cliente NFS

Montaje manual

# Montar NFSv3
mount -t nfs servidor:/srv/datos /mnt/datos
 
# Montar NFSv4
mount -t nfs4 servidor:/datos /mnt/datos
 
# Montar con opciones específicas
mount -t nfs -o rw,hard,intr,rsize=65536,wsize=65536 servidor:/datos /mnt/datos
 
# Especificar versión de NFS
mount -t nfs -o vers=3 servidor:/datos /mnt/datos
mount -t nfs -o vers=4 servidor:/datos /mnt/datos

Montaje permanente en /etc/fstab

# NFSv3
servidor:/srv/datos  /mnt/datos  nfs  rw,hard,intr,rsize=65536,wsize=65536  0  0

# NFSv4
servidor:/datos  /mnt/datos  nfs4  rw,hard,intr  0  0

# Con opciones de alta disponibilidad
servidor:/datos  /mnt/datos  nfs  rw,soft,timeo=300,retrans=3,_netdev  0  0

Opciones de montaje del cliente

OpciónDescripción
hardReintenta indefinidamente si el servidor no responde (predeterminado)
softDevuelve error después de los reintentos configurados
intrPermite interrumpir operaciones NFS (obsoleto en kernels modernos)
rsize=NTamaño del buffer de lectura en bytes
wsize=NTamaño del buffer de escritura en bytes
timeo=NTimeout en décimas de segundo
retrans=NNúmero de reintentos antes de reportar error
_netdevIndica que requiere red (espera a que la red esté disponible)
bgMonta en segundo plano si falla el primer intento
fgMonta en primer plano (predeterminado)
vers=NVersión de NFS a utilizar (3, 4, 4.1, 4.2)
sec=krb5Autenticación Kerberos

Para el examen: La opción hard es la predeterminada y la más segura para datos críticos, ya que reintenta la operación indefinidamente hasta que el servidor responda. La opción soft puede causar corrupción de datos si la aplicación no maneja bien los errores de E/S. La opción _netdev es importante en /etc/fstab para que el montaje espere a que la red esté disponible.

Opciones de rendimiento

# Valores típicos para buen rendimiento
mount -t nfs -o rw,hard,rsize=65536,wsize=65536,async servidor:/datos /mnt/datos
  • rsize/wsize: Definen el tamaño del buffer de lectura/escritura. Valores comunes: 8192, 32768, 65536. Valores mayores suelen mejorar el rendimiento.
  • async: Mejora el rendimiento permitiendo escrituras asincrónicas, pero con riesgo de pérdida de datos si el servidor se apaga inesperadamente.
  • sync: Más seguro pero más lento, ya que cada escritura se confirma antes de continuar.

Puertos y firewall

NFSv3 (múltiples puertos)

# Servicios y puertos de NFSv3
rpcbind         111/tcp  111/udp
nfs             2049/tcp 2049/udp
mountd          puerto dinámico
statd           puerto dinámico
lockd           puerto dinámico
 
# Fijar puertos para facilitar la configuración del firewall
# En /etc/sysconfig/nfs o /etc/default/nfs-kernel-server:
MOUNTD_PORT=892
STATD_PORT=662
LOCKD_TCPPORT=32803
LOCKD_UDPPORT=32769

NFSv4 (solo un puerto)

# Solo necesita un puerto
nfs   2049/tcp
# Reglas de firewall para NFSv4
iptables -A INPUT -p tcp --dport 2049 -j ACCEPT
 
# Reglas de firewall para NFSv3
iptables -A INPUT -p tcp --dport 111 -j ACCEPT
iptables -A INPUT -p udp --dport 111 -j ACCEPT
iptables -A INPUT -p tcp --dport 2049 -j ACCEPT
iptables -A INPUT -p udp --dport 2049 -j ACCEPT
iptables -A INPUT -p tcp --dport 892 -j ACCEPT
iptables -A INPUT -p udp --dport 892 -j ACCEPT

Para el examen: Una de las grandes ventajas de NFSv4 sobre NFSv3 es la simplificación del firewall. NFSv4 solo necesita el puerto TCP 2049, mientras que NFSv3 requiere rpcbind (111) y puertos dinámicos adicionales para mountd, statd y lockd.

Demonios NFS

DemonioDescripción
nfsdDemonio principal del servidor NFS
rpcbind / portmapMapea servicios RPC a puertos (necesario para NFSv3)
rpc.mountdGestiona las solicitudes de montaje de los clientes
rpc.statdMonitor de estado para recuperación de bloqueos
rpc.lockdGestión de bloqueos de archivos (NFSv3)
rpc.idmapdMapeo de nombres de usuario/grupo en NFSv4

Verificar servicios RPC activos

# Listar los servicios RPC registrados
rpcinfo -p
rpcinfo -p servidor
 
# Verificar que NFS está registrado
rpcinfo -t servidor nfs
rpcinfo -u servidor nfs

Para el examen: El demonio rpc.idmapd es específico de NFSv4 y se encarga de mapear los UIDs/GIDs numéricos a nombres de usuario y grupo (y viceversa). Esto es importante porque NFSv4 transmite los nombres de usuario en lugar de UIDs numéricos.


Trampas del examen

Errores comunes y distinciones criticas que LPI suele evaluar en este subtema:

  • Espacio entre cliente y parentesis en /etc/exports cambia el significado192.168.1.0/24(rw) da acceso rw a esa red. 192.168.1.0/24 (rw) da acceso ro a esa red Y acceso rw a TODOS los hosts (el espacio crea dos entradas separadas). Este es el error mas peligroso y mas preguntado.

  • NFSv4 solo usa TCP 2049, NFSv3 necesita rpcbind (111) y puertos dinamicos — esta diferencia es crucial para la configuracion de firewalls. Si preguntan “que puerto abrir para NFSv4”, la respuesta es solo TCP 2049. Para NFSv3 tambien se necesita 111 y los puertos de mountd, statd y lockd.

  • root_squash es el comportamiento POR DEFECTO — si no se especifica nada, root remoto se mapea a nobody. no_root_squash debe habilitarse explicitamente y es un riesgo de seguridad. El examen puede preguntar cual es el comportamiento predeterminado.

  • exportfs -ra para aplicar cambios, NO reiniciar NFS — despues de editar /etc/exports, se usa exportfs -ra para re-exportar. No es necesario (ni recomendable) reiniciar el servicio NFS completo.

  • fsid=0 marca la raiz del pseudo-filesystem en NFSv4 — la opcion fsid=0 indica a NFSv4 cual es el directorio raiz virtual. Sin ella, NFSv4 no puede presentar las exportaciones como una estructura unificada.

  • hard vs soft en montaje del clientehard (predeterminado) reintenta indefinidamente si el servidor no responde, lo que puede colgar procesos. soft devuelve error despues de los reintentos, pero puede causar corrupcion de datos. El examen pregunta frecuentemente cual es el predeterminado (hard).

  • _netdev en fstab es necesario para montajes NFS — esta opcion indica al sistema que espere a que la red este disponible antes de intentar el montaje. Sin ella, el montaje puede fallar durante el arranque.

  • all_squash mapea TODOS los usuarios al anonimo, no solo root — con all_squash, cualquier UID/GID del cliente se convierte en el anonimo (configurable con anonuid/anongid). No confundir con root_squash que solo afecta a UID 0.

  • showmount -e revela las exportaciones y es un riesgo de seguridad — en NFSv3, showmount -e servidor lista todas las exportaciones de un servidor. En produccion, esto deberia restringirse con firewall.