Systemy uniksowe potrafią współdzielić się zasobami dyskowymi z platformą Windows za pomocą usługi Samba. Jednak posiadają również własny protokół do wymiany plików i katalogów jakim jest Network File System (NFS). W porównaniu do SMB jest on natywnym rozwiązaniem dla systemów Unix. W systemie Linux NFS jest zaimplementowany jako moduł jądra, tak samo jak każdy lokalny system plików. Ponadto NFS od początku był zaprojektowany jako rozwiązanie łatwe do przeniesienia na inne platformy systemowe. Pierwsza wersja NFS powstała już w 1984 roku, a w tamtych czasach rozwiązaniem oferującym taką funkcjonalność był protokół RPC (Remote Procedure Call), który pozwalał na zdalne wywoływanie funkcji. Przez wiele lat NFS został znacznie zmodyfikowany oferując coraz to nowsze możliwości. Obecnie rozwijaną wersją jest NFSv4 i to właśnie nią będziemy tu omawiać.

NFS jest prostszy w konfiguracji niż SMB i zużywa mniej zasobów. Choć można go montować również w systemie Windows to najlepiej sprawdza się w środowisku uniksowym. Ponieważ NFS nie oferuje żadnego szyfrowania, to nie zaleca się jego używania poprzez publiczną sieć. Oczywiści można to obejść chociażby przez szyfrowany tunel VPN.

Instalację i konfigurację NFS omówimy na przykładzie najpopularniejszych dystrybucji systemu Linux i FreeBSD. Zaczniemy do dystrybucji Debian 9, której konfiguracja będzie taka sama jak Ubuntu 18.04.

Serwer NFS w Debianie i Ubuntu

Instalacja serwera NFS sprowadza się do zainstalowania poniższej paczki. W przypadku Ubuntu należy zrobić to przez sudo.

# apt install nfs-kernel-server

Wynikiem powyższego polecenia będzie zainstalowanie modułu jądra dla NFS oraz parę paczek powiązanych, w tym paczka kliencka nfs-common.

Dla wersji starszych niż 4 NFS pracował na kliku portach. Usługa rpcbind nasłuchiwała na porcie 111 TCP i UDP, natomiast rpc.mountd na losowych portach. W przypadku NFSv4 wykorzystywany jest tylko port 2049 TCP lub UDP.

Załóżmy, że chcemy wyeksportować katalog /srv/backup1 dla hosta z adresem IP 172.16.16.104. Zasób będzie do zapisu i odczytu, a uprawnienia będą mapowane na konto root (UID 0).

# cat /etc/exports

/srv/backup1           172.16.16.104(rw,sync,subtree_check,all_squash,anonuid=0,anongid=0)

Po dokonaniu zmian w pliku /etc/exports należy go przeładować poniższa komendą.

# exportfs -ra

Obecnie exportowane zasoby możemy sprawdzić w poniższy sposób.

# exportfs -s

Klient NFS w Debianie i Ubuntu

Po stronie klienta wystarczy zainstalować tylko jedną paczkę.

# apt install nfs-common

Następnie pozostaje wybór sposobu zamontowaniua zdalengo zasobu. Możemy zrobić to manualnie za pomocą komendy mount. W tym przypadku serwer NFS przez DNS zdefinionany jest jak storage1.

# mount.nfs4 storage1:/srv/backup1 /mnt/backup1/

# df -hT -F nfs4

Filesystem            Type  Size  Used Avail Use% Mounted on

storage1:/srv/backup1 nfs4   57G  9.0G   45G  17% /mnt/backup1

Możemy również dodać powyższy zasób w /etc/fstab, dzięki czemu będzie on montowany podczas startu systemu lub po wydaniu komendy mount /mnt/backup1/. W tym celu musimy dodać poniższy wpis.

# cat /etc/fstab

storage1:/srv/backup1 /mnt/backup1 nfs4 rw,vers=4.2,proto=tcp 0 1

Wyłączenie starszych wersji NFS w Debianie i Ubuntu

Jak już wspominaliśmy domyślnie serwer NFS obsługuje również starsze wersje. Ponieważ ich obsługa wymagała otwarcia większej ilości portów być może zechcemy je wyłaczyć skoro nie będziemy z nich korzystać. Pokażemy jak można tego dokonac na przykładzie systemu Debian.

Po skonfigurowaniu serwera NFS w poniższym pliku należy dokonać poniższych zmian:

# cat /etc/default/nfs-kernel-server

# add

RPCNFSDOPTS=”-N 2 -N 3″

NEED_STATD=”no”

NEED_IDMAPD=”yes”

# change

# RPCMOUNTDOPTS=”–manage-gids”

RPCMOUNTDOPTS=”–manage-gids -N 2 -N 3″

Następnie możemy wyłaczyć nieużywane procesy.

# systemctl mask rpcbind.service

Created symlink /etc/systemd/system/rpcbind.service → /dev/null.

# systemctl mask rpcbind.socket

Created symlink /etc/systemd/system/rpcbind.socket → /dev/null.

# systemctl stop rpcbind.service

Po zresetowaniu usługi serwera NFS serwer będzie nasłuchiwał tylko na porcie 2049 i obsługiwał tylko protokółw NFSv4.

# systemctl restart nfs-idmapd.service
# systemctl restart nfs-kernel-server.service

Serwer NFS w CentOS 7

W przypadku systemu CentOS instalujemy jedną pczkę, która odpowiada jednocześnie za serwer i klienta.

# yum install nfs-utils

Eksportowane zasoby definiujemy w ten sam sposób.

# cat /etc/exports

/srv/share1           172.16.16.104(rw,sync,subtree_check,all_squash,anonuid=0,anongid=0)

Następnie pozostaje uruchomić usługę serwera NFS.

# systemctl enable nfs-server

Created symlink from /etc/systemd/system/multi-user.target.wants/nfs-server.service to /usr/lib/systemd/system/nfs-server.service.

# systemctl start nfs-server

Ponieważ CentOS 7 domyślnie instalowany jest z predefiniowana zaporą to musimy dodać do niej wyjątek dla usługi NFS.

# firewall-cmd –add-service=nfs –zone=public –permanent

# firewall-cmd –reload

Połączenia klienckie z systemu CentOS wykonuje się w ten sam sposób jak w przypadku Debiana i innego systemu GNU/Linux.

Wyłączenie starszych wersji NFS w CentOS 7

W pliku /etc/sysconfig/nfs musimy dodać poniższe opcje:

# grep „\-N 3” /etc/sysconfig/nfs

RPCNFSDARGS=”-N 2 -N 3″

RPCMOUNTDOPTS=”-N 2 -N 3″

Następnie wyłączyć zbędne usługi i włączyć tylko te niezbędne.

# systemctl stop {rpcbind,rpc-statd,nfs-mountd,nfs-server}.service

# systemctl stop rpcbind.socket

# systemctl disable rpcbind.service

# systemctl mask rpcbind.service

# systemctl start nfs-server.service

Serwer NFS we FreeBSD 12

W przypadku FreeBSD nie musimy niczego instalować. Należy dodać do pliku konfiguracyjnego za pomocą narzędzia sysrc następujące opcje:

# sysrc nfs_server_enable=”YES”

# sysrc nfsv4_server_enable=”YES”

# sysrc nfsuserd_enable=YES

Z kolei definicja eksportowanych zasobów we FreeBSD wygląda inaczej niż w systemach Linux. Co więcej FreeBSD uruchamia serwer NFS jak demon a nie jak proces jądra.

# cat /etc/exports

V4: / 172.16.16.104

/usr/local/srv/share2 -maproot=root: 172.16.16.104

Pierwszy wiersz definiuje tylko gdzie będzie zaczynać się drzewo udostępniane przez wersje NFSv4. Wybraliśmy główny katalog systemu, al to nie oznacza, iż został on weksportowany. O tym decyfuje drugi wiersz.

Po zdefiniowanu eksportowanych zasobów pozostaje uruchomienie usługi NFS.

# service nfsd start

Jeżeli dokonamy zmian w pliku /etc/exports to należy przeładować usługe mountd aby zmiany zostały uwzględnione.

# service mountd restart

Klient NFS we FreeBSD 12

Uruchomienia klienta jest dość proste, wystarczy właczyć odpowiednią opcję systemu:

# sysrc nfs_client_enable=”YES”

Teraz można już zamontować zdalny zasób w poniższy sposób.

# mount_nfs -o nfsv4 db1:/usr/local/srv/share2 /mnt/share2

# nfsstat -m

db1:/usr/local/srv/share2 on /mnt/share2

nfsv4,…

Wyłączenie starszych wersji NFS we FreeBSD 12

Poniższe polecenie ustawia najniższą akceptowaną wersję serwera na NFSv4, następnie zapisuje to ustawienie w pliku konfiguracyjnym na stałe.

# sysctl vfs.nfsd.server_min_nfsvers=4

# echo „sysctl vfs.nfsd.server_min_nfsvers=4” >> /etc/sysctl.conf

Jednak rozwiązanie to nie wyłącza demonów nasłuchujących na pozostałych portach. Możemy to zrobić ręcznie ale każde uruchomienie usługi nfsd spowoduje ponowne ich uruchomienie.

# service rpcbind stop

# service mountd stop

Podsumowanie

Pomimo swojego wieku i prostoty NFS zdobył pozycję standardu w środowiskach Uniksowych. Jest jednym z popularniejszych typów woluminów w klastrach Kubernetes jako system plików dla lokalnej sieci kontenrów. Spotkamy się również z nim w przypadku wielu urządzeń typu NAS, gdzie będzie jednym ze standardów wymiany plików. NFS oferuje również mechanizm ACL, który pozwala kontrolować dostęp do samych plików. Natomiast brak szyfrowania możemy rozwiązać prowadząc komunikację poprzez szyfrowane łącza, takie jak IPSec.

  • Grzegorz Kuczyński zawodowo zajmuje się informatyką. Jest członkiem społeczności open source, prowadzi blog nt. systemu GNU/Linux.