Nfs3 Server Grundlagen: Unterschied zwischen den Versionen
(Die Seite wurde neu angelegt: „=NFS Server Version 3= ==Allgemeines== NFS (Network File System) ist ein Protokoll, mit dem ein Server Verzeichnisse über das Netz freigibt, die Clients wie…“) |
|||
| Zeile 2: | Zeile 2: | ||
==Allgemeines== | ==Allgemeines== | ||
| − | NFS (Network File System) ist ein Protokoll, mit dem ein Server Verzeichnisse über das Netz freigibt | + | NFS (Network File System) ist ein Protokoll, mit dem ein Server Verzeichnisse über das Netz freigibt. Clients hängen diese Freigaben ein und arbeiten damit wie mit einem lokalen Dateisystem. NFS wurde ursprünglich von Sun Microsystems entwickelt und ist im Unix- und Linux-Umfeld der Standard für Dateifreigaben. |
| − | NFS Version 3 (RFC 1813, | + | NFS Version 3 wurde 1995 veröffentlicht (RFC 1813). Obwohl es mit NFSv4 längst einen Nachfolger gibt, ist Version 3 weiterhin weit verbreitet, vor allem als Storage für Virtualisierungsplattformen wie Proxmox VE oder VMware und auf vielen NAS-Systemen. Gründe dafür sind die einfache Einrichtung, die hohe Robustheit und die breite Unterstützung. |
| − | ==Eigenschaften | + | ==Eigenschaften== |
| − | * '''Zustandslos''' - der Server merkt sich nicht, welche Clients welche Dateien geöffnet haben. | + | * '''Zustandslos''' - der Server merkt sich nicht, welche Clients welche Dateien geöffnet haben. Jede Anfrage enthält alle nötigen Informationen. Startet der Server neu, arbeiten die Clients einfach weiter, als wäre nichts gewesen. |
| − | * '''Basiert auf RPC''' | + | * '''Basiert auf RPC''' - NFS nutzt Remote Procedure Calls. Die Funktionen sind auf mehrere einzelne Dienste verteilt. |
| − | * '''Locking ist ausgelagert''' - Dateisperren laufen über ein eigenes Protokoll | + | * '''Locking ist ausgelagert''' - Dateisperren sind nicht Teil von NFSv3, sondern laufen über ein eigenes Protokoll, den Network Lock Manager. |
| − | * '''TCP und UDP''' - | + | * '''TCP und UDP''' - beide Transportprotokolle sind möglich, heute wird praktisch nur noch TCP verwendet. |
| − | * '''Authentifizierung über | + | * '''Authentifizierung über Benutzer- und Gruppennummern''' - der Server vertraut den UID- und GID-Werten, die der Client mitschickt. Eine echte Anmeldung von Benutzern gibt es nicht. |
| − | * '''64-Bit-Dateigrößen | + | * '''Große Dateien und asynchrones Schreiben''' - gegenüber NFSv2 brachte Version 3 64-Bit-Dateigrößen und die Möglichkeit, Schreibvorgänge zu puffern und später gesammelt zu bestätigen. |
==Beteiligte Dienste== | ==Beteiligte Dienste== | ||
| + | Ein NFSv3-Server besteht aus mehreren Diensten, die zusammenarbeiten: | ||
| + | |||
{| class="wikitable" | {| class="wikitable" | ||
| − | ! Dienst | + | ! Dienst !! Aufgabe |
|- | |- | ||
| − | | rpcbind ( | + | | rpcbind (Portmapper) || Läuft auf dem festen Port 111 und teilt Clients mit, auf welchem Port welcher RPC-Dienst erreichbar ist |
|- | |- | ||
| − | | nfsd | + | | nfsd || Der eigentliche NFS-Dienst auf Port 2049, zuständig für Lesen, Schreiben und Verzeichniszugriffe |
|- | |- | ||
| − | | mountd | + | | mountd || Nimmt Mount-Anfragen entgegen und prüft, ob der Client die Freigabe nutzen darf |
|- | |- | ||
| − | | lockd | + | | lockd || Verwaltet Dateisperren (Network Lock Manager) |
|- | |- | ||
| − | | statd | + | | statd || Benachrichtigt Server und Clients nach einem Neustart, damit Sperren wiederhergestellt oder freigegeben werden |
|- | |- | ||
| − | | rquotad || | + | | rquotad || Liefert Quota-Informationen an die Clients (optional) |
|} | |} | ||
| − | + | Bis auf rpcbind und nfsd benutzen diese Dienste standardmäßig wechselnde Ports. Das macht NFSv3 hinter einer Firewall unhandlich. In der Praxis legt man die Ports deshalb fest. | |
| − | |||
| − | |||
| − | |||
| − | == | + | ==Ablauf beim Einhängen== |
| − | + | # Der Client fragt rpcbind auf dem Server, auf welchem Port mountd läuft. | |
| − | + | # Der Client meldet sich bei mountd und fordert die gewünschte Freigabe an. | |
| − | + | # mountd prüft die Berechtigung und gibt ein Filehandle für das Wurzelverzeichnis der Freigabe zurück. | |
| − | + | # Ab jetzt spricht der Client direkt mit nfsd und benutzt Filehandles, um Dateien und Verzeichnisse anzusprechen. | |
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | == | + | ==Filehandles== |
| − | + | Ein NFS-Client spricht Dateien nicht über Pfade an, sondern über Filehandles. Ein Filehandle ist eine Kennung, die im Wesentlichen das Dateisystem und die Inode-Nummer der Datei enthält. Der Server sieht bei einer Anfrage also nicht den Pfad, sondern nur, welche Inode auf welchem Dateisystem gemeint ist. | |
| − | |||
| − | |||
| − | + | Daraus ergibt sich eine Besonderheit: Wird nur ein Unterverzeichnis eines Dateisystems freigegeben, liegen auf demselben Dateisystem auch Dateien außerhalb der Freigabe. Mit der Option ''subtree_check'' prüft der Server bei jedem Zugriff, ob die Datei tatsächlich innerhalb der Freigabe liegt. Diese Prüfung kostet Leistung und führt zu Fehlern, wenn geöffnete Dateien umbenannt oder verschoben werden. Heute ist deshalb ''no_subtree_check'' der Standard. Die saubere Lösung ist, für jede Freigabe ein eigenes Dateisystem zu verwenden. | |
| − | |||
| − | |||
| − | ==Freigaben | + | ==Freigaben== |
| − | + | Welche Verzeichnisse freigegeben werden, ist auf dem Server in der Datei ''/etc/exports'' festgelegt. Für jedes Verzeichnis wird angegeben, welche Rechner oder Netze darauf zugreifen dürfen und mit welchen Optionen. | |
| − | + | Wichtige Optionen sind: | |
| − | + | * '''rw / ro''' - Lesen und Schreiben oder nur Lesen. | |
| + | * '''sync / async''' - bei sync bestätigt der Server einen Schreibvorgang erst, wenn die Daten auf der Platte sind. async ist schneller, kann aber bei einem Absturz zu Datenverlust führen. | ||
| + | * '''root_squash''' - der Benutzer root auf dem Client wird auf dem Server zum unprivilegierten Benutzer nobody. Das ist der Standard. | ||
| + | * '''no_root_squash''' - root auf dem Client bleibt root auf dem Server. Wird z.B. für Hypervisor-Storage benötigt. | ||
| + | * '''all_squash''' - alle Benutzer des Clients werden auf einen anonymen Benutzer abgebildet. | ||
| + | * '''no_subtree_check''' - keine Prüfung, ob eine Datei innerhalb der Freigabe liegt. | ||
| − | + | ==Benutzer und Rechte== | |
| − | + | NFSv3 überträgt Benutzer und Gruppen nur als Nummern. Der Server prüft die Dateirechte anhand dieser Nummern. Damit die Rechte stimmen, müssen UID und GID eines Benutzers auf Client und Server gleich sein. In größeren Umgebungen sorgt dafür eine zentrale Benutzerverwaltung, z.B. über LDAP. | |
| − | ''' | + | ==Mount-Verhalten auf dem Client== |
| + | Der Client kann eine Freigabe auf zwei Arten einhängen: | ||
| + | * '''hard''' - ist der Server nicht erreichbar, wartet der Client unbegrenzt und wiederholt die Anfrage. Programme hängen, es gehen aber keine Daten verloren. Das ist der Standard und die richtige Wahl für Daten und VM-Images. | ||
| + | * '''soft''' - nach einer Zeitüberschreitung gibt der Client einen Fehler an das Programm zurück. Bei Schreibzugriffen kann das zu beschädigten Dateien führen. | ||
| − | == | + | ==Unterschiede zu NFSv4== |
{| class="wikitable" | {| class="wikitable" | ||
| − | ! | + | ! Merkmal !! NFSv3 !! NFSv4 |
|- | |- | ||
| − | | | + | | Zustand || zustandslos || zustandsbehaftet |
|- | |- | ||
| − | | | + | | Ports || 111, 2049 und mehrere wechselnde || nur 2049 |
|- | |- | ||
| − | | | + | | Locking || separates Protokoll || im Protokoll integriert |
|- | |- | ||
| − | | | + | | Authentifizierung || UID/GID || UID/GID oder Kerberos |
|- | |- | ||
| − | | | + | | Benutzerzuordnung || numerisch || über Namen |
|- | |- | ||
| − | | | + | | Verschlüsselung || keine || mit Kerberos möglich |
|- | |- | ||
| − | | | + | | Firewall || aufwendig || einfach |
| − | | | ||
| − | | | ||
|} | |} | ||
| − | == | + | ==Einsatz als Storage für Proxmox VE== |
| − | + | Proxmox VE kann NFS-Freigaben als gemeinsamen Speicher für alle Knoten eines Clusters nutzen. Darauf lassen sich VM-Images, ISO-Dateien, Container-Vorlagen und Backups ablegen. Weil alle Knoten auf dieselben Images zugreifen, ist eine Live-Migration von VMs ohne Kopieren der Festplatten möglich. | |
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | + | Da Proxmox die Images als root anlegt und bearbeitet, wird die Freigabe in der Regel mit no_root_squash eingerichtet. Die NFS-Version lässt sich beim Einbinden in Proxmox festlegen. | |
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
==Sicherheit== | ==Sicherheit== | ||
| − | * NFSv3 | + | * NFSv3 überträgt alle Daten '''unverschlüsselt'''. |
| − | * | + | * Der Zugriff wird nur über die IP-Adresse des Clients geregelt. Wer root auf einem berechtigten Client ist, kann jede beliebige UID annehmen und damit auf alle Dateien dieses Benutzers zugreifen. |
| − | * no_root_squash nur dort | + | * no_root_squash sollte nur dort verwendet werden, wo es nötig ist, und nur für einzelne Hosts oder ein eigenes Storage-Netz. |
| − | * NFS gehört in ein eigenes, abgeschottetes Netz | + | * NFS gehört in ein eigenes, abgeschottetes Netz oder VLAN und darf nie aus dem Internet erreichbar sein. |
| − | * | + | * Werden Verschlüsselung oder eine echte Benutzerauthentifizierung benötigt, ist NFSv4 mit Kerberos die richtige Wahl. |
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
Aktuelle Version vom 13. Oktober 2026, 10:44 Uhr
NFS Server Version 3
Allgemeines
NFS (Network File System) ist ein Protokoll, mit dem ein Server Verzeichnisse über das Netz freigibt. Clients hängen diese Freigaben ein und arbeiten damit wie mit einem lokalen Dateisystem. NFS wurde ursprünglich von Sun Microsystems entwickelt und ist im Unix- und Linux-Umfeld der Standard für Dateifreigaben.
NFS Version 3 wurde 1995 veröffentlicht (RFC 1813). Obwohl es mit NFSv4 längst einen Nachfolger gibt, ist Version 3 weiterhin weit verbreitet, vor allem als Storage für Virtualisierungsplattformen wie Proxmox VE oder VMware und auf vielen NAS-Systemen. Gründe dafür sind die einfache Einrichtung, die hohe Robustheit und die breite Unterstützung.
Eigenschaften
- Zustandslos - der Server merkt sich nicht, welche Clients welche Dateien geöffnet haben. Jede Anfrage enthält alle nötigen Informationen. Startet der Server neu, arbeiten die Clients einfach weiter, als wäre nichts gewesen.
- Basiert auf RPC - NFS nutzt Remote Procedure Calls. Die Funktionen sind auf mehrere einzelne Dienste verteilt.
- Locking ist ausgelagert - Dateisperren sind nicht Teil von NFSv3, sondern laufen über ein eigenes Protokoll, den Network Lock Manager.
- TCP und UDP - beide Transportprotokolle sind möglich, heute wird praktisch nur noch TCP verwendet.
- Authentifizierung über Benutzer- und Gruppennummern - der Server vertraut den UID- und GID-Werten, die der Client mitschickt. Eine echte Anmeldung von Benutzern gibt es nicht.
- Große Dateien und asynchrones Schreiben - gegenüber NFSv2 brachte Version 3 64-Bit-Dateigrößen und die Möglichkeit, Schreibvorgänge zu puffern und später gesammelt zu bestätigen.
Beteiligte Dienste
Ein NFSv3-Server besteht aus mehreren Diensten, die zusammenarbeiten:
| Dienst | Aufgabe |
|---|---|
| rpcbind (Portmapper) | Läuft auf dem festen Port 111 und teilt Clients mit, auf welchem Port welcher RPC-Dienst erreichbar ist |
| nfsd | Der eigentliche NFS-Dienst auf Port 2049, zuständig für Lesen, Schreiben und Verzeichniszugriffe |
| mountd | Nimmt Mount-Anfragen entgegen und prüft, ob der Client die Freigabe nutzen darf |
| lockd | Verwaltet Dateisperren (Network Lock Manager) |
| statd | Benachrichtigt Server und Clients nach einem Neustart, damit Sperren wiederhergestellt oder freigegeben werden |
| rquotad | Liefert Quota-Informationen an die Clients (optional) |
Bis auf rpcbind und nfsd benutzen diese Dienste standardmäßig wechselnde Ports. Das macht NFSv3 hinter einer Firewall unhandlich. In der Praxis legt man die Ports deshalb fest.
Ablauf beim Einhängen
- Der Client fragt rpcbind auf dem Server, auf welchem Port mountd läuft.
- Der Client meldet sich bei mountd und fordert die gewünschte Freigabe an.
- mountd prüft die Berechtigung und gibt ein Filehandle für das Wurzelverzeichnis der Freigabe zurück.
- Ab jetzt spricht der Client direkt mit nfsd und benutzt Filehandles, um Dateien und Verzeichnisse anzusprechen.
Filehandles
Ein NFS-Client spricht Dateien nicht über Pfade an, sondern über Filehandles. Ein Filehandle ist eine Kennung, die im Wesentlichen das Dateisystem und die Inode-Nummer der Datei enthält. Der Server sieht bei einer Anfrage also nicht den Pfad, sondern nur, welche Inode auf welchem Dateisystem gemeint ist.
Daraus ergibt sich eine Besonderheit: Wird nur ein Unterverzeichnis eines Dateisystems freigegeben, liegen auf demselben Dateisystem auch Dateien außerhalb der Freigabe. Mit der Option subtree_check prüft der Server bei jedem Zugriff, ob die Datei tatsächlich innerhalb der Freigabe liegt. Diese Prüfung kostet Leistung und führt zu Fehlern, wenn geöffnete Dateien umbenannt oder verschoben werden. Heute ist deshalb no_subtree_check der Standard. Die saubere Lösung ist, für jede Freigabe ein eigenes Dateisystem zu verwenden.
Freigaben
Welche Verzeichnisse freigegeben werden, ist auf dem Server in der Datei /etc/exports festgelegt. Für jedes Verzeichnis wird angegeben, welche Rechner oder Netze darauf zugreifen dürfen und mit welchen Optionen.
Wichtige Optionen sind:
- rw / ro - Lesen und Schreiben oder nur Lesen.
- sync / async - bei sync bestätigt der Server einen Schreibvorgang erst, wenn die Daten auf der Platte sind. async ist schneller, kann aber bei einem Absturz zu Datenverlust führen.
- root_squash - der Benutzer root auf dem Client wird auf dem Server zum unprivilegierten Benutzer nobody. Das ist der Standard.
- no_root_squash - root auf dem Client bleibt root auf dem Server. Wird z.B. für Hypervisor-Storage benötigt.
- all_squash - alle Benutzer des Clients werden auf einen anonymen Benutzer abgebildet.
- no_subtree_check - keine Prüfung, ob eine Datei innerhalb der Freigabe liegt.
Benutzer und Rechte
NFSv3 überträgt Benutzer und Gruppen nur als Nummern. Der Server prüft die Dateirechte anhand dieser Nummern. Damit die Rechte stimmen, müssen UID und GID eines Benutzers auf Client und Server gleich sein. In größeren Umgebungen sorgt dafür eine zentrale Benutzerverwaltung, z.B. über LDAP.
Mount-Verhalten auf dem Client
Der Client kann eine Freigabe auf zwei Arten einhängen:
- hard - ist der Server nicht erreichbar, wartet der Client unbegrenzt und wiederholt die Anfrage. Programme hängen, es gehen aber keine Daten verloren. Das ist der Standard und die richtige Wahl für Daten und VM-Images.
- soft - nach einer Zeitüberschreitung gibt der Client einen Fehler an das Programm zurück. Bei Schreibzugriffen kann das zu beschädigten Dateien führen.
Unterschiede zu NFSv4
| Merkmal | NFSv3 | NFSv4 |
|---|---|---|
| Zustand | zustandslos | zustandsbehaftet |
| Ports | 111, 2049 und mehrere wechselnde | nur 2049 |
| Locking | separates Protokoll | im Protokoll integriert |
| Authentifizierung | UID/GID | UID/GID oder Kerberos |
| Benutzerzuordnung | numerisch | über Namen |
| Verschlüsselung | keine | mit Kerberos möglich |
| Firewall | aufwendig | einfach |
Einsatz als Storage für Proxmox VE
Proxmox VE kann NFS-Freigaben als gemeinsamen Speicher für alle Knoten eines Clusters nutzen. Darauf lassen sich VM-Images, ISO-Dateien, Container-Vorlagen und Backups ablegen. Weil alle Knoten auf dieselben Images zugreifen, ist eine Live-Migration von VMs ohne Kopieren der Festplatten möglich.
Da Proxmox die Images als root anlegt und bearbeitet, wird die Freigabe in der Regel mit no_root_squash eingerichtet. Die NFS-Version lässt sich beim Einbinden in Proxmox festlegen.
Sicherheit
- NFSv3 überträgt alle Daten unverschlüsselt.
- Der Zugriff wird nur über die IP-Adresse des Clients geregelt. Wer root auf einem berechtigten Client ist, kann jede beliebige UID annehmen und damit auf alle Dateien dieses Benutzers zugreifen.
- no_root_squash sollte nur dort verwendet werden, wo es nötig ist, und nur für einzelne Hosts oder ein eigenes Storage-Netz.
- NFS gehört in ein eigenes, abgeschottetes Netz oder VLAN und darf nie aus dem Internet erreichbar sein.
- Werden Verschlüsselung oder eine echte Benutzerauthentifizierung benötigt, ist NFSv4 mit Kerberos die richtige Wahl.