我只是不相信这不是一个功能,我需要让 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.22
和172.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"
重新启动两者后rpcbind
,nfs-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
参数可用。
它直接指出-H
and--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
按照上面描述的方式进行设置,即使那里没有提到。