Ubuntu 上通过 wireguard 进行 NFS 挂载失败并出现错误:“服务器给出的原因:没有此文件或目录”

Ubuntu 上通过 wireguard 进行 NFS 挂载失败并出现错误:“服务器给出的原因:没有此文件或目录”

我已经设置了 wireguard VPN 网络 192.168.6.x。网络拓扑(如果这是正确的术语)是:

  [client] ----- VPN ---- [VPN server] ----- Local net-----[NFS&SSH server]
  [192.168.6.32]          [192.168.6.21]                   [192.168.2.93]
                          [192.168.2.1]

客户端(Ubuntu 18.04)使用与 VPN 服务器(Ubuntu 22.04)不同的 ISP 连接到互联网。我的意思是客户端和 VPN 服务器的公共 IP 地址不同,并且这两个网络除了通过 wireguard 之外没有以任何其他方式连接。当从客户端使用 ssh 时,它工作正常,如下所示远程控制[电子邮件保护]。但是我在使用 NFS 时遇到了问题。我怀疑 NFS 配置文件中的某些配置行存在问题。

在客户端上,我有如下的 /etc/fstab 条目:

  192.168.6.21:/home/john/someDir  /someDir nfs auto,nofail,noatime,nolock,intr,tcp,actimeo=1800 0 0

当我做sudo 安装 -a,它只是挂起。但是当我执行:

  sudo mount -t nfs -o vers=4.2 192.168.6.21:/home/john/someDir   /someDir

它抱怨道:

 mount.nfs: mounting 192.168.6.21:/home/john/someDir failed, reason given by server: No such file or directory

VPN Server 上与 NFS 相关的 iptables 规则:

#NFS TCP port forwarding
iptables -t nat -A PREROUTING   -d 192.168.6.21  -p tcp --dport 2049 -j DNAT --to-destination 192.168.2.93:2049
iptables -t nat -A POSTROUTING  -s 192.168.2.93 -p tcp --sport 2049 -j SNAT --to-source 192.168.6.21

#NFS TCP mountd port forwarding. Needed by NFS
iptables -t nat -A PREROUTING   -d 192.168.6.21  -p tcp --dport 50022 -j DNAT --to-destination 192.168.2.93:50022
iptables -t nat -A POSTROUTING  -s 192.168.2.93 -p tcp --sport 50022 -j SNAT --to-source 192.168.6.21

#NFS UDP port forwarding
iptables -t nat -A PREROUTING   -d 192.168.6.21  -p udp --dport 2049 -j DNAT --to-destination 192.168.2.93:2049
iptables -t nat -A POSTROUTING  -s 192.168.2.93 -p udp --sport 2049 -j SNAT --to-source 192.168.6.21

#NFS UDP mountd port forwarding. Needed by NFS
iptables -t nat -A PREROUTING   -d 192.168.6.21  -p udp --dport 50022 -j DNAT --to-destination 192.168.2.93:50022
iptables -t nat -A POSTROUTING  -s 192.168.2.93 -p udp --sport 50022 -j SNAT --to-source 192.168.6.21

NFS&SSH 服务器上的 nfs-kernel-server:

  # Number of servers to start up
  RPCNFSDCOUNT=8

  # Runtime priority of server (see nice(1))
  RPCNFSDPRIORITY=0

  # 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"
  RPCMOUNTDOPTS="--manage-gids -N 2 -N 3 -H 192.168.2.93 --port 50022"


  #New added
  RPCNFSDOPTS="-N 2 -N 3"

  # Do you want to start the svcgssd daemon? It is only required for Kerberos
  # exports. Valid alternatives are "yes" and "no"; the default is "no".
  NEED_SVCGSSD=""

  # Options for rpc.svcgssd.
  RPCSVCGSSDOPTS=""

/etc/exports 中仅未注释的条目是:*

 /home/john/someDir  192.168.2.0/24(ro,sync,fsid=0,no_subtree_check)
 /home/john/someDir  192.168.6.0/24(ro,sync,fsid=0,no_subtree_check)

/etc/nfs.conf 中仅未注释的条目是:

  [general]
  pipefs-directory=/run/rpc_pipefs

  [mountd]
  # debug=0
  manage-gids=y

还有一点观察:当我将 VPN 服务器配置为 NFS 客户端时,它能够看到从 NFS&SSH 服务器导出的 NFS 文件夹。我这样做只是为了测试基本 NFS 设置是否正确。

答案1

nfs-kernel-serverUbuntu 的版本(至少对于 Ubuntu 22.04.*)有一个错误。我切换到 Debian Bullseye 的版本nfs-kernel-server,然后通过 VPN 隧道挂载就可以了。

相关内容