NFSv4 通过 portforward

Sto*_*one 5 proxy nfs port-forwarding haproxy nfs4

我想通过端口转发访问我的 NFSv4 服务器。大计划将是一个 NFSv4 服务器集群,在 localhost 上运行 HAProxy 进行负载平衡。但这现在并不重要。

在服务器上/etc/exports看起来像这样

/mnt/x  192.168.0.0/16(rw,sync,no_subtree_check,no_root_squash,fsid=1)
Run Code Online (Sandbox Code Playgroud)

我可以从我的客户端连接到 TCP 2049 上的服务器并像这样安装共享

mount -t nfs4 -o proto=tcp,port=2049 192.168.2.25:/mnt/x /mnt
Run Code Online (Sandbox Code Playgroud)

我通过过滤两台机器之间的所有其他通信来测试 NFVs4 对仅打开这个 TCP 端口感到满意。

所以我认为 NFS 运行良好。

但是当我将一个端口例如redir在客户端上转发到服务器时

redir --lport=3049 --cport=2049 --caddr=192.168.2.25
Run Code Online (Sandbox Code Playgroud)

并希望按如下方式安装它

mount -t nfs4 -o proto=tcp,port=3049 127.0.0.1:/mnt/x /mnt
Run Code Online (Sandbox Code Playgroud)

我明白了

mount.nfs4: Operation not permitted
Run Code Online (Sandbox Code Playgroud)

我想念什么?我在服务器日志中看不到任何相关信息。

更新: 我捕获了好的和坏的连接尝试,一开始它们是相同的,然后客户端发送一个

PUTROOTFH,GETFH,GETATTR
Run Code Online (Sandbox Code Playgroud)

命令。在好的情况下,服务器会响应

PUTROOTFH-NFS4_OK,GETFH-NFS4_OK,GETATTR-NFS4_OK
Run Code Online (Sandbox Code Playgroud)

在坏(转发)的情况下,它会响应

PUTROOTFH-NFS4_OK,GETFH-NFS4_OK,GETATTR-NFS4ERR_PERM
Run Code Online (Sandbox Code Playgroud)

这一点我将导出更改为

/mnt/x  0.0.0.0/0.0.0.0(rw,sync,no_subtree_check,no_root_squash,fsid=1)
Run Code Online (Sandbox Code Playgroud)

但错误是一样的。

在好的情况下,服务器日志是

rpc.mountd[1711]: nfsd_export: inbuf '0.0.0.0/0.0.0.0 /'
rpc.mountd[1711]: nfsd_export: found 0x12dfeb0 path /
rpc.mountd[1711]: nfsd_export: inbuf '0.0.0.0/0.0.0.0 /mnt'
rpc.mountd[1711]: nfsd_export: found 0x12e2810 path /mnt
Run Code Online (Sandbox Code Playgroud)

在坏的情况下

rpc.mountd[1711]: nfsd_export: inbuf '0.0.0.0/0.0.0.0 /'
rpc.mountd[1711]: nfsd_export: found 0x12dfeb0 path /
Run Code Online (Sandbox Code Playgroud)

Sto*_*one 6

我的同事在 中发现了解决方案tcpdump,即好的和坏的连接尝试之间唯一的其他区别是源端口。

然后谷歌告诉我我需要insecure导出的选项,因为转发后源端口高于 1024,在正常情况下它低于 1024,并insecure告诉服务器它可以接受源端口高于 1024 的客户端。