在防火墙之后运行NFS服务器

在企业环境,NFS存储服务器很可能部署在防火墙内,你会发现简单为NFS开启防火墙访问端口并不能使客户端正确挂载NFS共享目录。这个问题在 (正在探索)Docker Desktop for mac部署kind容器通过 SSH Tunnel 使用共享NFS卷 也突出存在,原因是 SSH隧道 / SSH Tunneling: 远程服务端口转发 就像防火墙一样,只开启了少量且固定的访问NFS服务器端口映射。

此时的现象是: 执行 mount -t nfs 时使用 -v 参数观察:

挂载NFS(指定NFS v3):

使用NFS v3, tcp 挂载macOS共享的NFS目录
mount -t nfs -v -o vers=3,tcp 172.22.0.12:/Users/huataihuang/docs/studio /studio

输出显示 portmap query failed: RPC: Unable to receive - Connection reset by peer :

使用NFS v3, tcp 挂载macOS共享的NFS目录的输出信息显示RPC失败
mount.nfs: timeout set for Thu Feb  2 00:26:01 2023
mount.nfs: trying text-based options 'vers=3,tcp,addr=172.22.0.12'
mount.nfs: prog 100003, trying vers=3, prot=6
mount.nfs: trying 172.22.0.12 prog 100003 vers 3 prot TCP port 2049
mount.nfs: portmap query failed: RPC: Unable to receive - Connection reset by peer
mount.nfs: Connection reset by peer

解析

现在主要的NFS版本是 v3 和 v4 :

  • NFS v3 提供了比 v2更好功能: 可变大小处理、改进的错误报告等。但是 NFS v3 与 NFS v2 客户端不兼容

  • 最新版本的 NFS v4 提供了新的和改进的功能:

    • 包括有状态操作

    • 与 NFS v2 和 NFS v3 的向后兼容性

    • 移除的端口映射器要求 (这个有意思)

    • 跨平台互操作性

    • 更好的命名空间处理

    • 带有 ACL 的内置安全性和 Kerberos

NFS v4不使用 portmapper (NFS v2 和 v3必须),所以对NFS v4来说,只要求端口 2049 。对于 NFS v2 和 v3,需要附加的端口和服务,配置复杂。

NFS v2 和 v3 的服务要求

NFS v2 和 v3 使用 portmap 服务,在Linux平台 portmap 服务处理远程过程调用(Remote Procedure Calls, RPC),NFS v2 和 v3 用RPC来编码和解码客户端和服务器之间的请求。

为了实现NFS共享,以下服务是NFS v2 和 v3所必须的:

NFS v2/v3 的服务及功能

服务

说明

portmapper (已废弃)

在NFS客户端和服务端都需要运行 protmapper 服务,运行在TCP/UDP端口111

rpcbind

取代 portmapper 负责RPC程序编号映射到IP地址端口号组合,支持IPv6

mountd

mountd 服务运行在服务端负责处理NFS客户端请求,主要由 nfsd 服务管理无需配置

nfsd

nfsd 是实际运行的NFS关键服务,工作在Linux内核提供客户端联机的功能,通常运行在TCP/UDP 2049端口

lockd

lockd 运行在服务器端或客户端提供客户端锁定NFS服务器上文件功能

statd

statd 运行在服务器和客户端负责在NFS服务器意外重启时通知客户端,实现了网络状态监控RPC协议

rquotad

rquotad 为远程客户端提供配额信息,由 nfsd 自动启动无需配置

备注

NFS穿透防火墙的难点在于默认 rpcbind 是随机分配给客户端访问的服务端口( rquotad / lockd / mountd / statd ),这导致防火墙往往没有提供对应随机端口开放阻塞了NFS客户端请求连接。

固定NFS服务端口

  • RedHat Linux (如 Fedora ) 系统上, /etc/sysconfig/nfs 提供了NFS相关服务端口配置选项:

Red Hat系列Linux使用 /etc/sysconfig/nfs 配置NFS参数,固定NFS服务端口
RQUOTAD_PORT=875
LOCKD_TCPPORT=32803
LOCKD_UDPPORT=32769
MOUNTD_PORT=892
STATD_PORT=662

参考