Aller au contenu

Maitriser NFS

Mise à jour :

Le Network File System, plus connu sous le nom de NFS, est un protocole qui permet de partager des fichiers sur un réseau comme s’ils étaient stockés localement. Il a été développé à l’origine par Sun Microsystems et reste aujourd’hui un pilier du partage de fichiers dans les environnements Unix et Linux. Grâce à NFS, on peut centraliser le stockage tout en facilitant l’accès aux données depuis plusieurs machines.

Dans ce guide, je vais expliquer comment installer, configurer, sécuriser et optimiser un serveur NFS, tout en partageant des conseils concrets pour l’utiliser efficacement au quotidien.

Un peu d’histoire

NFS a été introduit en 1984 par Sun Microsystems. Dès le départ, son objectif était clair : offrir un moyen standardisé pour accéder à des fichiers sur un réseau, sans se soucier des détails sous-jacents. Au fil du temps, le protocole a évolué. Les premières versions, comme NFS v2, étaient limitées et peu sécurisées. NFS v3 a apporté des améliorations majeures, notamment la prise en charge de fichiers plus volumineux. Puis est arrivée NFS v4, avec des fonctionnalités de sécurité avancées, la gestion des états et une meilleure compatibilité avec Internet.

Pourquoi utiliser NFS ?

À mon avis, l’un des plus grands atouts de NFS, c’est sa simplicité. Il ne nécessite pas de logiciel client spécifique et s’intègre naturellement au système de fichiers. On peut monter un répertoire distant via une simple commande mount, et il devient immédiatement accessible, comme n’importe quel autre répertoire local.

NFS est encore largement utilisé dans les entreprises pour plusieurs raisons :

  • Il permet de centraliser les fichiers : plus besoin de copier des données sur chaque poste.
  • Il facilite la sauvegarde et la restauration : les données étant stockées en un seul endroit, il suffit de sauvegarder le serveur.
  • Il améliore la collaboration entre utilisateurs : plusieurs postes peuvent accéder au même fichier simultanément.
  • Il s’intègre facilement avec d’autres services Linux, comme les quotas disque, SELinux ou encore Kerberos pour la sécurité.

Bref, que ce soit dans un petit labo ou dans un centre de données, NFS reste une solution simple, efficace et éprouvée pour le partage de fichiers.

Installation et configuration de NFS sur Linux

Configurer un serveur NFS sous Linux est un processus assez direct, mais il demande une certaine rigueur. À mon avis, c’est une bonne occasion d’automatiser un peu son infrastructure avec des scripts ou des outils comme Ansible. Commençons par la base.

Sur les systèmes basés sur Debian (comme Ubuntu) :

Terminal window
sudo apt update
sudo apt install nfs-kernel-server

Sur les distributions basées sur Red Hat (comme CentOS ou Rocky Linux) :

Terminal window
sudo dnf install nfs-utils

Il faut aussi s’assurer que le service est activé et démarré :

Terminal window
sudo systemctl enable --now nfs-server

Configuration de NFS

NFS v4 a introduit un certain nombre d’options spécifiques pour affiner la configuration des exports, des montages et du comportement du protocole. Ces paramètres sont utilisés dans les fichiers /etc/exports, /etc/fstab, ou en ligne de commande avec mount. À mon avis, bien comprendre ces options est indispensable pour un déploiement propre, performant et sécurisé.

Paramètres du fichier /etc/exports coté serveur

Ce fichier contrôle ce que le serveur NFS partage et comment.

Syntaxe générale :

<répertoire> <hôte>(<options>)

Options principales :

  • rw : autorise lecture et écriture.
  • ro : partage en lecture seule.
  • sync : écrit les modifications sur disque immédiatement (plus sûr, moins rapide).
  • async : répond avant d’écrire les modifications (meilleures performances, plus risqué).
  • no_root_squash : autorise root du client à agir comme root sur le serveur (dangereux).
  • root_squash : transforme root du client en utilisateur anonyme (par défaut).
  • all_squash : transforme tous les utilisateurs en utilisateur anonyme (nobody).
  • anonuid=UID, anongid=GID : UID/GID à utiliser pour l’utilisateur anonyme.
  • no_subtree_check : désactive la vérification du sous-arbre exporté (recommandé).
  • subtree_check : vérifie que les fichiers exportés appartiennent au bon sous-répertoire.
  • fsid=0 : désigne la racine exportée (obligatoire pour NFSv4).
  • crossmnt : autorise la traversée des systèmes de fichiers montés sous la racine.
  • sec=krb5|krb5i|krb5p : force l’utilisation de Kerberos pour l’authentification.
  • insecure : autorise les connexions depuis des ports clients supérieurs à 1024 (non recommandé).

Exemple :

Terminal window
/srv/nfs4 192.168.1.0/24(rw,fsid=0,no_subtree_check,crossmnt,sec=krb5p)

Paramètres de montage (mount et /etc/fstab) coté client

Ces options sont passées par le client lors du montage du partage NFS.

Options de base :

  • vers=4, vers=4.1, vers=4.2 : force la version NFS.
  • minorversion=1 : précise la version mineure (utile avec certains noyaux).
  • nfsvers=4 : équivalent à vers=4.
  • proto=tcp : protocole utilisé (TCP obligatoire avec NFSv4).
  • port=n : spécifie un port personnalisé (rarement utilisé avec v4).
  • nolock : désactive le verrouillage de fichiers (inutile en NFSv4).
  • hard : tentatives infinies en cas de coupure réseau (comportement par défaut).
  • soft : échoue après un délai en cas de coupure (moins sûr).
  • intr : permet d’interrompre un processus bloqué sur NFS (obsolète dans v4).
  • noatime : n’enregistre pas la date de dernier accès (améliore les performances).
  • rsize=xxx, wsize=xxx : taille des blocs de lecture/écriture (en octets).
  • timeo=n : délai avant re-tentative RPC (en dixièmes de seconde).
  • retrans=n : nombre de tentatives RPC avant échec.
  • sec=krb5|krb5i|krb5p : niveau de sécurité Kerberos (à synchroniser avec le serveur).
  • nconnect=n : nombre de connexions TCP simultanées (améliore les performances).
  • lookupcache=all|positive|none : comportement du cache de recherche de fichiers.

Exemple optimisé :

Terminal window
mount -t nfs4 -o vers=4.1,sec=krb5p,rsize=1048576,wsize=1048576,nconnect=4,noatime serveur:/ /mnt/nfs

Paramètres liés à idmapd (résolution des UID/GID)

Le fichier /etc/idmapd.conf permet de mapper les UID et GID entre client et serveur.

Sections principales :

  • [General]
    • Domain = example.com : doit être identique sur tous les hôtes.
  • [Mapping]
    • Nobody-User = nobody
    • Nobody-Group = nogroup

Important : l’absence de correspondance UID/GID entre machines provoque des erreurs de permission visibles sous forme de fichiers appartenant à nobody.

Commandes utiles pour vérifier les options actives

  • Voir les exports côté serveur :
Terminal window
sudo exportfs -v
  • Voir les montages actifs côté client :
Terminal window
mount | grep nfs
  • Tester les performances de lecture/écriture :
Terminal window
dd if=/dev/zero of=/mnt/nfs/testfile bs=1M count=100 oflag=direct

Optimisation des performances avec NFSv4 (avec détails des paramètres)

Options de montage recommandées

Voici une ligne optimisée à ajouter dans /etc/fstab :

192.168.1.10:/ /mnt/nfs nfs4 defaults,noatime,tcp,rsize=1048576,wsize=1048576,minorversion=1,nconnect=4 0 0

Détail des options :

  • noatime : supprime la mise à jour de la date d’accès à chaque lecture, réduit les écritures disque.
  • tcp : impose le protocole TCP, obligatoire avec NFSv4 (plus fiable que UDP).
  • rsize=1048576 : définit la taille des blocs de lecture à 1 Mo (à tester selon la bande passante).
  • wsize=1048576 : idem pour les blocs d’écriture.
  • minorversion=1 : active NFSv4.1 (ou 2 pour NFSv4.2 si supporté).
  • nconnect=4 : ouvre 4 connexions TCP en parallèle pour le transfert (utile sur les réseaux à faible latence).

Ajustement du système

Augmenter les buffers pour le réseau :

Terminal window
echo 262144 > /proc/sys/net/core/rmem_default
echo 262144 > /proc/sys/net/core/wmem_default

Et dans /etc/sysctl.conf :

net.core.rmem_default = 262144
net.core.wmem_default = 262144

Appliquer les changements :

Terminal window
sudo sysctl -p

Surveillance des performances

  • nfsstat : affiche les appels RPC et les erreurs.
  • iostat -x 1 : surveille le disque et la latence.
  • dstat ou nmon : vue d’ensemble de l’activité système.

Exemples :

Terminal window
nfsstat -s # côté serveur
nfsstat -c # côté client

Ces optimisations peuvent être ajustées en fonction du matériel, du type de fichiers échangés et de la fréquence d’accès.

Sécurisation de NFSv4 avec Kerberos

L’un des apports majeurs de NFSv4, c’est sa capacité à gérer nativement l’authentification sécurisée via Kerberos. Contrairement à NFSv3, qui repose sur la confiance du réseau local, NFSv4 permet de contrôler l’identité des utilisateurs et de garantir l’intégrité et la confidentialité des données échangées. À mon avis, dès qu’on sort du cadre domestique ou qu’on travaille en entreprise, il est indispensable d’activer cette sécurité.

Principe de l’authentification Kerberos

Kerberos repose sur un serveur central appelé KDC (Key Distribution Center). Lorsqu’un utilisateur ou un service veut accéder à une ressource, il s’authentifie auprès du KDC qui lui fournit un ticket. Ce ticket est ensuite utilisé pour prouver son identité au serveur NFS.

Il existe trois niveaux de sécurité avec NFSv4 :

  • sec=krb5 : authentification uniquement (pas d’intégrité ni de chiffrement).
  • sec=krb5i : inclut l’intégrité des données (prévention des altérations).
  • sec=krb5p : ajoute la confidentialité (chiffrement complet des échanges).

Prérequis pour activer Kerberos avec NFSv4

Avant de configurer NFS, il faut :

  • Un KDC fonctionnel (par exemple MIT Kerberos ou FreeIPA).
  • Le serveur et les clients doivent avoir des horloges synchronisées (via NTP).
  • Le DNS doit être configuré proprement, car Kerberos utilise les noms FQDN.

Configuration côté serveur

  1. Installer les paquets nécessaires :
Terminal window
sudo apt install krb5-user nfs-kernel-server
  1. Créer un principal pour le serveur NFS dans le KDC :
Terminal window
kadmin -q "addprinc -randkey nfs/serveur.example.com"
  1. Exporter les clés dans un fichier keytab :
Terminal window
kadmin -q "ktadd -k /etc/krb5.keytab nfs/serveur.example.com"
  1. Configurer le fichier /etc/idmapd.conf :
[General]
Domain = example.com
[Mapping]
Nobody-User = nobody
Nobody-Group = nogroup
  1. Redémarrer les services :
Terminal window
sudo systemctl restart nfs-server

Configuration côté client

  1. Installer les paquets :
Terminal window
sudo apt install krb5-user nfs-common
  1. Obtenir un ticket Kerberos :
Terminal window
kinit utilisateur@EXAMPLE.COM
  1. Monter le partage NFS avec l’option de sécurité :
Terminal window
sudo mount -t nfs4 -o sec=krb5p serveur.example.com:/ /mnt/nfs

Vérification de l’authentification

Pour vérifier que le partage utilise bien Kerberos, on peut utiliser :

Terminal window
mount | grep nfs4

Et vérifier que le champ sec=krb5p est bien présent.

On peut aussi consulter les tickets Kerberos :

Terminal window
klist

Recommandations

  • Utiliser krb5p pour des données sensibles ou des connexions sur réseaux non sécurisés.
  • Préférer krb5i dans les environnements où la performance prime mais où l’intégrité est nécessaire.
  • Limiter l’accès au fichier keytab :
Terminal window
chmod 600 /etc/krb5.keytab
chown root:root /etc/krb5.keytab

Dépannage des problèmes courants avec NFSv4

Même avec une configuration rigoureuse, NFSv4 peut rencontrer des problèmes liés au réseau, aux permissions ou aux services. À mon avis, ce protocole est robuste, mais très sensible aux erreurs de configuration. Voici les cas que je rencontre le plus souvent et comment je les corrige.

Problème 1 : Montage échoue ou reste bloqué

Symptôme : La commande mount ne répond pas ou échoue avec une erreur.

Vérifications à faire :

  • Le service NFS est-il démarré côté serveur ?
Terminal window
sudo systemctl status nfs-server
  • Le partage est-il bien exporté ?
Terminal window
sudo exportfs -v
  • Le client peut-il résoudre le nom du serveur ?
Terminal window
ping serveur.example.com

Astuce : Si le client tente de monter sans option explicite nfs4, il peut utiliser par défaut NFSv3. Forcer la version avec :

Terminal window
sudo mount -t nfs4 serveur:/ /mnt/nfs

Problème 2 : Erreur de permissions sur les fichiers

Symptôme : Les fichiers montés sont accessibles uniquement par nobody ou ont des droits incohérents.

Causes possibles :

  • Mauvaise correspondance des UID/GID entre serveur et client.
  • Le démon idmapd n’est pas lancé ou mal configuré.

Solution :

  • Vérifier que rpc.idmapd tourne :
Terminal window
ps aux | grep idmapd
  • Vérifier que le fichier /etc/idmapd.conf contient le bon domaine :
[General]
Domain = example.com

Et que ce domaine est identique sur le serveur et tous les clients.

Redémarrer le service :

Terminal window
sudo systemctl restart nfs-idmapd

Problème 3 : “Permission denied” au montage

Symptôme : L’accès est refusé malgré une configuration d’exports correcte.

Vérifications à faire :

  • L’IP du client est-elle bien dans la plage autorisée du fichier /etc/exports ?
  • Les ports NFS sont-ils ouverts côté pare-feu ?

Ports à ouvrir avec ufw ou firewalld :

Terminal window
sudo ufw allow from 192.168.1.0/24 to any port nfs

Ou avec firewalld :

Terminal window
sudo firewall-cmd --add-service=nfs --permanent
sudo firewall-cmd --reload

Problème 4 : Kerberos ne fonctionne pas

Symptôme : Erreur lors du montage avec sec=krb5p, ou kinit échoue.

Pistes :

  • Vérifier que les tickets sont valides :
Terminal window
klist
  • S’assurer que /etc/krb5.conf pointe vers le bon KDC.
  • Que le fichier /etc/krb5.keytab est lisible uniquement par root et contient bien le bon principal :
Terminal window
sudo klist -k /etc/krb5.keytab
  • Synchroniser l’heure :
Terminal window
sudo systemctl restart chronyd # ou ntp, selon la config

Problème 5 : Problèmes de performance ou lenteur

Symptôme : Accès lent, transferts bloqués ou retardés.

Diagnostics à faire :

  • Statistiques NFS :
Terminal window
nfsstat -c # côté client
nfsstat -s # côté serveur
  • Charge du serveur :
Terminal window
top, htop, iostat, vmstat
  • Réseau saturé ou avec des pertes :
Terminal window
iperf, mtr, ping -f

Solutions possibles :

  • Augmenter rsize et wsize côté client.
  • Utiliser nconnect pour paralléliser les connexions TCP.
  • Passer en async temporairement si la latence d’écriture est trop pénalisante (attention à la fiabilité).

À retenir :

Le dépannage NFSv4 repose sur une bonne maîtrise des logs, une configuration réseau propre, et une cohérence des UID/GID. Quand un problème surgit, je commence toujours par remonter la chaîne : client → réseau → serveur → configuration des exports. C’est méthodique, et ça évite de tourner en rond.

Conclusion

NFS est un service puissant pour le partage de fichiers en réseau. Avec une configuration soignée, il peut offrir des performances élevées et une sécurité renforcée. En suivant les bonnes pratiques et en restant vigilant sur les mises à jour, on peut tirer le meilleur parti de ce protocole éprouvé.