De Network File System (NFS) is een gedistribueerde opslagoplossing. Het is een bestandssysteemprotocol waarmee externe mappen op de lokale server kunnen worden gekoppeld en gebruikt alsof het lokale opslag is. NFS stelt meerdere clients in staat om externe opslag te delen. Het is zeer geschikt voor omgevingen die regelmatig gedeelde bronnen vereisen. NFS is gebouwd op het ONC RPC (Open Network Computing Remote Procedure Call)-systeem. Het is een open standaard gedefinieerd in RFC (Request for Comments). Hierdoor kan iedereen het protocol implementeren.
In deze handleiding doorlopen we de stappen voor het opzetten en configureren van een NFS-koppeling op Ubuntu 20.04.
Vereisten
Zoals de beschrijving van NFS suggereert, bestaat de NFS-configuratie uit twee delen:
-
Host: Slaat de gegevens fysiek op en deelt de opslag met 'client'-systemen.
-
Client: Het systeem dat verbinding maakt met de 'host' en de externe opslag gebruikt alsof deze lokaal is.
Voor onze demonstratie gebruiken we twee servers, beide geconfigureerd met Ubuntu 20.04. Hier is een eenvoudige handleiding over hoe u uw Ubuntu-server instelt. In deze handleiding worden deze servers aangeduid als de host en de client. Let op dat de actie voor de client hetzelfde zal zijn, zelfs als er meer dan één is.
Aan de servers zijn de volgende IP-adressen toegewezen. Deze servers worden gehost door CloudSigma:
-
host: 31.171.240.79
-
client: 31.171.250.109
Zorg ervoor dat u deze vervangt door de juiste IP-adressen.
NFS installeren
NFS is direct beschikbaar vanuit de officiële Ubuntu-repositories. Er zijn verschillende softwarepakketten voor de host en de client systemen.
-
NFS installeren op de host
Op de host hebben we de componenten nodig die de machine uitrusten om te dienen als een NFS- host. Dit wordt geleverd in de vorm van het pakket nfs-kernel-server. Ubuntu gebruikt APT als pakketbeheerder. Start eerst de terminal en werk de APT pakketdatabase bij:
|
1 |
host$ sudo apt update |

Installeer vervolgens het nfs-kernel-server-pakket. Indien nodig zal APT eventuele aanvullende afhankelijkheden afhandelen:
|
1 |
host$ sudo apt install nfs-kernel-server |

-
NFS installeren op de client
Op het client-systeem hebben we de functionaliteit nodig om verbinding te maken met de mappen van de host over het netwerk. De NFS-serverfunctionaliteit is hiervoor niet vereist. Op Ubuntu is dit gebundeld in het pakket nfs-common. Werk de APT pakketdatabase bij:
|
1 |
client$ sudo apt update |

Installeer vervolgens het nfs-common-pakket:
|
1 |
$ sudo apt install nfs-common |

Gedeelde mappen op de host
Vervolgens gaan we twee afzonderlijke mappen delen, elk met een andere configuratie. We zullen twee belangrijke manieren demonstreren waarop NFS-koppelingen werken met betrekking tot superuser-toegang. Standaard hebben superusers de bevoegdheid om alles op het gehele systeem uit te voeren. De via NFS gekoppelde mappen maken echter geen deel uit van het systeem waarop ze zijn gekoppeld. De NFS-server weigert elke bewerking uit te voeren die superuser-privileges vereist. Deze beperking houdt in dat clients geen bevoegdheid hebben om te schrijven, eigendommen opnieuw toe te wijzen en andere superuser-taken uit te voeren op de NFS-koppelingen.
Het is mogelijk om bepaalde vertrouwde gebruikers toe te staan deze taken uit te voeren op de gekoppelde bestandssystemen. Dit brengt echter een risico met zich mee, aangezien een dergelijke client mogelijk volledige toegang kan krijgen tot de host. Dit kan worden beperkt met een goed beheer van gebruikersrechten. Op Linux beheert het sudoers-bestand alle gebruikersrechten op het systeem. Voor meer informatie kunt u onze handleiding bekijken over hoe u het Linux sudoers-bestand configureert.
-
Algemene koppeling
Het eerste voorbeeld is een algemene NFS-koppeling met standaard NFS-gedrag. Bij deze aanpak is het voor de client uiterst moeilijk om superuser-acties uit te voeren op de koppelingen. Dit type NFS-koppeling wordt vaak gebruikt voor bestandsopslag, uploaden met behulp van een CMS (Content Management System), of het delen van projectbestanden, enz.
De volgende stappen moeten worden uitgevoerd op het host-systeem. Maak eerst een map aan voor het delen met het label nfs:
|
1 |
host$ sudo mkdir -pv /var/nfs/general |

Omdat de map is gemaakt met sudo rechten, zal de eigenaar root:
|
1 |
$ ls -la /var/nfs/general |

Als standaardconfiguratie zal NFS elke root-bewerking vanaf de clientzijde vertalen naar de nobody:nogroup inloggegevens om veiligheidsredenen. Wijzig voor de consistentie het eigendom van de map zodat dit overeenkomt met de inloggegevens:
|
1 |
host$ sudo chown nobody:nogroup /var/nfs/general |
![]()
-
Home-map
Het tweede voorbeeld is om de home-map van de host gebruiker beschikbaar te maken voor clients. Vertrouwde beheerders van de geselecteerde clients hebben toegang om gebruikers eenvoudig te beheren. De /home map bestaat standaard al, dus het is niet nodig om een map aan te maken. Wat betreft de maprechten is het niet nodig om wijzigingen aan te brengen, omdat dit meer problemen dan voordelen zal opleveren.
NFS-exports configureren
De te delen mappen zijn nu aangemaakt. Vervolgens moet NFS worden geconfigureerd om ze beschikbaar te maken voor clients. NFS gebruikt een configuratiebestand om bij te houden welke mappen moeten worden gedeeld. Open het volgende NFS-configuratiebestand in de teksteditor van uw keuze:
|
1 |
host$ sudo nano /etc/exports |

Het commentaargedeelte van het bestand beschrijft de algemene syntaxisstructuur van de configuratie. Kort gezegd moet elke map in het volgende formaat worden gedeclareerd:
|
1 |
$ <directory> <client>(<optie_1>,<optie_2>,...,<optie_N>) |
Voor de twee mappen die we hebben besloten te delen, ziet de configuratie er als volgt uit. Beide mappen hebben vrijwel dezelfde configuratieopties:
|
1 2 3 |
host$/var/nfs/general 31.171.250.221(rw,sync,no_subtree_check) host$ /home 31.171.250.221(rw,sync,no_root_squash,no_subtree_check) |

Hier is een kort overzicht van de configuratieopties:
-
rw: De client krijgt zowel lees- als schrijfrechten voor het volume.
-
sync: Dwingt NFS om de wijzigingen naar de schijf te schrijven alvorens te antwoorden. Dit biedt een stabielere en consistentere ervaring. Het antwoord weerspiegelt de werkelijke status van het externe volume. De bestandsbewerkingen zullen echter langzamer zijn.
-
no_subtree_check: Voorkomt subtree-controle. Indien niet uitgeschakeld, worden hosts gedwongen om bij elk verzoek van de client te controleren of het bestand in de geëxporteerde boomstructuur bestaat. Dit kan tot veel problemen leiden, bijvoorbeeld als een bestand wordt hernoemd terwijl de client het gebruikt. In de meeste gevallen is het uitschakelen van subtree-controles de beste keuze.
-
no_root_squash: Zoals eerder vermeld, zal NFS elk verzoek van de externe root-gebruiker vertalen naar een niet-geprivilegieerde gebruiker. Dit is een beoogde beveiligingsfunctie om ongewenste toegang tot het hostsysteem te voorkomen. Het gebruik van deze optie zal dit gedrag echter uitschakelen.
Sla het configuratiebestand op en sluit de editor af. Start de NFS-server opnieuw op om de wijzigingen door te voeren:
|
1 |
host$ sudo systemctl restart nfs-kernel-server |
![]()
Firewall aanpassen
Voor elke server is een goede firewallconfiguratie een must. Ervan uitgaande dat u uw Ubuntu 20.04-server dienovereenkomstig hebt geconfigureerd, zou de UFW-firewall actief moeten zijn. Het is een eenvoudige maar krachtige firewall die bij de meeste Linux-distributies wordt geleverd. Voor beginners is hier een korte handleiding met uitleg over UFW, hoe het werkt en veelvoorkomend UFW-gebruik met voorbeelden.
Standaard blokkeert de firewall al het inkomende en uitgaande verkeer. Om ervoor te zorgen dat de NFS-server correct verbinding kan maken en verkeer kan uitwisselen, moeten we een uitzondering toevoegen voor het NFS-protocol. Controleer eerst de status van de firewall. Hiermee worden ook alle huidige regels weergegeven:
|
1 |
host$ sudo ufw status |

Zoals we kunnen zien, is alleen SSH-verkeer toegestaan naar het systeem. We moeten een uitzondering toevoegen om NFS-verkeer toe te staan.
In de meeste gevallen wordt het ten zeerste aanbevolen om de meest beperkende regel te gebruiken die nog steeds het noodzakelijke verkeer toestaat. We staan dus alleen de geselecteerde client(s) toe om verbinding te maken met de host:
|
1 |
host$ sudo ufw allow from 31.171.250.221 to any port nfs |

Controleer daarna de status van de firewall opnieuw:
|
1 |
host$ sudo ufw status |

Koppelpunt maken
De server is nu klaar om de client toe te staan verbinding te maken met het NFS-protocol. Vervolgens moeten we de client voorbereiden. Om toegang te krijgen tot het externe volume, moet dit lokaal worden gekoppeld op de client. Wat betreft het koppelpunt, wordt het aanbevolen om een speciale lege map te gebruiken.
Maak voor de twee externe volumes twee afzonderlijke koppelpunten aan:
|
1 |
client$ sudo mkdir -pv /nfs/general |

|
1 |
client$ sudo mkdir -pv /nfs/home |

Nu de koppelpunten gereed zijn, moet u de externe volumes koppelen:
|
1 |
client$ sudo mount 31.171.240.236:/var/nfs/general /nfs/general |
![]()
|
1 |
client$ sudo mount 31.171.240.236:/home /nfs/home |
![]()
We can verify if the mounts were successful. Check the list of all mounted volumes:
|
1 |
client$ df -h |

Voila! De externe volumes zijn succesvol gekoppeld. We kunnen het schijfgebruik ook controleren met de volgende opdracht:
|
1 |
client$ du -sh /nfs/home |

NFS-toegang testen
Tot nu toe zijn de externe volumes correct gekoppeld. Het heeft echter geen nut als de client geen gegevens kan lezen/schrijven op het externe volume. Maak ter controle een dummybestand aan op de NFS-koppeling(en). Hier wordt het bestand gemaakt met root rechten om te testen of de root-specifieke configuraties correct functioneren:
|
1 |
client$ sudo touch /nfs/general/write_test.txt |
![]()
Controleer vervolgens het eigendom van het bestand:
|
1 |
client$ ls -l /nfs/general/write_test.txt |

Zoals we kunnen zien, vertaalt NFS de eigenaar van het bestand naar nobody:nogroup. De /var/nfs/ general map is eigendom van nobody:nogroup, dus NFS vertaalt het eigendom van het bestand. Tijd om de andere NFS-koppeling te testen:
|
1 |
client$ sudo touch /nfs/home/test_home.txt |
![]()
Controleer het bestaan en het eigendom van het bestand:
|
1 |
Client $ ls -l /nfs/home/test_home.txt |

In dit geval heeft NFS het eigendom van het bestand niet vertaald. Deze client was geconfigureerd om administratieve acties te kunnen uitvoeren. Bovendien is de originele host map /home niet in het bezit van nobody:nogroup.
Extra trucs
-
Koppelen bij het opstarten
Tot nu toe moesten we het NFS-volume handmatig koppelen aan een lokale map. Als ze niet worden ontkoppeld, blijven de NFS-koppelingen actief totdat het systeem opnieuw opstart. Als het NFS-volume regelmatig wordt gebruikt, wordt handmatig koppelen uiterst vervelend. In het geval van meerdere NFS-koppelingen is het onpraktisch om ze handmatig één voor één te koppelen.
Met behulp van het bestand /etc/fstab kunnen we het proces automatiseren. Tijdens het opstarten zal dit script automatisch de NFS-volumes koppelen op de doelkoppelpunten. Open het bestand in een tekst-editor:
|
1 |
client$ sudo nano /etc/fstab |

Voeg de volgende regels toe om de externe volumes van het hostsysteem te koppelen:
|
1 2 3 |
client$ 31.171.240.236:/var/nfs/general /nfs/general nfs auto,nofail,noatime,nolock,intr,tcp,actimeo=1800 0 0 client$31.171.240.236:/home /nfs/home nfs auto,nofail,noatime,nolock,intr,tcp,actimeo=1800 0 0 |

Sla het script op en sluit de tekst-editor. Bij de volgende start zal Linux de externe volumes automatisch koppelen. Houd er rekening mee dat het opstarten van het systeem enige tijd kan duren omdat het verbinding maakt en de volumes koppelt.
-
NFS-volume ontkoppelen
Als het externe volume niet langer nodig is, zal het ontkoppelen van de volumes deze van het clientsysteem verwijderen. Zorg er echter vóór het ontkoppelen voor dat er geen applicatie/script het externe volume gebruikt. Het ontkoppelen van NFS-koppelingen is vergelijkbaar met het ontkoppelen van andere koppelingen. Ontkoppel in dit geval /nfs/home en /nfs/general:
|
1 2 3 |
client$ sudo umount /nfs/home client$ sudo umount /nfs/algemeen |

Controleer vervolgens de actie:
|
1 |
client$ df -h |

Laatste overwegingen
In deze handleiding hebben we een NFS-server gemaakt en enkele basisprincipes van NFS-delen op afstand gedemonstreerd. Als u geïnteresseerd bent in het implementeren van NFS in een productieomgeving, houd er dan rekening mee dat het NFS-protocol niet is versleuteld. Dit kan veiligheidsrisico's met zich meebrengen, bijvoorbeeld man-in-the-middle-aanvallen.
Veel computerplezier!
Reacties
Nog geen reacties. Wees de eerste.