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

警告

虽然参考 在防火墙之后运行NFS服务器 设置固定端口,应该也能实现 SSH隧道 方式访问 macOS 输出的NFS共享目录。但是实践还是没有成功,只能暂且记录以备后续再挑战…

我在 (正在探索)Docker Desktop for mac部署kind容器通过 SSH Tunnel 使用共享NFS卷 部署 SSH隧道 / SSH Tunneling: 远程服务端口转发 实现类似 在防火墙之后运行NFS服务器 架构,让运行在 Docker Desktop 的Dcoker容器能够访问物理主机 macOS 的 NFS 共享目录。

macOS NFS端口列表

端口

协议

说明

111

udp

rpcbind

111

tcp

rpcbind

980

udp

status

1021

tcp

status

976

udp

nlockmgr

1017

tcp

nlockmgr

2049

udp

nfs

2049

tcp

nfs

789

udp

rquotad

952

tcp

rquotad

615

udp

mountd

958

tcp

mountd

固定NFS服务端口

备注

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

macOS 使用 /etc/nfs.conf
# 参考 man nfs.conf
nfs.server.rquota.port = 875
nfs.server.mount.port = 892

nfs.lockd.port = 32803
nfs.lockd.send_using_tcp = 1

nfs.statd.port = 662
nfs.statd.send_using_tcp = 1
  • 重启nfsd:

macOS 重启nfs
nfsd restart
  • 检查 rpcinfo -p :

rpcinfo 检查NFS相关服务端口(修订后)
   program vers proto   port
    100000    2   udp    111  rpcbind
    100000    3   udp    111  rpcbind
    100000    4   udp    111  rpcbind
    100000    2   tcp    111  rpcbind
    100000    3   tcp    111  rpcbind
    100000    4   tcp    111  rpcbind
    100024    1   udp    980  status
    100024    1   tcp   1021  status
    100021    0   udp    976  nlockmgr
    100021    1   udp    976  nlockmgr
    100021    3   udp    976  nlockmgr
    100021    4   udp    976  nlockmgr
    100021    0   tcp   1017  nlockmgr
    100021    1   tcp   1017  nlockmgr
    100021    3   tcp   1017  nlockmgr
    100021    4   tcp   1017  nlockmgr
    100003    2   udp   2049  nfs
    100003    3   udp   2049  nfs
    100011    1   udp    875  rquotad
    100011    2   udp    875  rquotad
    100003    2   tcp   2049  nfs
    100011    1   tcp    875  rquotad
    100011    2   tcp    875  rquotad
    100003    3   tcp   2049  nfs
    100005    1   udp    892  mountd
    100005    3   udp    892  mountd
    100005    1   tcp    892  mountd
    100005    3   tcp    892  mountd

备注

虽然 /etc/nfs.conf 配置了 nfs.lockd.portnfs.statd.port 端口,但是没有观察到 statusnlockmgr 监听这两个指定端口,让我很迷惑

  • 执行挂载:

使用NFS v3挂载macOS输出的NFS目录
mkdir /studio
mount -t nfs -vvvv -o vers=3,tcp 172.22.0.12:/Users/huataihuang/docs/studio /studio

奔溃 输出还是失败:

使用NFS v3挂载macOS输出的NFS目录显示还是失败
mount.nfs: timeout set for Thu Feb  2 17:27:37 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

参考