Skip to content

网络文件系统(NFS)

网络文件系统(NFS)允许您与同一网络上的其他计算机或设备共享位于一台联网计算机上的目录。目录所在的计算机称为"服务器",连接到该服务器的计算机或设备称为"客户端"。客户端通常"挂载"共享目录以使其成为其自身目录结构的一部分。共享目录是共享资源或网络共享的示例。

对于较小的网络,NFS非常适合在 Linux /Unix环境中创建简单的 NAS (网络附加存储)。

NFS可能最适合于更永久的网络安装目录,例如"/home"目录或定期访问的共享资源。如果您希望来宾用户可以轻松连接到网络共享,则 Samba 更适合该任务。这是因为在旧的专有操作系统上更容易获得用于临时挂接 Samba 共享的工具。

在部署 NFS 之前,您应该熟悉以下内容:

  • Linux文件和目录权限 *挂载和卸载文件系统

设置基本的 NFS 服务器

使用以下命令安装所需的软件包:

`` sudo apt安装 nfs -kernel-server


为了便于维护,我们将所有 NFS 导出隔离在一个目录中,使用--bind选项将实际目录装入该目录中。

假设我们要导出用户的主目录,该目录位于`/home/users`中。首先,我们创建导出文件系统:

``
sudo mkdir -p /出口/用户

请注意,/export/export/users将需要 777 权限,因为我们将在没有 LDAP /NIS身份验证的情况下从客户端访问 NFS 共享。如果使用身份验证,则这将不适用(请参阅下文)。现在使用以下命令挂载真实的users目录:

`` sudo mount --bind/home/users/export/users


为了避免每次重启后重新键入代码,我们将以下行添加到`/etc/fstab`中:

/home /用户/export/users无绑定 0 0


与 NFS 服务器相关的三个配置文件:

1.`/etc/default/nfs-kernel-server`
1.`/etc/default/nfs-common`
1.`/etc/exports`

目前,"/etc/default/nfs-kernel-server"中唯一重要的选项是" NEED_SVCGSSD"。默认情况下将其设置为" no",这很好,因为这次我们不激活 NFSv4 安全性。

为了自动映射 ID 名称,客户机和服务器上都必须存在内容相同且域名正确的文件`/etc/idmapd.conf`。此外,该文件在"映射"部分中应包含以下几行:

[对应]

无人使用者=无人 Nobody-Group = nogroup


但是,请注意,客户端对 Nobody -User和 Nobody -Group可能有不同的要求。例如,在 RedHat 变体上,两者均为`nfsnobody`。如果不确定,请通过以下命令检查" nobody"和" nogroup"是否存在:

``
猫/etc/passwd
猫/etc/group

这样,服务器和客户端不需要用户共享相同的 UID /GUID。对于那些使用基于 LDAP 的身份验证的用户,将以下行添加到客户端的idmapd.conf中:

[翻译]

方法= nsswitch

这将使 idmapd 知道查看 nsswitch .conf以确定应该在哪里寻找证书信息。如果您已经有 LDAP 身份验证,则nsswitch不需要进一步说明。

要将目录导出到本地网络" 192.168.1.0/24",我们在"/etc/exports"中添加以下两行:

/导出 192 .168.1.0/24(rw,fsid=0,不安全,no_subtree_check,异步)
/export/users 192.168.1.0/24(rw,nohide,insecure,no_subtree_check,async)

端口映射锁定(可选)

NFS上的文件向网络上的任何人开放。作为安全措施,您可以限制对指定客户端的访问。

将以下行添加到/etc/hosts.deny中:

rpcbind mountd nfsd statd lockd rquotad:ALL

通过首先禁止所有客户端,仅允许/etc/hosts.allow(在下面添加)中的客户端访问服务器。

现在将以下行添加到/etc/hosts.allow中:

rpcbind mountd nfsd statd lockd rquotad:<IPv4列表>

其中," "是服务器和所有客户端的 IP 地址的列表。 (由于 rpcbind 中的限制,这些地址必须是 IP 地址,它不喜欢主机名。)请注意,如果您设置了 NIS ,则可以将它们添加到同一行中。

请确保授权的 IP 地址列表中包含"本地主机"地址(" 127.0.0.1"),因为最新版本的 Ubuntu 中的启动脚本使用" rpcinfo"命令来发现 NFSv3 支持,如果"本地主机无法连接。

最后,要使更改生效,请重新启动服务:

`` sudo systemctl重新启动 nfs -kernel-server


## 设置 NFSv4 客户端现在您的服务器正在运行,您需要设置任何客户端都可以访问它。首先,安装所需的软件包:
``
sudo apt安装 nfs -common

在客户端上,我们可以使用一个命令挂载完整的导出树:

`` 挂载-t nfs -o proto = tcp,port = 2049 ://mnt


您也可以指定 NFS 服务器主机名而不是其 IP 地址,但是在这种情况下,您需要确保主机名可以在客户端解析为 IP 。确保将始终解决的一种可靠方法是使用`/etc/hosts`文件。

请注意,在 NFSv4 中不需要`<nfs-server-IP>:/export`,就像在 NFSv3 中一样。根导出`:/`默认使用`fsid = 0`导出。

我们还可以使用以下命令安装导出的子树:

``
安装-t nfs -o proto = tcp,port = 2049 <nfs-server-IP>:/users/home/users

为了确保在每次重启时都将其安装,请将以下行添加到/etc/fstab中:

<nfs-server-IP>://mnt nfs自动 0  0

如果在挂载后,在/proc/mounts中的条目显示为://(带有两个斜杠),那么您可能需要在/etc/fstab中指定两个斜杠,否则umount可能会抱怨找不到载具。

端口映射锁定(可选)

将以下行添加到/etc/hosts.deny中:

rpcbind:全部

通过首先禁止所有客户端,仅允许/etc/hosts.allow(在下面添加)中的客户端访问服务器。

现在将以下行添加到/etc/hosts.allow中:

rpcbind:<NFS服务器 IP 地址>

其中" "是服务器的 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:


其中," <IP列表>"是服务器和所有客户端的 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"网络组中的所有客户端。

/家庭 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`更快,但是很危险。如果您正在考虑其他选择,强烈建议您阅读`manexports'。

设置`/etc/exports`之后,导出共享:

``
 sudo  exportfs  -ra

每当修改/etc/exports时,您将要运行此命令。

重新启动服务

默认情况下," rpcbind"仅绑定到环回接口。要允许从远程机器访问rpcbind,您需要更改/etc/conf.d/rpcbind以摆脱-l-i 127.0.0.1

如果进行了任何更改,则需要重新启动 rpcbind 和 NFS :

`` sudo systemctl重新启动 rpcbind sudo systemctl重新启动 nfs -kernel-server


### 要考虑的安全项目

除了上面讨论的 UID 问题外,应该注意的是,攻击者可能会伪装成一台允许映射共享的机器,从而使他们可以创建任意 UID 来访问您的文件。一种可能的解决方案是 IPSec 。您可以将所有域成员设置为仅通过 IPSec 相互通信,这将有效地验证您的客户端是谁。

IPSec的工作原理是使用服务器的公共密钥对到服务器的通信进行加密,然后服务器将使用客户端的公共密钥加密的所有答复发送回去。使用相应的私钥解密流量。如果客户端没有应该拥有的密钥,则它将无法发送或接收数据。

IPSec的替代方法是物理上独立的网络。这需要单独的网络交换机和单独的以太网卡,以及该网络的物理安全性。

## 故障排除

只有在成功登录并解密了主目录之后,才能在加密的主目录中安装 NFS 共享。这意味着使用/etc/fstab在引导时挂载 NFS 共享将不起作用,因为挂载时您的家尚未被解密。有一种使用符号链接的简单方法:

1.创建一个备用目录以在以下位置装入 NFS 共享:

``
 sudo  mkdir /nfs
sudo mkdir/nfs /音乐

2.编辑/etc/fstab,将 NFS 共享装载到该目录中:

nfsServer:音乐/nfs /音乐 nfs 自动 0  0

3.在您的房屋内创建一个符号链接,指向实际的安装位置。例如,在这种情况下,首先删除已经存在的Music目录:

`` rmdir /家庭/用户/音乐 ln -s/nfs/music//home/user/Music ```

作者信息

本指南基于官方 Ubuntu Wiki上的文档:

  1. https://help.ubuntu.com/community/SettingUpNFSHowTo
  2. https://help.ubuntu.com/stable/serverguide/network-file-system.html