Archivos Mensuales: octubre 2022

NFS en Debian: Molaba el siglo pasado

NFS es uno de esos protocolos que, a la chita callando, ahí sigue. Ciertamente, su interoperabilidad no es la de la familia SMB que Samba resolvió hace años, tras grandes esfuerzos que, sin duda, en ningún caso se dedicaron a su página web. Y en los tiempos que vivimos, en que el espacio tiene un coste tan ridículo, replicar datos al vuelo es tan barato y eficaz, y accederlos por protocolos más «web» es tan fácil, NFS se ha quedado con cuatro parcelitas de uso. Pero son sus cuatro parcelitas, y en ellas no hay nada mejor. Por ejemplo, si un servidor ha de acceder a los archivos de otro, especialmente si está cerquita, y posiblemente también modificarlos, de una manera interactiva y sin grandes complicaciones.

La implantación de NFS en Debian hereda costumbres de tiempos remotos. La página man de nfsd fue modificada por última vez en 2014, y es de las más modernas. No es de extrañar que lo que rodea a nfs, recuerde tiempos de redes confiables, en que lo más peligroso era el entusiasmo de un estudiante descubriendo el mundo de mover bits de un lado para otro.

NFS en Debian, por defecto, escucha en todos los interfaces de red que pilla. Que, como caso general, está bien; pero si lo que pretendemos es que dos servidores que son accesibles públicamente se hablen por una discreta red trasera, y sin exponer al público la posibilidad de buscarle las cosquillas, parecería que nuestro único recurso es poner delante un cortafuegos (unas reglas de nftables, por ejemplo).

Ah, pero la venerable página de nfsd dice que el servicio acepta -H seguida de una IP para escuchar. Guay, ¿y cómo se hace eso a la Debian?

Pues al menos hasta Debian 11, nfs se configura poniendo valores en los tradicionales ficheros de variables de /etc/default. Simple y efectivo. En el caso del servidor nfs, la apropiada es /etc/default/nfs-kernel-server. Ahora bien, ¿cuál es la variable?

Pues una que no está:

RPCNFSDOPTS="-H <IP>"

Por algún motivo, la variable, que es RPCNFSDOPTS, no está. Normalmente, todas las variables que tienen algo que ver con un fichero de variables de /etc/defaults están presentes, aunque estén vacías, y tienen algún comentario que explica su función.

Encontré en Server Fault a otro pobre y desamparado administrador de sistemas preguntándose cómo es posible que no hubiera forma de hacer esto, así que por lo que me costaba, lo dejé documentado para la posteridad.

Así en resumen, el fichero /etc/default/nfs-kernel-server, con RPCNFSDOPTS y todo lo demás, lo lee /usr/lib/systemd/scripts/nfs-utils_env.sh. Este incluye el valor de RPCNFSDOPTS en RPCNFSDARGS y manda esta y otras variables a /run/sysconfig/nfs-utils; de ahí lo lee el fichero unit de arranque de nfsd, /lib/systemd/system/nfs-server.service, y al arrancar /usr/sbin/rpc.nfsd, le pasa como parámetro el contenido de RPCNFSDARGS. Y el arzobispo de Constantinopla… Bueno, que me desvío.

Hacer que un servicio escuche solamente donde necesita, si es que tal cosa es posible, es la primera línea de defensa; anterior, incluso, al cortafuegos. Al fin y al cabo, si no hay posibilidad de comunicación, no hay posibilidad de intrusión. Y como rpc.nfsd lo permite, me he permitido sugerir a Debian que documente el uso de RPCNFSDOPTS en /etc/default/nfs-kernel-server.

Actualizado el día siguiente a la publicación de este artículo lo siguiente. Siempre tan abnegados, respondieron a mi sugerencia superando mis expectativas:

Since version 1:2.6.1-1 /etc/nfs.conf settings can be done, or in
dropins in /etc/nfs.conf.d/ so closing this bug with that version.
Starting there you can set the host= and other parameters in the
configuration file in the [nfsd] stanza.

Salvatore Bonaccorso, mantenedor de nfs-kernel-server

Bookworm tiene ya la versión 1:2.6.2-1+b1. Así que quien no pueda vivir sin esto, que corra esa versión, que en el momento de escribir esto, es la testing. Con la variable puesta como he descrito, por ahora, es suficiente; solo hay que acordarse de volver sobre este asunto cuando se empiece a instalar nfs en bookworm.