如何使用網絡文件系統NFS
- 網絡文件系統 (NFS)
- 設置基本 NFS 服務器
- Portmap 鎖定(可選)
- 配置 NFS 客戶端
- 端口映射鎖定(可選)
- 配置復雜的 NFS 服務器
- 組權限
- DNS(可選,僅在使用 DNS 時)
- NIS(可選,僅在使用 NIS 時)
- 端口映射鎖定(可選)
- 軟件包安裝和配置
- 重新啟動服務
- 需要考慮的安全事項
- 故障排除
文章來源: http://raspberry.dns8844.cn/documentation
原文網址
網絡文件系統 (NFS)
網絡文件系統 (NFS) 允許您與同一網絡上的其他計算機或設備共享位于一臺聯網計算機上的目錄。目錄所在的計算機稱為 服務器,連接到該服務器的計算機或設備稱為客戶端。客戶端通常通過 mount
共享目錄,使其成為其自身目錄結構的一部分。共享目錄是共享資源或網絡共享的一個示例。
NFS 是在 Linux/Unix 環境中創建簡單 NAS(網絡附加存儲)的流行方法。
NFS 可能最適合更永久的網絡掛載目錄,例如 /home
目錄或經常訪問的共享資源。如果您想要一個來賓用戶可以輕松連接的網絡共享,Samba 更適合這項任務。在各個操作系統中都更容易獲得臨時掛載和分離 Samba 共享的工具。
在部署 NFS 之前,您應該熟悉:
- Linux 文件和目錄權限
- 掛載和卸載文件系統
設置基本 NFS 服務器
使用以下命令安裝所需的軟件包:
$ sudo apt install nfs-kernel-server
為了便于維護,我們將所有 NFS 導出隔離在單個目錄中,并使用 --bind
選項將實際目錄掛載到該目錄中。
假設我們要導出用戶的主目錄,這些目錄位于 /home/users
中。首先,我們創建導出文件系統:
$ sudo mkdir -p /export/users
TIP: 如果您計劃配置 LDAP/NIS 身份驗證,請跳過下面的 chmod
步驟。
授予 /export
和 /export/users
讀取、寫入和執行權限 ( 777
),以便您可以從客戶端訪問 NFS 共享,而無需 LDAP/NIS 身份驗證:
$ chmod -R 777 /export
接下來,使用以下命令掛載真正的 users
目錄:
$ sudo mount --bind /home/users /export/users
為了避免每次重啟后都重新輸入這些內容,我們將以下行添加到 /etc/fstab
:
/home/users /export/users none bind 0 0
有三個配置文件與 NFS 服務器相關:
. /etc/default/nfs-kernel-server
. /etc/default/nfs-common
. /etc/exports
目前 /etc/default/nfs-kernel-server
中唯一重要的選項是 NEED_SVCGSSD
。默認情況下,它設置為 "no"
,這很好,因為我們這次不激活 NFSv4 安全性。
為了自動映射 ID 名稱,文件 /etc/idmapd.conf
必須存在于客戶端和服務器上,并且內容相同且域名正確。此外,此文件的 Mapping
部分應包含以下行:
[Mapping]Nobody-User = nobody
Nobody-Group = nogroup
但是,請注意,客戶端對 Nobody-User 和 Nobody-Group 可能有不同的要求。例如,在 RedHat 變體上,兩者都是 nfsnobody
。如果您不確定,請通過以下命令檢查是否存在 nobody
和 nogroup
:
$ cat /etc/passwd
$ cat /etc/group
這樣,服務器和客戶端就不需要用戶共享相同的 UID/GUID。對于使用基于 LDAP 的身份驗證的用戶,請在客戶端的 idmapd.conf
中添加以下幾行:
[Translation]Method = nsswitch
這將讓 idmapd
知道查看 nsswitch.conf
以確定應在何處查找憑據信息。如果您的 LDAP 身份驗證已在運行,則 nsswitch
不需要進一步解釋。
要將我們的目錄導出到本地網絡 192.168.1.0/24
,請將以下兩行添加到 /etc/exports
:
/export 192.168.1.0/24(rw,fsid=0,insecure,no_subtree_check,async)
/export/users 192.168.1.0/24(rw,nohide,insecure,no_subtree_check,async)
Portmap 鎖定(可選)
NFS 上的文件對網絡上的任何人都開放。作為一項安全措施,您可以限制對指定客戶端的訪問。
將以下行添加到 /etc/hosts.deny
:
rpcbind mountd nfsd statd lockd rquotad : ALL
通過首先阻止所有客戶端,只有 /etc/hosts.allow
(下面添加)中的客戶端才被允許訪問服務器。
現在將以下行添加到 /etc/hosts.allow
:
rpcbind mountd nfsd statd lockd rquotad : <list of IPv4s>
其中 <list of IPv4s>
是服務器和所有客戶端的 IP 地址列表。(這些必須是 IP 地址,因為 rpcbind
有限制,它支持主機名)。請注意,如果已經設置了 NIS,可以直接將這些地址添加到同一行。
請確保授權 IP 地址列表包含 localhost
地址( 127.0.0.1
),因為 Ubuntu 最新版本的啟動腳本使用 rpcinfo
命令來發現 NFSv3 支持,如果 localhost
無法連接,該命令將被禁用。
最后,要使更改生效,請重新啟動服務:
$ sudo systemctl restart nfs-kernel-server
配置 NFS 客戶端
現在您的服務器正在運行,您需要設置任何客戶端以便能夠訪問它。首先,安裝所需的軟件包:
$ sudo apt install nfs-common
在客戶端,我們可以使用一個命令掛載:
$ mount -t nfs -o proto=tcp,port=2049 <nfs-server-IP>:/ /mnt
您還可以指定 NFS 服務器主機名而不是其 IP 地址,但在這種情況下,您需要確保主機名可以在客戶端解析為 IP。確保始終解析此 IP 的可靠方法是使用 /etc/hosts
文件。
請注意,在 NFSv4 中不需要 <nfs-server-IP>:/export
,而在 NFSv3 中則不需要。根導出 :/
默認為使用 fsid=0
導出。
我們還可以使用以下命令掛載導出的子樹:
$ mount -t nfs -o proto=tcp,port=2049 <nfs-server-IP>:/users /home/users
為確保每次重新啟動時都掛載該子樹,請在 /etc/fstab
中添加以下行:
<nfs-server-IP>:/ /mnt nfs auto 0 0
如果掛載后, /proc/mounts
中的條目顯示為 <nfs-server-IP>://
(帶有兩個斜杠),則您可能需要在 /etc/fstab
中指定兩個斜杠,否則 umount
可能會提示找不到掛載。
端口映射鎖定(可選)
將以下行添加到 /etc/hosts.deny
:
rpcbind : ALL
通過首先阻止所有客戶端,只有 /etc/hosts.allow
(下面添加)中的客戶端才被允許訪問服務器。
現在將以下行添加到 /etc/hosts.allow
:
rpcbind : <NFS server IP address>
其中 <NFS server IP address>
是服務器的 IP 地址。
配置復雜的 NFS 服務器
NFS 用戶權限基于用戶 ID (UID)。客戶端上任何用戶的 UID 都必須與服務器上的 UID 匹配,用戶才能訪問。執行此操作的典型方法是:
- 手動密碼文件同步
- 使用 LDAP
- 使用 DNS
- 使用 NIS
請注意,在主用戶具有 root 訪問權限的系統上,您必須小心:該用戶可以更改系統上的 UID,以允許自己訪問任何人的文件。本頁假設管理團隊是唯一具有 root 訪問權限的組,并且他們都受到信任。其他任何內容都代表更高級的配置,這里不再贅述。
組權限
用戶的文件訪問權限由他們在客戶端上的組成員身份決定,而不是服務器上的組成員身份。但是,有一個重要的限制:從客戶端傳遞到服務器的組最多為 16 個,如果用戶在客戶端上是 16 個以上組的成員,則某些文件或目錄可能會意外無法訪問。
DNS(可選,僅在使用 DNS 時)
將任何客戶端名稱和 IP 地址添加到 /etc/hosts
。(服務器的 IP 地址應該已經存在。)這樣可以確保即使 DNS 發生故障,NFS 仍能正常工作。或者,如果您愿意,也可以依賴 DNS - 這取決于您。
NIS(可選,僅在使用 NIS 時)
這適用于使用 NIS 的客戶端。否則,您無法使用網絡組,并且應該在 /etc/exports
中指定單獨的 IP 或主機名。請閱讀 man netgroup
中的 BUGS 部分以獲取更多信息。
首先,編輯 /etc/netgroup
并添加一行來對您的客戶端進行分類(此步驟不是必需的,但是為了方便):
myclients (client1,,) (client2,,) ...
其中 myclients
是網絡組名稱。
接下來運行此命令重建 NIS 數據庫:
$ sudo make -C /var/yp
文件名 yp
指的是黃頁,即 NIS 的前身。
端口映射鎖定(可選)
將以下行添加到 /etc/hosts.deny
:
rpcbind mountd nfsd statd lockd rquotad : ALL
通過首先阻止所有客戶端,只有 /etc/hosts.allow
(下面添加)中的客戶端才被允許訪問服務器。
考慮將以下行添加到 /etc/hosts.allow
:
rpcbind mountd nfsd statd lockd rquotad : <list of IPs>
其中 <list of IPs>
是服務器和所有客戶端的 IP 地址列表。由于 rpcbind
中的限制,這些必須是 IP 地址。請注意,如果已經設置了 NIS,則只需將這些地址添加到同一行即可。
軟件包安裝和配置
安裝必要的軟件包:
$ sudo apt install rpcbind nfs-kernel-server
編輯 /etc/exports
并添加共享:
/home @myclients(rw,sync,no_subtree_check)
/usr/local @myclients(rw,sync,no_subtree_check)
上述示例將 /home
和 /usr/local
共享給 myclients
網絡組中的所有客戶端。
/home 192.168.0.10(rw,sync,no_subtree_check) 192.168.0.11(rw,sync,no_subtree_check)
/usr/local 192.168.0.10(rw,sync,no_subtree_check) 192.168.0.11(rw,sync,no_subtree_check)
上述示例將 /home
和 /usr/local
共享給兩個具有靜態 IP 地址的客戶端。如果您希望允許私有網絡中指定 IP 地址范圍內的所有客戶端訪問,請考慮以下操作:
/home 192.168.0.0/255.255.255.0(rw,sync,no_subtree_check)
/usr/local 192.168.0.0/255.255.255.0(rw,sync,no_subtree_check)
此處, rw
使共享可讀/寫, sync
要求服務器僅在任何更改刷新到磁盤后才回復請求。這是最安全的選項;async
速度更快,但很危險。如果您正在考慮其他選項,強烈建議您閱讀 man exports
。
設置 /etc/exports
后,導出共享:
$ sudo exportfs -ra
每當修改 /etc/exports
時,您都需要運行此命令。
重新啟動服務
重新啟動 rpcbind
和 NFS 以使更改生效:
$ sudo systemctl restart rpcbind
$ sudo systemctl restart nfs-kernel-server
需要考慮的安全事項
除了上面討論的 UID 問題之外,還應注意,攻擊者可能會偽裝成允許映射共享的機器,這允許他們創建任意 UID 來訪問您的文件。一個潛在的解決方案是 IPSec。您可以將所有域成員設置為僅通過 IPSec 相互通信,這將有效地驗證您的客戶端是否是它所說的那個客戶端。
IPSec 的工作原理是使用服務器的公鑰加密發往服務器的流量,然后服務器發回使用客戶端的公鑰加密的所有回復。流量使用相應的私鑰解密。如果客戶端沒有它應該擁有的密鑰,它就無法發送或接收數據。
IPSec 的替代方案是物理上獨立的網絡。這需要單獨的網絡交換機和單獨的以太網卡,以及該網絡的物理安全性。
故障排除
只有在您成功登錄并且您的主目錄已解密后,才能在加密的主目錄中安裝 NFS 共享。這意味著使用 /etc/fstab 在啟動時安裝 NFS 共享將不起作用,因為您的主目錄在安裝時尚未解密。有一個簡單的方法可以使用符號鏈接來解決這個問題:
. 創建一個備用目錄來安裝 NFS 共享:
$ sudo mkdir /nfs
$ sudo mkdir /nfs/music
. 編輯 /etc/fstab
以將 NFS 共享掛載到該目錄中:
nfsServer:music /nfs/music nfs auto 0 0
. 在您的 home 中創建一個符號鏈接,指向實際的掛載位置。例如,在這種情況下,首先刪除已經存在的 Music
目錄:
$ rmdir /home/user/Music
$ ln -s /nfs/music/ /home/user/Music
上一篇 – 樹莓派超全系列教程文檔–(54)如何使用rsync在計算機之間同步文件夾
下一篇 – 樹莓派超全系列教程文檔–(56)如何使用Samba共享文件夾