Introduzione
NFS o Network File System è un protocollo di file system distribuito che consente di condividere directory su una rete. Con NFS, puoi montare directory remote sul tuo sistema e lavorare con i file sulla macchina remota come se fossero file locali.
Per impostazione predefinita, il protocollo NFS non è crittografato e non fornisce l'autenticazione dell'utente. L'accesso al server è limitato dagli indirizzi IP o dall'hostname del client.
Questo articolo spiega come configurare un server NFSv4 su Ubuntu 20.04 LTS Focal Fossa. Ti mostreremo anche come montare un file system NFS sulla macchina client.
Prerequisiti
Useremo due macchine, una che esegue Ubuntu 20.04 LTS, che fungerà da server NFS, e un'altra che eseguirà qualsiasi altra distribuzione Linux su cui monteremo la condivisione. Il server e i client dovrebbero essere in grado di comunicare tra loro su una rete privata. È possibile utilizzare indirizzi IP pubblici e configurare il firewall del server per consentire il traffico sulla porta 2049
solo da fonti attendibili.
Le macchine in questo esempio hanno i seguenti IP:
NFS Server IP: 192.168.33.10
NFS Clients IPs: From the 192.168.33.0/24 range
Configurare il server NFS
Il primo passo è configurare il server NFS. Installeremo i pacchetti necessari, creeremo ed esporteremo le directory NFS e configureremo il firewall.
Installare server NFS
Il pacchetto del server NFS fornisce il supporto per lo spazio utente necessario per eseguire il server del kernel NFS. Per installare il pacchetto, esegui:
sudo apt update
sudo apt install nfs-kernel-server
Una volta completata l'installazione, i servizi NFS verranno avviati automaticamente.
Su Ubuntu 20.04, la versione 2 di NFS è disabilitata. Le versioni 3 e 4 sono abilitate. Puoi verificarlo eseguendo il seguente comando cat
:
sudo cat /proc/fs/nfsd/versions
-2 +3 +4 +4.1 +4.2
NFSv2 è piuttosto vecchio adesso e non c'è motivo per abilitarlo.
La configurazione del server NFS è definita nei file file/etc/default/nfs-kernel-server
e /etc/default/nfs-common
. Le impostazioni predefinite sono sufficienti per la maggior parte delle situazioni.
Creare i file system
Il server NFSv4 utilizza una directory principale globale e le directory esportate sono relative a questa directory. È possibile collegare il punto di montaggio della condivisione alle directory che si desidera esportare utilizzando i montaggi bind.
In questo esempio, imposteremo la directory /srv/nfs4
come root NFS. Per spiegare meglio come possono essere configurati i montaggi NFS, condivideremo due directory (/var/www
e /opt/backups
) con diverse impostazioni di configurazione. La directory /var/www/
è di proprietà dell'utente www-data
e /opt/backups
è di proprietà di root
.
Per prima cosa crea la directory principale e i punti di montaggio condivisi:
sudo mkdir -p /srv/nfs4/backups
sudo mkdir -p /srv/nfs4/www
Associare il montaggio delle directory ai punti di montaggio della condivisione:
sudo mount --bind /opt/backups /srv/nfs4/backups
sudo mount --bind /var/www /srv/nfs4/www
Per rendere permanenti i montaggi di bind durante i riavvii, apri il file /etc/fstab
:
sudo nano /etc/fstab
Aggiungi le seguenti righe:
Esportare i file system
Il passaggio successivo consiste nell'aggiungere i file system che verranno esportati e i client autorizzati ad accedere a tali condivisioni al file /etc/exports
.
Ogni riga per un file system esportato ha la seguente forma:
export host(options)
export
indica la directory esportata, host
è l'hostname o un indirizzo IP/intervallo che può accedere all'esportazione e options
sono le opzioni dell'host.
Apri il file /etc/exports
e aggiungi le seguenti righe:
sudo nano /etc/exports
La prima riga contiene l'opzione fsid=0
, che definisce la directory root di NFS (/srv/nfs4
). L'accesso a questo volume NFS è consentito solo ai client dalla sottorete 192.168.33.0/24
. L'opzione crossmnt
è necessaria per condividere directory che sono sottodirectory di una directory esportata.
La seconda riga mostra come specificare più regole di esportazione per un file system. L'accesso in lettura è consentito all'intero dell'intervallo 192.168.33.0/24
e l'accesso in lettura e scrittura solo all'indirizzo IP 192.168.33.3
. L'opzione sync
dice a NFS di scrivere le modifiche sul disco prima di rispondere.
L'ultima riga è autoesplicativa. Per ulteriori informazioni su tutte le opzioni disponibili, digita il comando man exports
nel tuo terminale.
Salva il file ed esporta le condivisioni:
sudo exportfs -ar
È necessario eseguire il comando sopra ogni volta che si modifica il file /etc/exports
. Se sono presenti errori o avvisi, verranno visualizzati sul terminale.
Per visualizzare le esportazioni attive correnti e il loro stato, utilizzare:
sudo exportfs -v
L'output includerà tutte le azioni con le relative opzioni. Come puoi vedere ci sono anche opzioni che non abbiamo definito nel file /etc/exports
. Queste sono opzioni predefinite e se vuoi modificarle dovrai impostare esplicitamente quelle opzioni.
/srv/nfs4/backups
192.168.33.3(rw,wdelay,root_squash,no_subtree_check,sec=sys,rw,secure,root_squash,no_all_squash)
/srv/nfs4/www 192.168.33.20(rw,wdelay,root_squash,no_subtree_check,sec=sys,rw,secure,root_squash,no_all_squash)
/srv/nfs4 192.168.33.0/24(rw,wdelay,crossmnt,root_squash,no_subtree_check,fsid=0,sec=sys,rw,secure,root_squash,no_all_squash)
/srv/nfs4/backups
192.168.33.0/24(ro,wdelay,root_squash,no_subtree_check,sec=sys,ro,secure,root_squash,no_all_squash)
Su Ubuntu, root_squash
è abilitato per impostazione predefinita. Questa è una delle opzioni più importanti per quanto riguarda la sicurezza NFS. Impedisce agli utenti root collegati dai client di avere privilegi di root sulle condivisioni montate mappando root UID
e GID
su nobody
/ nogroup
UID
/ GID
.
Affinché gli utenti sulle macchine client abbiano accesso, NFS si aspetta che gli ID utente e gruppo del client corrispondano a quelli sul server. Un'altra opzione è quella di utilizzare la funzionalità di mappatura id NFSv4 che traduce gli ID utente e gruppo in nomi e viceversa.
Questo è tutto. A questo punto, hai configurato un server NFS sul tuo server Ubuntu. È ora possibile passare alla fase successiva e configurare i client e connettersi al server NFS.
Configurare il firewall
Se stai installando Jenkins su un server Ubuntu remoto protetto da un firewall, dovrai abilitare il traffico sulla porta NFS:
sudo ufw allow from 192.168.33.0/24 to any port nfs
Verifica la modifica:
sudo ufw status
L'output dovrebbe mostrare che il traffico sulla porta 2049
è consentito:
To Action From
-- ------ ----
2049 ALLOW 192.168.33.0/24
22/tcp ALLOW Anywhere
22/tcp (v6) ALLOW Anywhere (v6)
Configurare i client NFS
Ora che il server NFS è configurato e le condivisioni vengono esportate, il passo successivo è configurare i client e montare i file system remoti.
Ci concentreremo sui sistemi Linux, ma puoi anche montare la condivisione NFS su macchine macOS e Windows.
Installare il client NFS
Sulle macchine client, dobbiamo installare solo gli strumenti necessari per montare un file system NFS remoto.
Installare il client NFS su Debian e Ubuntu
Il nome del pacchetto che include programmi per il montaggio di file system NFS su distribuzioni basate su Debian è nfs-common
. Per installarlo, esegui:
sudo apt update
sudo apt install nfs-common
Installare il client NFS su CentOS e Fedora
Su Red Hat e sui suoi derivati, installa il pacchetto nfs-utils
:
sudo yum install nfs-utils
Montare i file system
Lavoreremo sulla macchina client con IP 192.168.33.20
, che ha accesso in lettura e scrittura al file system /srv/nfs4/www
e accesso in sola lettura al file system /srv/nfs4/backups
.
Crea due nuove directory per i punti di montaggio:
sudo mkdir -p /backups
sudo mkdir -p /srv/www
Puoi creare le directory in qualsiasi posizione desideri.
Montare i file system esportati con il comando mount
:
sudo mount -t nfs -o vers=4 192.168.33.10:/backups /backups
sudo mount -t nfs -o vers=4 192.168.33.10:/www /srv/www
192.168.33.10
è l'IP del server NFS. È inoltre possibile utilizzare l'hostname al posto dell'indirizzo IP, ma deve essere risolto dalla macchina client. Questo di solito viene fatto mappando l'hostname sull'IP nel file /etc/hosts
.
Quando si monta un filesystem NFSv4, omettere la directory root di NFS. Usa /backups
, invece di /srv/nfs4/backups
.
Verificare che i file system remoti siano montati correttamente utilizzando il montaggio o il comando df
:
df -h
Il comando stamperà tutti i file system montati. Le ultime due righe sono le condivisioni montate:
Filesystem Size Used Avail Use% Mounted on
udev 951M 0 951M 0% /dev
tmpfs 199M 676K 199M 1% /run
/dev/sda3 124G 2.8G 115G 3% /
tmpfs 994M 0 994M 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 994M 0 994M 0% /sys/fs/cgroup
/dev/sda1 456M 197M 226M 47% /boot
tmpfs 199M 0 199M 0% /run/user/1000
192.168.33.10:/backups 124G 2.8G 115G 3% /backups
192.168.33.10:/www 124G 2.8G 115G 3% /srv/www
Per rendere permanenti i montaggi al riavvio, apri il file /etc/fstab
e aggiungi le seguenti righe:
sudo nano /etc/fstab
192.168.33.10:/backups /backups nfs defaults,timeo=900,retrans=5,_netdev 0 0
192.168.33.10:/www /srv/www nfs defaults,timeo=900,retrans=5,_netdev 0 0
Per informazioni sulle opzioni disponibili durante il montaggio di un file system NFS, digita il comando man nfs
tuo terminale.
Un'altra opzione per montare i file system remoti consiste nell'usare lo strumento autofs
o nel creare un'unità systemd.
Test dell'accesso NFS
Testiamo l'accesso alle condivisioni creando un nuovo file su ognuna di esse.
Innanzitutto, prova a creare un file di prova nella directory /backups
utilizzando il comando touch
:
sudo touch /backups/test.txt
Il file system /backup
viene esportato in sola lettura e come previsto vedrai un messaggio di errore Permission denied
:
touch: cannot touch ‘/backups/test’: Permission denied
Successivamente, prova a creare un file di prova nella directory /srv/www
come root utilizzando il comando sudo
:
sudo touch /srv/www/test.txt
Di nuovo, vedrai il messaggio Permission denied
.
touch: cannot touch ‘/srv/www’: Permission denied
Se vi ricordate, la directory /var/www
è di proprietà dell'utente www-data
, e questa condivide l'opzione root_squash
che mappa l'utente root all'utente nobody
e al gruppo nogroup
che non dispone di autorizzazioni di scrittura alla condivisione remota.
Supponendo che tu abbia utilizzato www-data
sulla macchina client con lo stesso UID
e GID
come sul server remoto (che dovrebbe essere il caso se, ad esempio, hai installato nginx su entrambe le macchine), puoi provare a creare un file come utente www-data
:
sudo -u www-data touch /srv/www/test.txt
Il comando non mostrerà alcun output, il che significa che il file è stato creato con successo.
Per verificarlo elenca i file nella directory /srv/www
:
ls -la /srv/www
L'output dovrebbe mostrare il file appena creato:
drwxr-xr-x 3 www-data www-data 4096 Apr 10 22:18 .
drwxr-xr-x 3 root root 4096 Apr 10 22:29 ..
-rw-r--r-- 1 www-data www-data 0 Apr 10 21:58 index.html
-rw-r--r-- 1 www-data www-data 0 Apr 10 22:18 test.txt
Smontaggio del file system NFS
Se la condivisione NFS remota non è più necessaria, è possibile smontarla come qualsiasi altro file system montato utilizzando il comando umount
.
Ad esempio, per smontare la condivisione /backup
, dovresti eseguire:
sudo umount /backups
Se il punto di montaggio è definito nel file /etc/fstab
, assicurati di rimuovere la riga o commentarla aggiungendo #
all'inizio della riga.
Conclusione
Ti abbiamo mostrato come configurare un server NFS e come montare i file system remoti sulle macchine client. Se stai implementando NFS in produzione e condividi dati sensibili, è una buona idea abilitare l'autenticazione Kerberos.
In alternativa a NFS, puoi usare SSHFS per montare directory remote su una connessione SSH. SSHFS è crittografato per impostazione predefinita ed è molto più facile da configurare e utilizzare.