Aller au contenu
medium

NFS : partage réseau sécurisé et rapide

15 min de lecture

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.

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.

À 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.

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) :

Fenêtre de terminal
sudo apt update
sudo apt install nfs-kernel-server

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

Fenêtre de terminal
sudo dnf install nfs-utils

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

Fenêtre de terminal
sudo systemctl enable --now nfs-server

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é.

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 :

Fenêtre de terminal
/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

Section intitulée « 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é :

Fenêtre de terminal
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)

Section intitulée « 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

Section intitulée « Commandes utiles pour vérifier les options actives »
  • Voir les exports côté serveur :
Fenêtre de terminal
sudo exportfs -v
  • Voir les montages actifs côté client :
Fenêtre de terminal
mount | grep nfs
  • Tester les performances de lecture/écriture :
Fenêtre de terminal
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)

Section intitulée « Optimisation des performances avec NFSv4 (avec détails des paramètres) »

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).

Augmenter les buffers pour le réseau :

Fenêtre de terminal
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 :

Fenêtre de terminal
sudo sysctl -p
  • 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 :

Fenêtre de terminal
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.

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é.

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).

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.
  1. Installer les paquets nécessaires :
Fenêtre de terminal
sudo apt install krb5-user nfs-kernel-server
  1. Créer un principal pour le serveur NFS dans le KDC :
Fenêtre de terminal
kadmin -q "addprinc -randkey nfs/serveur.example.com"
  1. Exporter les clés dans un fichier keytab :
Fenêtre de terminal
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 :
Fenêtre de terminal
sudo systemctl restart nfs-server
  1. Installer les paquets :
Fenêtre de terminal
sudo apt install krb5-user nfs-common
  1. Obtenir un ticket Kerberos :
Fenêtre de terminal
kinit utilisateur@EXAMPLE.COM
  1. Monter le partage NFS avec l’option de sécurité :
Fenêtre de terminal
sudo mount -t nfs4 -o sec=krb5p serveur.example.com:/ /mnt/nfs

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

Fenêtre de terminal
mount | grep nfs4

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

On peut aussi consulter les tickets Kerberos :

Fenêtre de terminal
klist
  • 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 :
Fenêtre de terminal
chmod 600 /etc/krb5.keytab
chown root:root /etc/krb5.keytab

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.

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 ?
Fenêtre de terminal
sudo systemctl status nfs-server
  • Le partage est-il bien exporté ?
Fenêtre de terminal
sudo exportfs -v
  • Le client peut-il résoudre le nom du serveur ?
Fenêtre de terminal
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 :

Fenêtre de terminal
sudo mount -t nfs4 serveur:/ /mnt/nfs

Problème 2 : Erreur de permissions sur les fichiers

Section intitulée « 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 :
Fenêtre de terminal
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 :

Fenêtre de terminal
sudo systemctl restart nfs-idmapd

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 :

Fenêtre de terminal
sudo ufw allow from 192.168.1.0/24 to any port nfs

Ou avec firewalld :

Fenêtre de terminal
sudo firewall-cmd --add-service=nfs --permanent
sudo firewall-cmd --reload

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

Pistes :

  • Vérifier que les tickets sont valides :
Fenêtre de terminal
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 :
Fenêtre de terminal
sudo klist -k /etc/krb5.keytab
  • Synchroniser l’heure :
Fenêtre de terminal
sudo systemctl restart chronyd # ou ntp, selon la config

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

Section intitulée « Problème 5 : Problèmes de performance ou lenteur »

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

Diagnostics à faire :

  • Statistiques NFS :
Fenêtre de terminal
nfsstat -c # côté client
nfsstat -s # côté serveur
  • Charge du serveur :
Fenêtre de terminal
top, htop, iostat, vmstat
  • Réseau saturé ou avec des pertes :
Fenêtre de terminal
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.

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é.