使用带有 NFS 导出挂载的 autofs 的防火墙问题

使用带有 NFS 导出挂载的 autofs 的防火墙问题

我已经在本地网络机器上成功设置了可运行的 NFS 服务器/客户端系统。我喜欢它!

但是,由于厌倦了在启动时无法挂载的长时间延迟,我决定采纳 @ridgy 的建议,使用 autofs 来挂载共享 - 使用来自这个帖子

我之前遇到过防火墙问题,因此,我立即怀疑 ufw 可能是挂载超时的原因。因此,我在服务器和客户端上禁用了 ufw。果然,autofs 运行正常。因此,我确信基本配置是正确的。

此时 ufw 中唯一的其他规则是针对端口 2078 和 6589 的 ALLOW 规则。没有设置 BLOCK 规则。而且,由于在 fstab 控制的安装过程中,NFS 在 ufw 开启的情况下运行良好,因此我有点搞不清楚阻塞发生在哪里。

到目前为止,除了常见的 NFS 111,2049 TCP/UDP 之外,我还没有找到关于 autofs 独有的端口/协议的文档。

每当我重新启用 ufw 时,共享就会再次变得无法访问。

有任何想法吗?


@ridgy

按照下面的建议编辑 nfs-common 和 nfs-kernel-server 后,我仔细检查了三遍,发现编辑结果与所示完全一致。我重新启动并运行...

$sudo netstat -nalp | grep rpc...输出是;

tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN      1220/rpcbind    
tcp        0      0 0.0.0.0:32767           0.0.0.0:*               LISTEN      4158/rpc.mountd 
tcp6       0      0 :::111                  :::*                    LISTEN      1220/rpcbind    
tcp6       0      0 :::32767                :::*                    LISTEN      4158/rpc.mountd 
udp        0      0 0.0.0.0:972             0.0.0.0:*                           1220/rpcbind    
udp        0      0 0.0.0.0:32767           0.0.0.0:*                           4158/rpc.mountd 
udp        0      0 0.0.0.0:111             0.0.0.0:*                           1220/rpcbind    
udp6       0      0 :::972                  :::*                                1220/rpcbind    
udp6       0      0 :::32767                :::*                                4158/rpc.mountd 
udp6       0      0 :::111                  :::*                                1220/rpcbind    
unix  2      [ ACC ]     STREAM     LISTENING     15939    1/init              /run/rpcbind.sock
unix  2      [ ]         DGRAM                    49175    4158/rpc.mountd     
unix  3      [ ]         STREAM     CONNECTED     48294    1220/rpcbind        /run/rpcbind.sock
unix  3      [ ]         STREAM     CONNECTED     16984    1220/rpcbind        
unix  3      [ ]         STREAM     CONNECTED     48275    4157/rpc.idmapd     
unix  3      [ ]         STREAM     CONNECTED     48276    4157/rpc.idmapd 

好的...那么,我想知道...rpc.statd 在哪里???此外,我的 NFS 共享(autofs 仍然被禁用)仍然在客户端可见。即使防火墙尚未使用新的 rpc.mountd 端口 32767 进行更新。

答案1

最后,事情并没有那么复杂,按照保护 NFS。我修改了文件/etc/default/nfs-common/etc/default/nfs-kernel-server根据:

nfs-通用:

.
.
# Options for rpc.statd.
#   Should rpc.statd listen on a specific port? This is especially useful
#   when you have a port-based firewall. To use a fixed port, set this
#   this variable to a statd argument like: "--port 4000 --outgoing-port 4001".
#   For more information, see rpc.statd(8) or http://wiki.debian.org/SecuringNFS
STATDOPTS="--port 32765 --outgoing-port 32766"
.
.

nfs 内核服务器:

.
.
# Options for rpc.mountd.
# If you have a port-based firewall, you might want to set up
# a fixed port here using the --port option. For more information,
# see rpc.mountd(8) or http://wiki.debian.org/SecuringNFS
# To disable NFSv4 on the server, specify '--no-nfs-version 4' here
RPCMOUNTDOPTS="--manage-gids --port 32767"
.
. 

为什么是这些端口?由于32767是最高的 15 位数字,因此这些端口不太可能已被其他端口使用。

我没有使用配额,所以我没有/etc/default/quota按照建议进行修改。而且我在进行这些更改后必须重新启动。然后我看到了结果

$ sudo netstat -nalp | grep rpc

tcp        0      0 0.0.0.0:32767           0.0.0.0:*               LISTEN      1018/rpc.mountd 
tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN      735/rpcbind     
tcp        0      0 0.0.0.0:32765           0.0.0.0:*               LISTEN      806/rpc.statd   
tcp6       0      0 :::32767                :::*                    LISTEN      1018/rpc.mountd 
tcp6       0      0 :::111                  :::*                    LISTEN      735/rpcbind     
tcp6       0      0 :::32765                :::*                    LISTEN      806/rpc.statd   
udp        0      0 0.0.0.0:875             0.0.0.0:*                           735/rpcbind     
udp        0      0 127.0.0.1:982           0.0.0.0:*                           806/rpc.statd   
udp        0      0 0.0.0.0:32765           0.0.0.0:*                           806/rpc.statd   
udp        0      0 0.0.0.0:32767           0.0.0.0:*                           1018/rpc.mountd 
udp        0      0 0.0.0.0:111             0.0.0.0:*                           735/rpcbind     
udp6       0      0 :::875                  :::*                                735/rpcbind     
udp6       0      0 :::32765                :::*                                806/rpc.statd   
udp6       0      0 :::32767                :::*                                1018/rpc.mountd 
udp6       0      0 :::111                  :::*                                735/rpcbind     
unix  2      [ ACC ]     STREAM     LISTENING     11412    735/rpcbind         /run/rpcbind.sock
unix  2      [ ]         DGRAM                    9521     806/rpc.statd       
unix  2      [ ]         DGRAM                    9614     1018/rpc.mountd     
unix  3      [ ]         STREAM     CONNECTED     11721    862/rpc.idmapd      
unix  3      [ ]         STREAM     CONNECTED     11722    862/rpc.idmapd      

如您所见,正在监听的端口rpc.mountd和现在是静态的。rpc.statd

showmount客户端输入(此处为 192.168.192.20)时,Wireshark 显示通信(服务器为 192.168.192.111)。这里很重要: 和GETPORT CallGETPORT reply返回Port:32767。然后通信使用此端口。

在此处输入图片描述 现在您应该能够根据需要修改防火墙规则,然后使用showmountautofs通过防火墙。

仅供参考

根据评论中的提示和我自己的经验,我发现不同分布中的行为不同:

  • 在当前版本中raspbian jessie(基于debian),有一个服务nfs-common(文件/etc/init.d/nfs-common),当启用时,例如rpc.statd在启动时启动,并尊重中的端口设置/etc/default/nfs-common
  • 目前Ubuntu 16.04没有这样的服务。rpc.statd不会在启动时启动,因为 NFS V4 不需要它。但一旦mount .... -o nfsvers=3完成,rpc.statd就会启动,并遵守 中的端口设置/etc/default/nfs-common

我没有找到关于这一点的一致文献;如何配置 NFS该文件/etc/init.d/nfs-common被明确提及,尽管不是在包中。如果有人对此有提示/链接,那将是当之无愧的。

还有一句:man rpc.mountdman rpc.statd说(对于选项--port):

“如果未指定此选项,rpc.statd 将尝试查阅 /etc/services,如果获取端口成功,则为所有侦听器套接字设置相同的端口,否则为每个侦听器套接字选择一个随机的临时端口。”

即使设置了端口/etc/services(如上述 wiki 中建议的那样),这也不起作用。因此,修改文件/etc/default似乎是强制性的 - 手册页此时并不正确。

相关内容