我已经在本地网络机器上成功设置了可运行的 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 Call
,GETPORT reply
返回Port:32767
。然后通信使用此端口。
现在您应该能够根据需要修改防火墙规则,然后使用showmount
和autofs
通过防火墙。
仅供参考
根据评论中的提示和我自己的经验,我发现不同分布中的行为不同:
- 在当前版本中
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.mountd
并man rpc.statd
说(对于选项--port
):
“如果未指定此选项,rpc.statd 将尝试查阅 /etc/services,如果获取端口成功,则为所有侦听器套接字设置相同的端口,否则为每个侦听器套接字选择一个随机的临时端口。”
即使设置了端口/etc/services
(如上述 wiki 中建议的那样),这也不起作用。因此,修改文件/etc/default
似乎是强制性的 - 手册页此时并不正确。