Configurare un server NFS su Linux per condividere una directory tramite NFS
Livello: Avanzato
Tempo stimato: ~30 minuti
Obiettivo: Configurare un server NFS su Linux per condividere una directory con più client, facilitando l'automazione delle attività di routine e l'audit di sicurezza proattivo.
Introduzione
La gestione dello storage condiviso su un insieme di server è un requisito fondamentale per mantenere ambienti di produzione con elevati requisiti di uptime. Il protocollo NFS (Network File System) consente a un sistema di condividere una directory tramite NFS in rete, operando come un NAS (Network Attached Storage). Implementando un server NFS su Linux, è possibile fornire un accesso centralizzato ai file a più client NFS contemporaneamente. Questo tutorial spiega come configurare un server NFS su Linux in modo efficiente, utilizzando NFSv4.2 per impostazione predefinita.
Questa guida utilizza il metodo di sicurezza sec=sys (AUTH_SYS). In questa modalità il server si fida intrinsecamente dell'identificazione dell'utente (UID/GID) fornita dal client, senza alcuna autenticazione crittografica. Il controllo degli accessi si basa esclusivamente sul filtraggio degli indirizzi IP in /etc/exports e sui normali permessi UNIX dei file. Questa configurazione è ottima per reti interne attendibili (ad esempio all'interno di un ambiente virtuale Proxmox), ma non è consigliata per reti non attendibili. Per una maggiore sicurezza, valutate l'adozione dell'autenticazione Kerberos (ad esempio sec=krb5, sec=krb5i o sec=krb5p).
Prerequisiti
Prima di iniziare, assicuratevi che siano soddisfatte le seguenti condizioni:
- Sistema operativo: Ubuntu 22.04/24.04 LTS, Debian 12/13 o CentOS/RHEL 9/AlmaLinux 10
- Software richiesto:
nfs-kernel-server(2.6+) per Ubuntu/Debian oppurenfs-utils(2.x+) per CentOS/RHEL/AlmaLinux - Accesso: accesso
sudoorootsu tutte le macchine - Rete: i server devono poter comunicare tra loro tramite una rete privata.
- Conoscenze richieste: buona dimestichezza con la riga di comando di Linux.
Terminologia
Prima di procedere, familiarizzate con i seguenti concetti fondamentali:
- NFS (Network File System): un protocollo che consente di accedere ai file in rete come se fossero archiviati localmente.
- Server NFS: la macchina centrale che ospita i file e li rende disponibili in rete.
- Client NFS: la macchina remota che si connette al server per accedere ai file condivisi.
- Directory condivisa (Shared Directory): la cartella locale sul server che verrà resa disponibile ai client.
- Esportazione (Export): il processo con cui una directory locale viene resa disponibile ai client in rete.
- /etc/exports: il principale file di configurazione utilizzato dal demone NFS per stabilire quali directory esportare e con quali regole di accesso.
- Montaggio (Mounting): il processo di collegamento di una condivisione di rete remota alla struttura di directory locale.
- Punto di mount (Mount Point): la directory locale sul client a cui viene collegato il filesystem remoto.
- nfs-utils: il pacchetto software che contiene le utilità e i demoni necessari per il client e il server NFS.
- RPC (Remote Procedure Call): un protocollo che un programma può usare per richiedere un servizio a un programma situato su un altro computer.
- Portmapper / rpcbind: un servizio che associa i numeri di programma RPC ai numeri di porta di rete, necessario a NFS per negoziare le connessioni.
- Permessi (Permissions): diritti di accesso che stabiliscono chi può leggere, scrivere o eseguire i file.
- Accesso in sola lettura (RO): uno stato di permessi che consente ai client di visualizzare i file ma non di modificarli.
- Accesso in lettura e scrittura (RW): uno stato di permessi che consente ai client di modificare i file condivisi.
- root_squash: una funzione di sicurezza che associa le richieste dell'utente root remoto a un utente non privilegiato (nobody) per impedire accessi root non autorizzati.
- Firewall: un sistema di sicurezza di rete che monitora e controlla il traffico di rete in entrata e in uscita.
- Filesystem Linux: il metodo strutturato utilizzato da Linux per memorizzare e organizzare i file su disco.
- Hostname: un'etichetta leggibile assegnata a un dispositivo connesso a una rete di computer.
- Indirizzo IP: un identificatore numerico univoco assegnato a ogni dispositivo connesso a una rete.
- Automount: la pratica di montare automaticamente i filesystem all'avvio.
- NAS (Network Attached Storage): un'architettura di storage a livello di file che rende i dati accessibili in rete.
Passaggio 1: Installare i pacchetti necessari
Per prima cosa, installate il software necessario sul server e sui client. Il pacchetto nfs-utils fornisce i demoni e gli strumenti necessari per gestire il filesystem. Le configurazioni moderne dovrebbero usare per impostazione predefinita NFSv4.2, che è stateful e semplifica le regole del firewall.
Sul server NFS (Debian/Ubuntu):
sudo apt update sudo apt install nfs-kernel-server
Sul server NFS (CentOS/RHEL/AlmaLinux):
sudo dnf install nfs-utils sudo systemctl enable --now rpcbind nfs-server
In una configurazione esclusivamente NFSv4, il servizio rpcbind non è tecnicamente necessario per il montaggio NFS in sé. Serve però se intendete usare il comando showmount (come illustrato al Passaggio 5) per individuare le esportazioni, oppure se dovete supportare client NFSv3 legacy.
Sul client NFS (Debian/Ubuntu):
sudo apt update sudo apt install nfs-common
Sul client NFS (CentOS/RHEL/AlmaLinux):
sudo dnf install nfs-utils
L'installazione dovrebbe concludersi correttamente. I servizi RPC e NFS necessari sono ora installati e in esecuzione.
Passaggio 2: Creare la directory condivisa e impostare i permessi NFS
Create sul server la directory che intendete esportare:
sudo mkdir -p /mnt/nfs_share
Impostate i permessi NFS appropriati in modo che i client possano accedere ai file. In questo tutorial assegneremo la proprietà all'utente di servizio dedicato non privilegiato e concederemo i permessi di gruppo adeguati.
Debian/Ubuntu:
sudo chown nobody:nogroup /mnt/nfs_share sudo chmod 2775 /mnt/nfs_share
CentOS/RHEL/AlmaLinux:
sudo chown nobody:nobody /mnt/nfs_share sudo chmod 2775 /mnt/nfs_share
Questa configurazione non aggira il modello di permessi locale di Linux, per cui il controllo degli accessi NFS non è il vostro unico livello di sicurezza. Il permesso 2775 abilita in modo sicuro la collaborazione di gruppo senza violare il principio del privilegio minimo.
Passaggio 3: Configurare il server NFS su Linux
Per definire le regole di esportazione, dovete modificare il file /etc/exports sul server.
Aprite il file:
sudo nano /etc/exports
Aggiungete la riga seguente per concedere l'accesso a una specifica sottorete di client (ad esempio <CLIENT_SUBNET>):
/mnt/nfs_share <CLIENT_SUBNET>(rw,sync,no_subtree_check,root_squash)
Questo configura il server per esportare la directory con le seguenti opzioni:
rw: concede l'accesso in lettura e scrittura (RW). Usateroper l'accesso in sola lettura (RO).sync: forza la scrittura delle modifiche su disco prima di rispondere al client.no_subtree_check: disabilita il controllo del sottoalbero (subtree), migliorando l'affidabilità.root_squash: associa esplicitamente le richieste dell'utenterootremoto a un utente non privilegiato (nobody). È il comportamento predefinito, ma andrebbe sempre indicato esplicitamente a fini di audit. Usateno_root_squashsolo in ambienti rigorosamente controllati.
È possibile specificare più client aggiungendo altri indirizzi IP o sottoreti, separati da spazi, sulla stessa riga, abilitando così l'accesso per più macchine.
Applicate la configurazione di esportazione:
Debian/Ubuntu:
sudo exportfs -a sudo systemctl restart nfs-kernel-server
CentOS/RHEL/AlmaLinux:
sudo exportfs -a sudo systemctl restart nfs-server
Il server sta ora esportando attivamente la directory in rete.
Passaggio 4: Configurare il firewall
Dovete consentire il traffico NFS attraverso il firewall del server per permettere le connessioni dei client.
Con UFW (Debian/Ubuntu):
In una nuova installazione di Ubuntu, UFW è inattivo per impostazione predefinita. Su un sistema Debian 13 pulito, potrebbe non essere nemmeno installato. Se intendete usare UFW, assicuratevi che sia installato (sudo apt install ufw) e abilitato esplicitamente prima di aggiungere le regole:
sudo ufw enable sudo ufw allow from <CLIENT_SUBNET> to any port nfs
Con Firewalld (CentOS/RHEL/AlmaLinux):
sudo firewall-cmd --permanent --zone=public --add-service=nfs sudo firewall-cmd --permanent --zone=public --add-service=rpc-bind sudo firewall-cmd --permanent --zone=public --add-service=mountd sudo firewall-cmd --reload
AlmaLinux/RHEL (SELinux): in una nuova installazione di AlmaLinux, SELinux è impostato su Enforcing. Per il percorso predefinito /mnt/nfs_share usato in questa guida, il contesto esistente mnt_t è compatibile con il demone nfsd. Tuttavia, se prevedete di esportare percorsi non standard (ad esempio /srv, /data o /home/...), NFS non potrà scrivervi a meno che non configuriate SELinux in modo appropriato. Potete attivare il booleano globale (sudo setsebool -P nfs_export_all_rw 1) oppure impostare il corretto fcontext tramite semanage.
I client della sottorete consentita possono ora raggiungere i servizi NFS.
Passaggio 5: Verificare l'esportazione con il comando showmount
Sul server, verificate in modo proattivo le esportazioni attive e lo stato interno di audit per garantire la conformità di sicurezza. Eseguite il comando seguente per controllare le esatte opzioni di esportazione applicate dal demone NFS:
sudo cat /var/lib/nfs/etab
In alternativa, potete usare sudo exportfs -v per visualizzare l'elenco dettagliato delle esportazioni.
Quindi, dalla macchina client, usate il comando showmount per verificare che l'esportazione sia visibile in rete. Sostituite <SERVER_IP> con l'effettivo indirizzo IP del vostro server NFS.
showmount richiede che la porta 111 (rpcbind) sia aperta sul server. Se utilizzate una configurazione esclusivamente NFSv4 e non avete aperto questa porta, saltate questo passaggio: verificate le esportazioni sul server con sudo exportfs -v e testate la raggiungibilità dal client montando la condivisione al Passaggio 6.
showmount -e <SERVER_IP>
Output previsto:
Export list for <SERVER_IP>: /mnt/nfs_share <CLIENT_SUBNET>
Se l'esportazione è elencata, la configurazione del server è corretta ed è raggiungibile dal client.
Passaggio 6: Montare il filesystem NFS sul client
Per utilizzare la condivisione, dovete montare il filesystem NFS su un punto di mount locale del client.
Create il punto di mount:
sudo mkdir -p /mnt/client_share
Montate la directory:
sudo mount -t nfs -o vers=4.2 <SERVER_IP>:/mnt/nfs_share /mnt/client_share
La condivisione è ora montata. Potete verificarlo eseguendo df -h per vedere l'unità di rete collegata. Specificare vers=4.2 garantisce che il client utilizzi esplicitamente la versione più recente del protocollo, invece di ripiegare silenziosamente su NFSv3 o NFSv4.0.
Per fare in modo che il client monti il filesystem NFS automaticamente all'avvio, potete configurare un montaggio statico aggiungendo una voce a /etc/fstab. Si tratta di un montaggio statico; le vere configurazioni di Automount dinamico in produzione vengono in genere gestite tramite autofs (/etc/auto.master).
Aprite /etc/fstab:
sudo nano /etc/fstab
Aggiungete la riga seguente:
<SERVER_IP>:/mnt/nfs_share /mnt/client_share nfs auto,nofail,noatime,_netdev,hard,vers=4.2,timeo=600 0 0
Questo impedisce al client di bloccare il processo di avvio se il server è temporaneamente irraggiungibile.
Verifica
Per confermare che i permessi NFS e le impostazioni di rete siano corretti, eseguite un test di lettura/scrittura dal client:
touch /mnt/client_share/test_file.txt ls -l /mnt/client_share/
Output previsto:
-rw-r--r-- 1 nobody nogroup 0 May 24 12:00 test_file.txt
A seconda del sistema operativo del client, il proprietario del file verrà mostrato come nobody nogroup (Debian/Ubuntu) oppure nobody nobody (RHEL/AlmaLinux). Questo è il comportamento previsto dell'idmapping di NFSv4 quando le richieste vengono associate correttamente a un utente non privilegiato. In caso di discrepanze, verificate che il parametro Domain in /etc/idmapd.conf coincida sia sul server sia sul client.
Se il file viene creato correttamente, i vostri client possono comunicare con il server e scrivere dati come previsto.
Ripristino delle modifiche
Per smontare la condivisione sul client:
sudo umount /mnt/client_share
Rimuovete la voce da /etc/fstab sul client, se l'avete aggiunta.
Per interrompere la condivisione della directory sul server, rimuovete la riga corrispondente da /etc/exports e applicate le modifiche:
Debian/Ubuntu:
sudo exportfs -a sudo systemctl restart nfs-kernel-server
CentOS/RHEL/AlmaLinux:
sudo exportfs -a sudo systemctl restart nfs-server
Per rimuovere completamente i pacchetti installati:
Debian/Ubuntu:
sudo apt remove nfs-kernel-server nfs-common
CentOS/RHEL/AlmaLinux:
sudo dnf remove nfs-utils
Questa operazione disattiverà completamente le funzionalità NFS sulle vostre macchine.
Conclusione
Avete imparato con successo a configurare un server NFS su Linux. Con una configurazione corretta, potete condividere una directory tramite NFS in modo sicuro con più client NFS. Questa configurazione rappresenta una base affidabile per automatizzare le attività amministrative di routine e centralizzare i log a supporto di audit di sicurezza proattivi.
Versione del documento: 1.0
Ultimo aggiornamento: maggio 2026
Responsabile: Team di documentazione tecnica