Product SiteDocumentation Site

11.4. NFS 文件服务器

NFS (Network File System——网络文件系统)是允许通过网络远程访问文件系统的协议。所有的 Unix 系统可以通过这个协议工作。
NFS 是非常有用的工具,但历史上它受到了很多限制,多数限制已经在第 4 版协议中处理了。缺点是当使用基本的安全特性如认证和加密时,最新版的 NFS 难于配置,因为它对那些部分依赖于 Kerboreos。没有的话,NFS 协议必须限制为受信任的本地网络,因为数据在网络上不加密(嗅探程序可以拦截到)地传递,并且基于客户端的 IP 地址(可以被欺骗)来授予访问权限。

11.4.1. 使 NFS 安全

如果不使用基于 Kerberos 的安全特性,那么确保只允许使用 NFS 的机器可以连接到各种所需的 RPC 服务器上是至关重要的,因为基本协议信任从网络接收到的数据。防火墙也必需阻挡 IP 嗅探,从而防止外部机器作为内部的机器工作,并且对适当端口的访问必须被限制给有意访问 NFS 共享的机器。
较老版本的协议需要其它动态指定端口的 RPC 服务。幸运的是通过第 4 版的NFS,只需要端口 2049 (用于 NFS)和 111 (用于 portmapper),这样对于防火墙很容易处理。

11.4.2. NFS 服务器

NFS 服务器是 Linux 内核的一部分;在 Debian 提供的内核中,它构建为内核模块。如果 NFS 服务器在引导时自动运行,那么应该安装 nfs-kernel-server 软件包;它包含相关的启动脚本。
The NFS server configuration file(s), /etc/exports and /etc/exports.d/, lists the directories that are made available over the network (exported). For each NFS share, only the given list of machines is granted access. More fine-grained access control can be obtained with a few options. The syntax for this file is quite simple:
/directory/to/share machine1(option1,option2,...) machine2(...) ...
注意,通过 NFSv4,所有的导出目录必须是单一层次结构的一部分,并且层次结构的根目录必须被导出,并用选项fsid=0fsid=root 来识别。
每台机器可以由其 DNS 名称或其 IP 地址来识别。整组的机器也可以使用如 *.falcot.com 这样的语法,或如 192.168.0.0/255.255.255.0192.168.0.0/24 这样的 IP 地址来指定。
目录默认(或者通过 ro 选项)作为只读可用。 rw 选项允许读写访问。NFS 客户端典型地从限制为 root 的端口连接(换句话说,低于 1024);这个限制可以由 insecure 选项提升(secure 选项是隐性的,但如果需要清晰的话可以显性)。
在当前磁盘操作完成时(sync 选项),服务器默认只回答 NFS 查询;这可以通过 async选项来禁止。异步写入提高了一点性能,但降低了可靠性,因为在通知写入与真实写到磁盘上之间在服务器崩溃的情况下,存在数据丢失的风险。由于最近更改的默认值(与 NFS 的历史值相比),推荐显性的设置。
为了避免给予 NFS 客户端对文件系统的根访问权限,看起来来自根用户的所有查询都被服务器认为是来自 nobody 用户。这个行为符合 root_squash 选项,并且默认启用。禁止这个行为的 no_root_squash 选项是有风险的,并且应该只在受控的环境下使用。如果所有用户应该被映射到 nobody 用户上,那么使用 all_squashanonuid=uidanongid=gid 选项允许指定另一个伪用户来使用,取代 UID/GID 65534 (这符合nobody 用户和 nogroup 组)。
通过 NFSv4,可以添加 sec 选项来指定想要的安全等级:sec=sys 是默认的,没有特定的安全特性,sec=krb5 只启用认证,sec=krb5i 添加了整体保护,而 sec=krb5p 是最完全的等级,包括隐私保护(带有数据加密)。为了让它工作,需要进行 Kerberos 设置(那个服务不包括在本书的范围内)。
还有其它选项可用;它们归档在 exports(5) 手册页面中。

11.4.3. NFS 客户端

As with other filesystems, integrating an NFS share into the system hierarchy requires mounting (and the nfs-common package). Since this filesystem has its peculiarities, a few adjustments were required in the syntax of the mount command and the /etc/fstab file.

例 11.19. 用 mount 命令来手动挂载

# mount -t nfs4 -o rw,nosuid arrakis.internal.falcot.com:/shared /srv/shared

例 11.20. 在 /etc/fstab 文件中的 NFS 入口

arrakis.internal.falcot.com:/shared /srv/shared nfs4 rw,nosuid 0 0
上面描述的入口在系统启动时将 NFS 目录 /shared/arrakis 服务器挂载到本地 /srv/shared/ 目录中。这会需要读写访问(这样需要 rw 参数)。nosuid 选项是保护措施,从共享上存储的程序中擦除了任何 setuidsetgid 位。如果 NFS 共享只意味着存储文档,那么另一个推荐的选项是 noexec,它防止执行共享上存储的程序。注意,在服务器上 shared 目录在 NFSv4 root export 之下(例如 /export/shared),它不是顶层目录。
nfs(5) 手册页面在某种程度上具体地描述了所有的选项。