我已经设置了 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-server
Ubuntu 的版本(至少对于 Ubuntu 22.04.*)有一个错误。我切换到 Debian Bullseye 的版本nfs-kernel-server
,然后通过 VPN 隧道挂载就可以了。