如何在 Debian 11.4 上为 nfs-kernel-server 指定特定的绑定地址

如何在 Debian 11.4 上为 nfs-kernel-server 指定特定的绑定地址

我只是不相信这不是一个功能,我需要让 NFS 停止监听服务器的 IPv6 地址,并且限制它监听的 IPv4 地址。

我已经研究了几个小时,但在不同的网站上我只是得到了相同的四五个答案,而这些答案并没有提供相关的解决方案。

当我lsof -i -P在服务器上运行时,我可以看到 NFS 打开了多个端口:

rpc.mount 7609 root    8u  IPv4 124179      0t0  UDP *:34231
rpc.mount 7609 root    9u  IPv4 124181      0t0  TCP *:55443 (LISTEN)
rpc.mount 7609 root   10u  IPv6 124183      0t0  UDP *:46874
rpc.mount 7609 root   11u  IPv6 124185      0t0  TCP *:55829 (LISTEN)
rpc.mount 7609 root   12u  IPv4 124187      0t0  UDP *:52359
rpc.mount 7609 root   13u  IPv4 124189      0t0  TCP *:37975 (LISTEN)
rpc.mount 7609 root   14u  IPv6 124191      0t0  UDP *:41861
rpc.mount 7609 root   15u  IPv6 124193      0t0  TCP *:33973 (LISTEN)
rpc.mount 7609 root   16u  IPv4 124195      0t0  UDP *:40059
rpc.mount 7609 root   17u  IPv4 124197      0t0  TCP *:50589 (LISTEN)
rpc.mount 7609 root   18u  IPv6 124199      0t0  UDP *:40265
rpc.mount 7609 root   19u  IPv6 124201      0t0  TCP *:35625 (LISTEN)
rpcbind   8103 _rpc    4u  IPv4  13941      0t0  TCP *:111 (LISTEN)
rpcbind   8103 _rpc    5u  IPv4  71849      0t0  UDP *:111
rpcbind   8103 _rpc    6u  IPv6  13945      0t0  TCP *:111 (LISTEN)
rpcbind   8103 _rpc    7u  IPv6  23221      0t0  UDP *:111

我需要删除所有 IPv6 的,并将 IPv4 的从监听改为*监听172.24.24.21,,172.24.24.22172.24.24.23

无效方法#1:

根据https://wiki.debian.org/NFSServerSetup,我可以通过修改/etc/default/nfs-kernel-server以包含此行来实现这一点:

RPCMOUNTDOPTS="-H 172.24.24.21 -H 172.24.24.22 -H 172.24.24.23"

重新启动两者后rpcbindnfs-kernel-server输出lsof -i -P保持不变,它显示的信息与上面的示例相同

无效方法#2:

为了至少修复 rpcbind,该文件/etc/default/rpcbind声明如下:

# Uncomment the following line to restrict rpcbind to localhost only for UDP requests
#OPTIONS="${OPTIONS} -h 127.0.0.1 -h ::1"

我尝试取消注释该行并将其替换为以下内容:

OPTIONS="${OPTIONS} -h 172.24.24.21"

重新启动两个服务后,不仅输出lsof -i -P保持不变,而且 htop 还显示 systemd 启动服务所执行的物理命令实际上是:

/sbin/rpcbind -f ${OPTIONS} -h 172.24.24.21

我尝试手动${OPTIONS}用文件中的正确值替换,如下所示:

OPTIONS="-w -h 127.0.0.1"

它正确地将 systemd 运行的命令设置为此,如 htop 所示:

/sbin/rpcbind -f -w -h 172.24.24.21

但是,输出lsof -i -P仍然与这篇文章顶部完全相同,所有 IPv4 和 IPv6 上的 TCP 和 UDP 端口仍然打开,这让我非常担心,因为我知道该机器可以通过其 IPv6 地址在全球范围内访问

无效方法#3:

我应该编辑/etc/nfs.conf和定义host=,但这似乎只是所有更负盛名的 Linux 发行版的方法。我一直更喜欢无头 Debian 服务器,我不想仅仅为了解决这个问题而彻底改变我的整个基础设施,并在我的主要文件存储服务器上安装一个完全不同的发行版,因为这将花费一周的停机时间和混乱,而我根本没有这个能力

无效方法#4:

编写一个脚本来自动配置 iptables,以阻止每次重新启动服务时打开的特定端口。

不,我不会这么做,这太荒谬了。我不相信没有办法像 2022 年任何其他支持网络的服务允许你做的那样正确地更改绑定地址。

其他事宜:

Systemd 已经用它自己的“rpc”服务监听了这四个:111地址。据我所知,当 systemd 的服务已经绑定端口时,rpcbind 应该无法启动,但它显然已经绑定了端口。假设这是一个错误,哪个进程在这种故障状态下接收端口 111 的任何连接?我如何禁止 systemd 打开这些端口?我也不想让 systemd 的 rpc 东西闲置在那里等着有人来破解。

谁能告诉我这是怎么回事,我浪费了半天时间

答案1

虽然手册页没有说明,但尝试更改 Debian 上的 rpc.mountd 监听地址似乎只有在服务配置中传递了 NFSv2 和 NFSv3 禁用标志时才会产生效果。

遗憾的是,我正在使用 NFSv3,仔细检查后发现 Debian wiki 中有这些-N 2-N 3示例中的标志,并表示命令的一部分是将其更改为 NFSv4。这个问题在于如果我们检查手册页并且man rpc.mountd实际上也没有提及-H-N参数可用。

它直接指出-Hand--ha-callout prog选项实际上意味着:

指定高可用性调出程序。此程序接收所有 MOUNT 和 UNMOUNT 请求的调出。这允许 rpc.mountd 在高可用性 NFS (HA-NFS) 环境中使用。

事实上,所有版本的手册页都指出这是-H

所以我不知道这里到底发生了什么,但我猜 Debian wiki 是正确的,我只是不明白除非禁用 NFSv2 和 NFSv3,否则这不会起作用。不过,Debian wiki 包含的信息从未出现在我能够找到的任何版本的手册页中,这真的很奇怪。手册页基本上让我完全不相信 Debian wiki,尽管事实证明上面的信息实际上是“正确的”。

答案2

RPCNFSDOPTS="-H 10.x.y.z -N 2 -N 3"我在 Debian 11 上通过设置成功使 nfsd 只监听我想要的接口/etc/default/nfs-kernel-server

/etc/default/nfs-kernel-server来源于/usr/lib/systemd/scripts/nfs-utils_env.sh并且RPCNFSDARGS设置于其中的任何内容RPCNFSDOPTS,然后是一些具体内容:

echo RPCNFSDARGS=\"$RPCNFSDOPTS ${RPCNFSDCOUNT:-8}\"

nfs-utils_env.sh被调用并将其变量吐出到/run/sysconfig/nfs-utils,然后从那里,启动 nfsd 的单元文件/lib/systemd/system/nfs-server.service读取它们并遵守RPCNFSDARGS

ExecStart=/usr/sbin/rpc.nfsd $RPCNFSDARGS

因此,我发现实现您所描述的最巧妙的方法(顺便说一句,我也不想相信在我们生活的时代这是不可能的)是RPCNFSDOPTS按照上面描述的方式进行设置,即使那里没有提到。

相关内容