树莓派超全系列教程文档--(55)如何使用网络文件系统NFS
如何使用网络文件系统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共享文件夹