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) :
sudo apt updatesudo apt install nfs-kernel-server
Sur les distributions basées sur Red Hat (comme CentOS ou Rocky Linux) :
sudo dnf install nfs-utils
Il faut aussi s’assurer que le service est activé et démarré :
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 :
/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é :
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 :
sudo exportfs -v
- Voir les montages actifs côté client :
mount | grep nfs
- Tester les performances de lecture/écriture :
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 (ou2
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 :
echo 262144 > /proc/sys/net/core/rmem_defaultecho 262144 > /proc/sys/net/core/wmem_default
Et dans /etc/sysctl.conf
:
net.core.rmem_default = 262144net.core.wmem_default = 262144
Appliquer les changements :
sudo sysctl -p
Surveillance des performances
nfsstat
: affiche les appels RPC et les erreurs.iostat -x 1
: surveille le disque et la latence.dstat
ounmon
: vue d’ensemble de l’activité système.
Exemples :
nfsstat -s # côté serveurnfsstat -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
- Installer les paquets nécessaires :
sudo apt install krb5-user nfs-kernel-server
- Créer un principal pour le serveur NFS dans le KDC :
kadmin -q "addprinc -randkey nfs/serveur.example.com"
- Exporter les clés dans un fichier keytab :
kadmin -q "ktadd -k /etc/krb5.keytab nfs/serveur.example.com"
- Configurer le fichier
/etc/idmapd.conf
:
[General]Domain = example.com
[Mapping]Nobody-User = nobodyNobody-Group = nogroup
- Redémarrer les services :
sudo systemctl restart nfs-server
Configuration côté client
- Installer les paquets :
sudo apt install krb5-user nfs-common
- Obtenir un ticket Kerberos :
kinit utilisateur@EXAMPLE.COM
- Monter le partage NFS avec l’option de sécurité :
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 :
mount | grep nfs4
Et vérifier que le champ sec=krb5p
est bien présent.
On peut aussi consulter les tickets Kerberos :
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
:
chmod 600 /etc/krb5.keytabchown 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 ?
sudo systemctl status nfs-server
- Le partage est-il bien exporté ?
sudo exportfs -v
- Le client peut-il résoudre le nom du serveur ?
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 :
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 :
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 :
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
:
sudo ufw allow from 192.168.1.0/24 to any port nfs
Ou avec firewalld
:
sudo firewall-cmd --add-service=nfs --permanentsudo 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 :
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 :
sudo klist -k /etc/krb5.keytab
- Synchroniser l’heure :
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 :
nfsstat -c # côté clientnfsstat -s # côté serveur
- Charge du serveur :
top, htop, iostat, vmstat
- Réseau saturé ou avec des pertes :
iperf, mtr, ping -f
Solutions possibles :
- Augmenter
rsize
etwsize
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é.