如何获取本地网络中连接到 NFS 服务器的客户端列表?

How to get the list of clients connected to an NFS server within a local network?

我有一个 NFS 服务器,其文件夹权限如下。在同一网络中有 50 个客户端需要连接到此服务器。我想知道查找哪些客户端从服务器访问此服务器的命令是什么。

NFS 服务器配置文件如下所示。

[root@server ~]# cat /etc/exports
/home/guests    *(rw,sync)
/india          *(rw,sync)

下面是共享文件夹列表

[root@server ~]# showmount -e
Export list for server.sanith.com:
/india       *
/home/guests *

出于测试目的,我现在已将一个客户端连接到服务器。以下输出来自 "client2" 机器。

[root@client2 ~]# showmount -e 192.168.1.10
Export list for 192.168.1.10:
/india       *
/home/guests *
[root@client2 ~]# mount -t nfs 192.168.1.10:/india /test
[root@client2 ~]# mount
/dev/sda2 on / type ext4 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
tmpfs on /dev/shm type tmpfs (rw,rootcontext="system_u:object_r:tmpfs_t:s0")
/dev/sda1 on /boot type ext4 (rw)
/dev/sda3 on /home type ext4 (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
gvfs-fuse-daemon on /root/.gvfs type fuse.gvfs-fuse-daemon (rw,nosuid,nodev)
sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)
192.168.1.10:/india on /test type nfs (rw,vers=4,addr=192.168.1.10,clientaddr=192.168.1.12)

我尝试使用 showmount -ashowmount -d,但不确定缺少哪些未列出连接的客户端计算机。

[root@server ~]# showmount -a
All mount points on server.sanith.com:
[root@server ~]# man showmount
[root@server ~]# showmount -d
Directories on server.sanith.com:
[root@server ~]# netstat -an | grep 192.168.1.10:2048
[root@server ~]# netstat -an | grep 192.168.1.10:2049
[root@server ~]# cat /var/lib/nfs/rmtab
[root@server ~]#

注意:在此测试期间,服务器上的防火墙暂时被禁用。 请指教

您可以通过 运行 在 NFS 服务器上找到连接的 NFS 客户端:

netstat | grep :nfs
netstat -a | grep nfs

这对我在 Ubuntu GNOME 16.04 上有效。

由于 netstat 并不总是可用,因为它会被 ss 取代,您也可以使用

ss -a|grep nfs

从 Linux 内核 5.3 开始,您可以使用名为 /proc/fs/nfsd/clients.

的特殊目录

您可以通过uname -r 命令查看内核版本

NFS 在 UDP 和 TCP 上工作,只有打开的 TCP 连接会显示在 netstatss 中。此外,作为一个分布式文件系统,它(在历史上)拥有 problemsPDF 的公平份额(状态、缓存、锁定、通知、安全性——其中一些通过额外的 RPC 功能,例如 rpc.statd).

在 Linux NFS 服务器上(参见 man rpc.mountd)客户端 mount/unmount 请求记录在 /var/lib/nfs/rmtab 中,就像 /etc/mtab 一样,所以答案应该是:

cat /var/lib/nfs/rmtab

如果它是空的,那么你要么 rpc.mountd 有问题(所以你应该检查 RPC 服务 运行),要么所有客户端都是 NFSv4,不使用此功能。

在我检查过的版本中 rmtab 显示为:

10.1.2.0/24:/path/to/export1:0x000...flags
10.1.2.10:/path/to/export1:0x0000...flags
10.1.2.22:/path/to/export1:0x0000...flags
10.1.2.0/24:/path/to/export2:0x000...flags
10.1.2.22:/path/to/export2:0x0000...flags
10.1.2.99:/path/to/export2:0x0000...flags

即列出每个挂载点,然后是使用它的客户端。

注意手册页中的警告:

However, this file is mostly ornamental. One, the client can continue to use the file handle even after calling rpc.mountd's UMOUNT procedure. And two, if a client reboots without notifying rpc.mountd, a stale entry will remain in rmtab.

较新内核中的 /proc/fs/nfsd/client 方法(@Vsevolod Gromov 的回答)在这方面应该更好,但因为它只有 supports NFSv4 clients 应该表现得更好。