Das Network File System (NFS) ist eine verteilte Speicherlösung. Es handelt sich um ein Dateisystemprotokoll, das es ermöglicht, entfernte Verzeichnisse auf dem lokalen Server einzubinden und so zu nutzen, als handele es sich um lokalen Speicher. NFS ermöglicht es mehreren Clients, gemeinsamen Remote-Speicher zu nutzen. Es eignet sich gut für Umgebungen, die regelmäßig gemeinsam genutzte Ressourcen benötigen. NFS basiert auf dem ONC RPC (Open Network Computing Remote Procedure Call)-System. Es ist ein offener Standard, der in RFC (Request for Comments) definiert ist. Dies ermöglicht es jedem, das Protokoll zu implementieren.
In dieser Anleitung werden wir die Schritte zur Einrichtung und Konfiguration eines NFS-Mounts auf Ubuntu 20.04 durchgehen.
Voraussetzungen
Wie die Beschreibung von NFS vermuten lässt, besteht die NFS-Konfiguration aus zwei Teilen:
-
Host: Speichert die Daten physisch und teilt den Speicher mit „Client“-Systemen.
-
Client: Das System, das sich mit dem „Host“ verbindet und den Remote-Speicher so nutzt, als wäre er lokal.
Für unsere Demonstration verwenden wir zwei Server, die beide mit Ubuntu 20.04 konfiguriert sind. Hier ist eine einfache Anleitung, wie Sie Ihren Ubuntu-Server einrichten. Im Verlauf dieser Anleitung werden diese Server als Host und Client bezeichnet. Beachten Sie, dass die Schritte für den Client dieselben sind, selbst wenn es mehr als einen gibt.
Den Servern sind die folgenden IP-Adressen zugewiesen. Diese Server werden von CloudSigma gehostet:
-
Host: 31.171.240.79
-
Client: 31.171.250.109
Stellen Sie sicher, dass Sie diese durch die entsprechenden IP-Adressen ersetzen.
NFS installieren
NFS ist in den offiziellen Ubuntu-Repositories leicht verfügbar. Es gibt verschiedene Softwarepakete für die Host- und Client-Systeme.
-
NFS auf dem Host installieren
Auf dem Host benötigen wir die Komponenten, die den Rechner in die Lage versetzen, als NFS- Host zu dienen. Dies geschieht in Form des Pakets nfs-kernel-server. Ubuntu verwendet APT als Paketmanager. Starten Sie zuerst das Terminal und aktualisieren Sie die APT-Paketdatenbank:
|
1 |
host$ sudo apt update |

Installieren Sie als Nächstes das Paket nfs-kernel-server. Falls erforderlich, wird APT sich um alle zusätzlichen Abhängigkeiten kümmern:
|
1 |
host$ sudo apt install nfs-kernel-server |

-
NFS auf dem Client installieren
Auf dem Client-System benötigen wir die Funktionalität, um uns über das Netzwerk mit den Verzeichnissen des Hosts zu verbinden. Die NFS-Serverfunktionalität ist dafür nicht erforderlich. Unter Ubuntu ist dies im Paket nfs-common gebündelt. Aktualisieren Sie die APT-Paketdatenbank:
|
1 |
client$ sudo apt update |

Installieren Sie dann das Paket nfs-common:
|
1 |
$ sudo apt install nfs-common |

Freigegebene Verzeichnisse auf dem Host
Als Nächstes werden wir zwei separate Verzeichnisse freigeben, jedes mit einer anderen Konfiguration. Wir werden zwei wesentliche Funktionsweisen von NFS-Mounts im Hinblick auf den Superuser-Zugriff demonstrieren. Standardmäßig haben Superuser das Recht, alles auf dem gesamten System auszuführen. Die über NFS eingebundenen Verzeichnisse sind jedoch nicht Teil des Systems, auf dem sie eingebunden sind. Der NFS-Server verweigert jede Operation, die Superuser-Rechte erfordert. Diese Einschränkung bedeutet, dass Clients keine Berechtigung haben, auf den NFS-Mounts zu schreiben, Eigentumsrechte neu zuzuweisen und andere Superuser-Aufgaben auszuführen.
Es ist möglich, bestimmten vertrauenswürdigen Benutzern die Ausführung dieser Aufgaben auf den eingebundenen Dateisystemen zu gestatten. Dies birgt jedoch ein gewisses Risiko, da ein solcher Client potenziell vollen Zugriff auf den Host erlangen kann. Dies kann durch eine ordnungsgemäße Verwaltung der Benutzerberechtigungen gemildert werden. Unter Linux steuert die sudoers-Datei alle Benutzerrechte auf dem System. Weitere Informationen finden Sie in unserem Tutorial über wie man die Linux-sudoers-Datei konfiguriert.
-
Allzweck-Mount
Das erste Beispiel ist ein Allzweck-NFS-Mount mit Standard-NFS-Verhalten. Bei diesem Ansatz ist es für den Client äußerst schwierig, Superuser-Aktionen auf den Mounts auszuführen. Diese Art von NFS-Mount wird häufig für Dateispeicherung, Uploads über ein CMS (Content Management System) oder die Freigabe von Projektdateien usw. eingesetzt.
Die folgenden Schritte sind auf dem Host-System durchzuführen. Erstellen Sie zuerst ein Verzeichnis für die Freigabe mit dem Namen nfs:
|
1 |
host$ sudo mkdir -pv /var/nfs/general |

Da das Verzeichnis mit sudo -Berechtigungen erstellt wurde, ist der Besitzer root:
|
1 |
$ ls -la /var/nfs/general |

In der Standardkonfiguration übersetzt NFS jede Root-Operation von der Client-Seite in die nobody:nogroup-Anmeldedaten aus Sicherheitsgründen. Ändern Sie aus Konsistenzgründen den Besitzer des Verzeichnisses so, dass er mit den Anmeldedaten übereinstimmt:
|
1 |
host$ sudo chown nobody:nogroup /var/nfs/general |
![]()
-
Home-Verzeichnis
Das zweite Beispiel besteht darin, das Home-Verzeichnis des host-Benutzers für Clients verfügbar zu machen. Vertrauenswürdige Administratoren der ausgewählten Clients können darauf zugreifen, um Benutzer bequem zu verwalten. Das /home-Verzeichnis existiert standardmäßig, sodass kein Verzeichnis erstellt werden muss. Was die Verzeichnisberechtigungen betrifft, sind keine Änderungen erforderlich, da dies mehr Probleme als Nutzen verursachen würde.
NFS-Exports konfigurieren
Die freizugebenden Verzeichnisse sind nun erstellt. Als Nächstes muss NFS so konfiguriert werden, dass sie für Clients verfügbar sind. NFS verwendet eine Konfigurationsdatei, um zu verfolgen, welche Verzeichnisse freigegeben werden sollen. Öffnen Sie die folgende NFS-Konfigurationsdatei in einem Texteditor Ihrer Wahl:
|
1 |
host$ sudo nano /etc/exports |

Der Kommentarbereich der Datei beschreibt die allgemeine Syntaxstruktur der Konfiguration. Kurz gesagt muss jedes Verzeichnis im folgenden Format deklariert werden:
|
1 |
$ <directory> <client>(<option_1>,<option_2>,...,<option_N>) |
Für die beiden Verzeichnisse, die wir freigeben möchten, sieht die Konfiguration wie folgt aus. Beide Verzeichnisse haben fast dieselben Konfigurationsoptionen:
|
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 ist eine kurze Übersicht über die Konfigurationsoptionen:
-
rw: Dem Client werden sowohl Lese- als auch Schreibberechtigungen für das Volume erteilt.
-
sync: Zwingt NFS, die Änderungen auf die Festplatte zu schreiben, bevor geantwortet wird. Dies bietet eine stabilere und konsistentere Benutzererfahrung. Die Antwort spiegelt den tatsächlichen Zustand des Remote-Volumes wider. Die Dateioperationen sind jedoch langsamer.
-
no_subtree_check: Verhindert die Überprüfung von Unterverzeichnissen (Subtree Checking). Wenn dies nicht deaktiviert ist, müssen Hosts bei jeder einzelnen Anfrage des Clients prüfen, ob die Datei im exportierten Verzeichnisbaum existiert. Dies kann zu vielen Problemen führen, beispielsweise wenn eine Datei umbenannt wird, während der Client sie verwendet. In den meisten Fällen ist das Deaktivieren der Unterverzeichnisprüfung die beste Wahl.
-
no_root_squash: Wie bereits erwähnt, übersetzt NFS jede Anfrage des Remote-Root-Benutzers in einen nicht privilegierten Benutzer. Dies ist eine beabsichtigte Sicherheitsfunktion, um unerwünschten Zugriff auf das Host-System zu verhindern. Die Verwendung dieser Option deaktiviert jedoch dieses Verhalten.
Speichern Sie die Konfigurationsdatei und beenden Sie den Editor. Um die Änderungen wirksam zu machen, starten Sie den NFS-Server neu:
|
1 |
host$ sudo systemctl restart nfs-kernel-server |
![]()
Firewall anpassen
Für jeden Server ist eine ordnungsgemäße Firewall-Konfiguration ein Muss. Angenommen, Sie haben Ihren Ubuntu 20.04-Server entsprechend konfiguriert, sollte die UFW-Firewall aktiv sein. Es ist eine einfache, aber leistungsstarke Firewall, die bei den meisten Linux-Distributionen standardmäßig enthalten ist. Für Anfänger gibt es hier eine kurze Anleitung, die UFW erklärt, wie sie funktioniert und die gängige UFW-Nutzung anhand von Beispielen veranschaulicht.
Standardmäßig blockiert die Firewall jeglichen eingehenden und ausgehenden Datenverkehr. Um sicherzustellen, dass der NFS-Server eine Verbindung herstellen und Datenverkehr ordnungsgemäß austauschen kann, müssen wir eine Ausnahme für das NFS-Protokoll hinzufügen. Überprüfen Sie zuerst den Status der Firewall. Dadurch werden auch alle aktuellen Regeln ausgegeben:
|
1 |
host$ sudo ufw status |

Wie wir sehen können, ist nur SSH-Datenverkehr zum System zugelassen. Wir müssen eine Ausnahme hinzufügen, um NFS-Datenverkehr zuzulassen.
In den meisten Fällen wird dringend empfohlen, die restriktivste Regel zu verwenden, die den erforderlichen Datenverkehr noch zulässt. Daher erlauben wir nur den ausgewählten Clients, eine Verbindung zum Host herzustellen:
|
1 |
host$ sudo ufw allow from 31.171.250.221 to any port nfs |

Überprüfen Sie danach erneut den Firewall-Status:
|
1 |
host$ sudo ufw status |

Mountpoint erstellen
Der Server ist nun bereit, dem Client-System zu erlauben, sich mit dem NFS-Protokoll zu verbinden. Als Nächstes müssen wir den Client vorbereiten. Um auf das Remote-Volume zuzugreifen, muss es lokal auf dem Client gemountet werden. Als Mountpoint wird empfohlen, ein dediziertes leeres Verzeichnis zu verwenden.
Erstellen Sie für die beiden Remote-Volumes zwei separate Mountpoints:
|
1 |
client$ sudo mkdir -pv /nfs/general |

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

Da die Mountpoints nun bereit sind, müssen Sie die Remote-Volumes mounten:
|
1 |
client$ sudo mount 31.171.240.236:/var/nfs/general /nfs/general |
![]()
|
1 |
client$ sudo mount 31.171.240.236:/home /nfs/home |
![]()
Wir können überprüfen, ob das Mounten erfolgreich war. Überprüfen Sie die Liste aller gemounteten Volumes:
|
1 |
client$ df -h |

Voila! Die Remote-Volumes wurden erfolgreich gemountet. Wir können den Speicherplatzverbrauch auch mit dem folgenden Befehl überprüfen:
|
1 |
client$ du -sh /nfs/home |

NFS-Zugriff testen
Bisher wurden die Remote-Volumes ordnungsgemäß gemountet. Es nützt jedoch nichts, wenn der Client keine Daten auf dem Remote-Volume lesen/schreiben kann. Erstellen Sie zur Überprüfung eine Dummy-Datei auf dem/den NFS-Mount(s). Hier wird die Datei mit root Rechten erstellt, um zu testen, ob die root-spezifischen Konfigurationen ordnungsgemäß funktionieren:
|
1 |
client$ sudo touch /nfs/general/write_test.txt |
![]()
Überprüfen Sie als Nächstes den Besitzer der Datei:
|
1 |
client$ ls -l /nfs/general/write_test.txt |

Wie wir sehen können, übersetzt NFS den Dateibesitzer in nobody:nogroup. Das Verzeichnis /var/nfs/ general gehört nobody:nogroup, daher übersetzt NFS den Dateibesitz. Zeit, den anderen NFS-Mount zu testen:
|
1 |
client$ sudo touch /nfs/home/test_home.txt |
![]()
Überprüfen Sie die Existenz und den Besitzer der Datei:
|
1 |
Client $ ls -l /nfs/home/test_home.txt |

In diesem Fall hat NFS den Besitzer der Datei nicht übersetzt. Dieser Client wurde so konfiguriert, dass er administrative Aktionen durchführen kann. Zudem gehört das ursprüngliche Host-Verzeichnis /home nicht nobody:nogroup.
Zusätzliche Tricks
-
Mounten beim Systemstart
Bisher mussten wir das NFS-Volume manuell in ein lokales Verzeichnis mounten. Wenn sie nicht ungemountet werden, bleiben die NFS-Mounts bis zum Neustart des Systems bestehen. Wenn das NFS-Volume regelmäßig verwendet wird, wird das manuelle Mounten extrem mühsam. Bei mehreren NFS-Mounts ist es unpraktisch, diese manuell nacheinander zu mounten.
Mithilfe der Datei /etc/fstab können wir den Prozess automatisieren. Beim Booten mountet dieses Skript die NFS-Volumes automatisch auf den Ziel-Mountpoints. Öffnen Sie die Datei in einem Texteditor:
|
1 |
client$ sudo nano /etc/fstab |

Fügen Sie die folgenden Zeilen hinzu, um die Remote-Volumes des Host-Systems zu mounten:
|
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 |

Speichern Sie das Skript und schließen Sie den Texteditor. Beim nächsten Booten wird Linux die Remote-Volumes automatisch mounten. Beachten Sie, dass das Booten des Systems einige Zeit in Anspruch nehmen kann, da es die Volumes verbindet und mountet.
-
NFS-Volume unmounten
Wenn das Remote-Volume nicht mehr benötigt wird, werden die Volumes durch das Aushängen aus dem Client-System entfernt. Stellen Sie vor dem Aushängen jedoch sicher, dass keine Anwendung und kein Skript das Remote-Volume verwendet. Das Aushängen von NFS-Mounts ähnelt dem Aushängen aller anderen Mounts. Hängen Sie in diesem Fall /nfs/home und /nfs/general:
|
1 2 3 |
client$ sudo umount /nfs/home client$ sudo umount /nfs/Allgemein |

Überprüfen Sie anschließend die Aktion:
|
1 |
Client$ df -h |

Abschließende Gedanken
In dieser Anleitung haben wir einen NFS-Server erstellt und einige Grundlagen der NFS-Remotefreigabe demonstriert. Wenn Sie NFS in einer Produktionsumgebung implementieren möchten, denken Sie bitte daran, dass das NFS-Protokoll nicht verschlüsselt ist. Dies kann Sicherheitsrisiken bergen, wie beispielsweise Man-in-the-Middle-Angriffe.
Viel Spaß beim Computing!
Kommentare
Noch keine Kommentare. Schreiben Sie den ersten.