了解 NFS4(Linux 服务器)

dru*_*ire 27 nfs nfs4

我对 Linux 上的 NFS4 有点困扰。一些“外面”的信息似乎与其他信息冲突,而其他信息似乎很难找到。所以这里有几件事引起了我的注意,希望有人能对此有所了解。

这个问题只关注没有 Kerberos 等的 NFS4。

1. 出口

手册exports页中关于 /etc/exports 结构的信息不明确。

引用自exports(5)

此外,每一行在路径名后可能有一个或多个默认选项规范,形式为破折号(“-”)后跟选项列表。

选项列表仅用于该行上的所有后续导出。

“仅在该行上进行后续导出”是什么意思?

1.2fsid=0不再需要了?

当我在 linux-nfs 列表上发现一条评论指出不再需要 fsid=0时,我正在搜索 fsid 。现在我很困惑,我是否需要 nfs4 或不需要它?!

2.非导出目录仍可挂载

假设我有以下树:

/exp
/exp/users
/exp/distr
/exp/distr/archlinux
/exp/distr/debian
Run Code Online (Sandbox Code Playgroud)

我在这个 fstab 条目中有以下条目:

/dev/disk/by-label/users  /mnt/users  ext4  defaults  0  0
/dev/disk/by-label/distr  /mnt/distr  ext4  defaults  0  0
/mnt/users                /exp/users  none  bind      0  0
/mnt/distr                /exp/distr  none  bind      0  0
Run Code Online (Sandbox Code Playgroud)

而我的出口正是这样的:

/exp       192.168.1.0/24(fsid=0,rw,async,no_subtree_check,no_root_squash)
/exp/distr 192.168.1.0/24(rw,async,no_subtree_check,no_root_squash)
Run Code Online (Sandbox Code Playgroud)

exportfs -arv显示:

exporting 192.168.1.0/24:/exp/distr
exporting 192.168.1.0/24:/exp
Run Code Online (Sandbox Code Playgroud)

那么为什么我能够做到这一点并且在客户端上没有错误:

mount -t nfs4 server:/exp/users /tmp/test
Run Code Online (Sandbox Code Playgroud)

即使/exp/users不出口?我没有导出这个目录,虽然我看不到内容,/dev/disk/by-label/users除非我指定crossmnt,但我仍然可以写入目录。我写到那里的所有内容都转到底层目录,/exp/users当我umount /exp/users; ls /exp/users..

3. 奇怪的情况 showmount -d server

如 所述rpc.mountd(8),此命令应显示客户端当前挂载的目录,或 中的陈旧条目/var/lib/nfs/rmtab,如下所示:

rpc.mountd 守护进程通过向 /var/lib/nfs/rmtab 文件添加一个条目来注册每个成功的 MNT 请求。当收到来自 NFS 客户端的 UMNT 请求时,rpc.mountd 只需从 /var/lib/nfs/rmtab 中删除匹配条目,只要该导出的访问控制列表允许该发送者访问该导出。

(……)

但是请注意,几乎无法保证 /var/lib/nfs/rmtab 的内容是准确的。即使在调用 UMNT 之后,客户端也可以继续访问导出。如果客户端在没有发送 UMNT 请求的情况下重新启动,则该客户端的陈旧条目会保留在 /var/lib/nfs/rmtab 中。

读完这篇我肯定想知道:

  1. 仅仅公开这种类型的客户信息是不是非常不安全?
  2. 是否不知道服务器管理员必然拥有一个包含大量陈旧客户端的 rmtab ?
  3. 这是安装 nfs4 目录的客户端mount -v即使安装了某些东西能看到“没有安装任何东西”之类的输出的原因吗?

我有很多关于 nfs4 的其他问题,但我会暂时保留它...... :)

小智 7

很好的问题,通过 IMO 文档突出了一个更大的观点。这是一个完整答案的尝试:

“仅在该行上进行后续导出”是什么意思?

一个例子可能是最简单的:

/export/stuff -rw 10.0.0.54 10.0.0.55
Run Code Online (Sandbox Code Playgroud)

相当于:

/export/stuff 10.0.0.54(rw) 10.0.0.55(rw)
Run Code Online (Sandbox Code Playgroud)

fsid=0不是不再需要?

这取决于您的用例。看起来您正在从查询的其余部分导出常规的基于磁盘的文件系统,在这种情况下,您最好删除fsid=0(在 nfsv4 中更改行为以引用导出的根文件系统)。

要更改此行为,请删除 no_subtree_check 选项


rmtab-相关的东西

  • 处理是否rmtab存在安全风险?
    我想这取决于您的用例来回答这个问题,在我的网络上它不会出现可信的信息泄漏,但我可以看到可能存在的情况。
  • 不会rmtab充满陈旧的条目吗?
    可能是的,同样取决于您的部署场景/用例。
  • 这就是为什么一些客户端mount -v错误地看到“没有安装任何东西”的原因吗?
    我还没有遇到过这个