Netzwerkdateisystem NFS

Aus LinuxUser 12/2006

Netzwerkdateisystem NFS

Einfacher Versand

Wenn mehrere Linux- oder Unix-Rechner via Netzwerk Daten tauschen sollen, gelingt das am einfachsten mit NFS.

Nach dem Neukauf eines PCs bleibt meist ein älteres Modell mehr oder weniger verwaist zurück. Das eignet sich in der Regel hervorragend, dem Heimnetz als Dateiserver zu dienen. Das von Sun bereits 1985 in der Version 2 veröffentlichte, mittlerweile von der IETF weiterentwickelte Netzwerkdateisystem NFS (Network File System) arbeitet nach dem Client/Server-Prinzip: Ein Server stellt Speicherplatz für die Clients bereit, die diesen ins lokale Dateisystem einhängen.

NFS v3 und v4

Im Linux-Umfeld ist Version 3 des NFS-Protokolls mittlerweile Standard. Die Folgeversion 4 unterstützt erstmals von Haus aus sowohl Benutzerauthentifizierung als auch Verschlüsselung. Der NFSv4-Support in Kernel, Userspace-Programmen und Distributionen ist jedoch mitunter noch experimentell, die Konfiguration komplizierter. Daher und aus Platzgründen befasst sich der Artikel mit der erprobten Version 3. Hinweise zu NFSv4 gibt der Grundlagen-Artikel von Thorsten Scherf in einem Sonderheft unserer Schwesterzeitschrift Linux-Magazin [1]. Ausführliche Grundlagen liefert auch die Linux-Fibel ([2],[3]).

Die Entwickler bei Sun implementierten NFS mit Hilfe entfernter Funktionsaufrufe (RPC)[4]. Server und Client kommunizieren mit Hilfe von IP-Adresse und Port miteinander. NFS setzt sich aus mehreren RPC-basierten Diensten zusammen, die als einzelne Daemons laufen. Ein Dienst namens Portmapper verwaltet die Portnummern der laufenden RPC-Dienste, um zusätzlichen Konfigurationsaufwand durch die statische Vergabe von Portnummern zu vermeiden. Dieser Dienst lauscht auf dem Port 111.

Die Aufgabe eines NFS-Servers teilen sich der NFS-Daemon (rpc.nfsd), der auf Port 2049 lauscht und IO-Anfragen bearbeitet, sowie der Mount-Daemon (rpc.mountd), der beim Einhängen eines Dateisystems hilfreich zur Seite steht. Die weiteren Dienste Network Lock Manager (rpc.lockd) und Network Status Monitor (rpc.statd) handhaben Dateisperren. Zudem gibt es einen Quota-Dienst (rpc.rquotad im Paket quota).

Den eigentlichen NFS-Dienst gibt es in zwei Ausführungen: Als Kernel-Treiber oder als reines Userspace-Programm. Durchgesetzt hat sich der schnellere NFS-Kernel-Server. Der Userspace-Server unterstützt weder Dateien größer 2 GByte noch die genannten Dienste für Dateisperren.

Ping-Pong

Möchte ein Client ein entferntes Verzeichnis mounten, fragt er den Portmapper auf dem Server nach dem Port des Mount-Daemons. Der Portmapper liefert den Port und der Client schickt dem Mount-Daemon eine Mount-Anfrage. Dieser prüft, ob es den Export gibt und der Client die notwendigen Rechte besitzt, diesen zu mounten. Dabei prüft NFS v3 von Haus aus nur, ob die Liste der erlaubten IP-Adressen und Netzwerkbereiche auch die IP-Adresse des Clients enthält.

Ist der Client berechtigt, fragt der Mount-Daemon den NFS-Daemon nach dem Dateihandle für das entsprechende Verzeichnis. Der Mount-Daemon liefert das Handle, das der Client dann für weitere Anfragen verwendet, wie etwas das Auflisten von Verzeichnissen. Für jedes weitere Verzeichnis und jede weitere Datei, die er öffnet, enthält er vom Server ein zusätzliches Dateihandle.

NFS einrichten

Die Konfiguration eines NFS-v3-Servers fällt bei den gängigen Distributionen erfreulich leicht. Sie installieren die Pakete portmap und nfs-utils sowie – falls Sie Suse verwenden – yast-nfs-server und yast-nfs-client. Als Debian- oder Ubuntu-Anwender richten Sie die Pakete nfs-common und nfs-kernel-server ein.

Die Distributionskernel kommen in der Regel mit vollständigen NFS-v3-Support daher. Kompilieren Sie Ihren eigenen Kernel, so aktivieren Sie unter Filesystems | Network File Systems die entsprechenden Optionen (Abbildung 1).

Abbildung 1: Beim Übersetzen eigener Kernle aktivieren Sie für NFS die Optionen <code srcset=

NFS server support für den Server und NFS file system support für den Client.” width=”300″ height=”187″ /> Abbildung 1: Beim Übersetzen eigener Kernle aktivieren Sie für NFS die Optionen NFS server support für den Server und NFS file system support für den Client.

Gängige Distributionen starten die für NFS benötigten Dienste und Kernel-Module über Init-Skripte. Bei Debian heißen diese nfs-kernel-server und portmap, bei Suse nfs-utils und portmap. Unter Suse aktivieren Sie den Dienst am besten mit YaST unter Netzwerkdienste | NFS-Server und schalten ihn dabei auch gleich in der Personal Firewall frei (Abbildung 2). Debian und Ubuntu aktivieren die Dienste nach der Installation automatisch. Von Hand starten Sie sie durch Aufruf des Init-Skriptes: /etc/init.d/nfs-kernel-server start. Mit rpcinfo -p von portmap erhalten Sie eine Liste, welche Dienste auf welchen Ports laufen.

Abbildung 2: YaST bietet beim Starten des NFS-Servers praktischerweise gleich mit an, in der Firewall den passenden Port für den Dienst zu öffnen.

Abbildung 2: YaST bietet beim Starten des NFS-Servers praktischerweise gleich mit an, in der Firewall den passenden Port für den Dienst zu öffnen.

Für den Client brauchen Sie einen Kernel mit NFS filesystem support (siehe Abbildung 1). Der Befehl cat /proc/filesystems | grep nfs zeigt die Verfügbarkeit des Dateisystems, modprobe nfs lädt es gegebenenfalls nach. Installieren Sie zudem für Ubuntu oder Debian das Paket nfs-common und für Suse nfs-utils.

Exportieren, importieren

Für den ersten Test exportieren Sie mit dem Befehl exportfs -o rw,sync 192.168.1.0/8:/tmp das Verzeichnis /tmp an alle Clients im Netzwerk 192.168.1.0/24 für Lese- und Schreibzugriff (siehe Tabelle “Export-Optionen”).

TIPP

Vermeiden Sie, Dateisysteme wie FAT zu exportieren, die keine stabilen Inode-Nummern zur Verfügung stellen. Mit Ext2/3, ReiserFS und JFS sollte es keine Probleme geben.

Export-Optionen

Export-Option Bedeutung
ro Verzeichnis nur mit Lesezugriff exportieren
rw Verzeichnis lesend und schreibend exportieren
sync Synchrone Schreibvorgänge. Der Client wartet, bis der Schreibvorgang beendet ist. Langsamer, mit NFS v2 sicherer und empfohlen.
async Asynchrone Schreibvorgänge. Erlaubt das Zwischenspeichern von zu schreibenden Daten bei Client und Server. Unsicherer mit NFS v2, ab NFS v3 nicht mehr nötig.
root_squash Setzt root auf den nicht priviligierten Benutzer @TL:nobody mit der Gruppe nobody um. Empfohlen und Standard.
no_root_squash Erlaubt root vollen Zugriff mit Root-Rechten.
subtree_check Überprüft, ob ein Dateihandle wirklich innerhalb des exportierten Verzeichnisses liegt. Sicherer, jedoch auch fehleranfällig.
no_subtree_check Keine diesbezügliche Überprüfung. Empfohlen und Standard ab nfs-utils 1.10[5].

Auf dem Client zeigt der Befehl showmount -e NFS-Server eine Liste der Exports. Mit mount -o intr NFS-Server:/tmp /mnt/nfs mounten Sie auf dem Client den Export /tmp des Servers NFS-Server im Verzeichnis /mnt/nfs mit der Option intr (siehe Tabelle “Mount-Optionen”). Geben Sie keine Optionen für das Einhängen an, so wählt Linux sinnvolle Vorgaben, die Sie nach dem Mounten mit cat /proc/mounts anzeigen.

Mit umount /mnt/nfs melden Sie das Dateisystem wieder ab, und mit exportfs -u 192.168.1.0/24:/tmp beenden Sie auf dem Server den Export.

Mount-Optionen

Mount-Option Bedeutung
intr Unterbrechung von NFS-Vorgängen mit [Strg]+[C] erlauben
hard NFS-Clients warten bei unterbrochener Netzwerkverbindung oder Servercrash auf erneute Verbindung. Standard.
soft NFS-Clients brechen bei unterbrochener Netzwerkverbindung nach einer eingestellten Zeit ab (timeo-Option). Bei UDP nicht empfehlenswert wegen erhöhtem Risiko von Datenverlusten bei Verbindungsabbrüchen.
rsize, wsize Puffergröße fürs Lesen und Schreiben (in Bytes). Schneller geht es bei aktuellen Netzwerk-Karten mit 8192 Bytes [6].

Exporte automatisieren

Es ist umständlich, Verzeichnisse jedes Mal von Hand zu exportieren und zu mounten. Tragen Sie Exports daher in /etc/exports ein (oder verwenden Sie YaST). Der Aufbau der Exports-Datei folgt dem Muster VerzeichnisHostoderNetz(Export-Optionen)HostoderNetz(Export-Optionen) … (siehe Listing 1). Mit exportfs -ra informieren Sie den Server über angefallenene Änderungen.

Listing 1

# /etc/exports auf Server deepdance
#
# Verzeichnis für einen einzelnen Host
/srv/deepdance  deepdance(rw,sync,no_subtree_check)
# Austausch-Verzeichnis
/srv/tausch     192.168.1.0/24(rw,sync,no_subtree_check) 127.0.0.0/8(rw,sync,no_subtree_check)
# Nur-Lesen-Verzeichnis
/srv/lesen      192.168.1.0/24(ro,sync,no_subtree_check) *.local(ro,sync,no_subtree_check)

Der NFS-Kernel-Server setzt die Rechte zwischen Client und Server anhand der numerischen Benutzer- und Gruppen-ID eins zu eins um. Das auf dem Server exportierte Verzeichnis muss für den Benutzer auf dem Client beschreibbar sein, wenn Sie Dateien speichern und Verzeichnisse anlegen möchten.

Arbeiten Sie mit mehreren Benutzern und Gruppen gleichen Namens auf unterschiedlichen Maschinen, sollten diese jeweils die gleiche Benutzer- und Gruppen-ID haben. Für Gruppenverzeichnisse eignet sich das setgid-Recht (s) [7]. Für Root wählt NFS standardmäßig den Benutzer und die Gruppe nobody, um den direkten Root-Zugriff auf den NFS-Server zu vermeiden (root_squash).

Auf der Client-Seite bietet /etc/fstab die Möglichkeit zur NFS-Automatisierung [8]: In der ersten Spalte der Datei steht der Export, in der zweiten das lokale Verzeichnis, in Spalte 3 als Dateisystem nfs, in Spalte 4 die gewünschten Mount-Optionen und in den nächsten beiden Spalten jeweils “0”, da weder ein etwaiges Backup via dump noch ein Dateisystemcheck auf dem Client Sinn machen (siehe Listing 2). Eine grafische Oberfläche zu Einrichtung bietet YaST unter Netzwerkdienste | NFS-Client.

Listing 2

# /etc/fstab
…
### NFS-Importe von deepdance
# NFS zu Haus
deepdance:/srv/tausch  /mnt/nfs-tausch  nfs  user,noauto,intr,rsize=8192,wsize=8192  0 0
# Nur lesen
deepdance:/srv/lesen   /mnt/nfs-lesen   nfs  user,noauto,intr,rsize=8192,wsize=8192  0 0
# Beispiel für Homeverzeichnisse
#deepdance:/srv/homes  /home            nfs  intr,rsize=8192,wsize=8192              0 0
…

Und die Sicherheit?

Die Entwickler von NFS hatten zentrale, geschützte Netzwerke im Sinn. NFS v3 bietet daher von Haus kaum Sicherheitsfeatures. So erlaubt das Erraten des passenden Dateihandles einem NFS-Client, auf Dateien von Exports zuzugreifen, die auf dem Client gar nicht gemountet sind. Sie vermeiden dies mit dem fehleranfälligen subtree_check[5] – oder indem Sie jeden Export auf ein eigenes lokales Dateisystem legen.

Verwenden Sie daher NFS v3 von vorneherein nur in durch Firewalls geschützten lokalen Netzen und sperren Sie externe Zugriffe auf NFS-Ports. Am einfachsten ist es, aus dem Internet nur Pakete zuzulassen, die Antworten auf ausgehende Verbindungen darstellen. Das sollte heutzutage die Standard-Konfiguration der meisten DSL-Router sein. Auch Iptables bietet mit dem Connection Tracker eine entsprechende Möglichkeit ([9],[10]).

Andere Ansätze basieren darauf, die RPC-Dienste für NFS mit festen Ports laufen und Pakete an diese Ports ausfiltern zu lassen ([11],[12]). Läuft NFS wie bei NFSv3 standardmäßig mit TCP, sperren Sie zumindest den TCP-Port 2049 sowie den TCP- und UDP-Port 111 des Portmappers für Zugriffe von außen. Die Personal Firewall von Suse kennt nur ein “Ganz oder gar nicht” und eignet sich nicht für Router, da sie nur den lokalen Host schützt.

Steht Ihnen keine Firewall zur Verfügung, bringt das Einschränken der Dienste via TCP-Wrapper ein wenig zusätzliche Sicherheit. Dazu sperren Sie diese Dienste erst einmal über die Datei /etc/hosts.deny global und geben Sie dann für das lokale Netzwerk über /etc/hosts.allow wieder frei (siehe Listings 3 und 4).

Listing 3

# /etc/hosts.deny
…
# Alle für NFS notwendigen
# Dienste global sperren
portmap    : ALL
mountd     : ALL
lockd      : ALL
statd      : ALL
rquotad    : ALL
…

Listing 4

# /etc/hosts.allow
…
# Alle für NFS notwendigen Dienste
# für lokales Netzwerk freigeben
portmap    : 192.168.1.0/24
mountd     : 192.168.1.0/24
lockd      : 192.168.1.0/24
statd      : 192.168.1.0/24
rquotad    : 192.168.1.0/24
…

Dies macht bei den Diensten lockd und statd auch für die NFS-Clients Sinn. Prüfen Sie, ob der jeweilige Dienst mittels TCP-Wrapper geschützt ist. Liefert zum Beispiel strings /sbin/portmap | grep hosts mindestens hosts_ctl zurück, sollte es klappen. Der Befehl rpcinfo -p NFS-Server teilt bei fehlender Berechtigung dann schlicht mit, keine entfernten Programme gefunden zu haben. Mit Debian Sarge und Suse 10.1 funktionierte es, mit der aktuellen Ausgabe von Debian Testing (Etch) und portmap 5-21 hingegen nicht.

Der Autor

Martin Steigerwald arbeitet als Systemadministrator mit Schwerpunkt Second Level Support für Linux als Business-Desktop. Er hat Linux schon vor Jahren auf seinem Amiga 4000 installiert und nutzt es auch privat.

Glossar

IETF

Internet Engineering Task Force. Organisation, die sich mit der Entwicklung und Standardisierung von Internetprotokollen befasst.

Userspace

Unprivilegierterer Bereich, in dem Benutzer-Anwendungen laufen. Kernel-Module und Prozesse laufen hingegen im Kernelspace.

RPC

Remote Procedure Call. System, um auf einen anderen Computer eine Funktion aufzurufen, ohne dass sich der Programmierer mit den Details der Netzwerkkommunikation befassen muss.

Daemons

Programme, die im Hintergrund arbeiten und einen Dienst anbieten.

Port

Nummer zwischen 0 und 65535, die dazu dient, Pakete den richtigen Diensten oder Clients zuzuordnen.

Export

Im NFS-Jargon ein freigegebenes Verzeichnis.

Dateihandle

Im NFS-Kontext eine eindeutige Kennung aus der Inode-Nummer eines Verzeichniseintrags und der Gerätenummer der Partition.

Inode

Struktur mit Verwaltungsinformationen zu einem Dateisystem-Eintrag wie ein Verzeichnis oder eine Datei.

Iptables

Leistungsfähiger Paketfilter für den Linux-Kernel.

Infos

[1] NFS-Grundlagen: Thorsten Scherf, “Speicher mit Anschluss”, Linux-Magazin Sonderheft 4/2006, S. 58

[2] Linux-Fibel, Netzwerkserver – NFS-Server: http://www.de.linwiki.org/index.php/Linuxfibel_-_Netzwerk_Server_-_NFS_Server

[3] Linux-Fibel, Netzwerkclients – NFS-Clients: http://www.de.linwiki.org/index.php/Linuxfibel_-_Netzwerk_Clients_-_NFS_Clients

[4] Linux-Fibel, Netzwerk Grundlagen – RPC: http://www.de.linwiki.org/index.php/Linuxfibel_-_Netzwerk_Grundlagen_-_Remote_Procedure_Call

[5] Linux NFS FAQ zu Subtree-Checking: http://nfs.sourceforge.net/#faq_c7

[6] Linux NFS Howto, Optimize Transfer Speeds: http://nfs.sourceforge.net/nfs-howto/ar01s05.html#block_size

[7] Rechteverwaltung: Heike Jurzik, “Gleiches Recht für alle?”, LinuxUser 07/2004, S. 69, http://www.linux-user.de/ausgabe/2004/07/069-zubefehl/

[8] Fstab: Heike Jurzik, “Ganz schön anhänglich”, LinuxUser 05/2006, S. 94,http://www.linux-user.de/ausgabe/2006/05/094-zubefehl/

[9] Rechner absichern: Ralf Spenneberg, “Vorsorge ist besser”, LinuxUser 05/2004, S. 27, http://www.linux-user.de/ausgabe/2004/05/027-abdichten/

[10] Verbindungen überwachen: Marc André Selig, “Private Feuerwände”, Linux User 05/2002, S. 30, Kasten 2, http://www.linux-user.de/ausgabe/2002/05/030-firewall/firewall-4.html

[11] Linux NFS Howto, Security and NFS: http://nfs.sourceforge.net/nfs-howto/ar01s06.html

[12] Debian Wiki, Securing NFS: http://wiki.debian.org/?SecuringNFS

LinuxUser 12/2006 KAUFEN
EINZELNE AUSGABE
ABONNEMENTS
TABLET & SMARTPHONE APPS
E-Mail Benachrichtigung
Benachrichtige mich zu:

Hinweis: Dieser Artikel ist älter als ein Jahr, enthaltene Informationen sind möglicherweise veraltet.

0 Kommentare
Älteste
Neuste Beste Bewertung
Inline Feedbacks
Alle Kommentare anzeigen
Nach oben