无直接路由的服务器间双向挂载目录及借助中间服务器实现类NFS共享的方案咨询
嘿,这个网络拓扑确实有点绕,不过咱们可以通过SSH隧道+SSHFS的组合来搞定这两个需求,分两种场景给你拆解:
一、实现A与B的双向目录挂载(A挂B的SHARED,B挂A的目录)
因为A和B互相不能直接通信,但都能SSH到C,咱们可以把C当作中转节点,建立A和B之间的SSH隧道,再用SSHFS完成挂载。
1. A挂载B的SHARED目录
第一步:在B上建立到C的反向SSH隧道,把B的SSH服务暴露给C
在B的终端执行命令(user_c替换成你在C上的用户名):# 后台运行隧道,保持连接 ssh -fN -R 2222:localhost:22 user_c@C这条命令会让C监听自己的2222端口,所有发往该端口的流量都会通过SSH隧道转发到B的22端口(也就是B的SSH服务)。
第二步:在A上建立到C的正向隧道,把C的2222端口映射到A本地
在A的终端执行:ssh -fN -L 2223:localhost:2222 user_c@C现在A的本地2223端口就相当于直接连接到B的SSH服务了。
第三步:用SSHFS挂载B的SHARED目录到A
假设A的挂载点是/mnt/B_SHARED,user_b是B上的用户名,/path/to/SHARED是B上要共享的目录路径:sshfs user_b@localhost:/path/to/SHARED /mnt/B_SHARED -p 2223
2. B挂载A的目录(反向操作,逻辑完全一致)
- 在A上建立反向隧道到C:
ssh -fN -R 3333:localhost:22 user_c@C - 在B上建立正向隧道映射C的3333端口:
ssh -fN -L 3334:localhost:3333 user_c@C - B上挂载A的目标目录:
sshfs user_a@localhost:/path/to/A_DIR /mnt/A_SHARED -p 3334
二、在C上实现类NFS的双向共享(A和B共用C上的同一个目录)
其实这个需求更简单——你可能误解了SSHFS的使用条件:C不需要配置NFS或Samba,只要它开了SSH服务,A和B能SSH上去,就能直接用SSHFS挂载C的目录,实现类似NFS的共享效果。
具体步骤:
在C上创建共享目录并设置权限
比如创建/opt/bidirectional_shared,并确保A和B在C上的账号有读写权限:mkdir -p /opt/bidirectional_shared # 调整权限,比如让所属组有读写权限,把A、B的C账号加入同一组 chmod 775 /opt/bidirectional_sharedA挂载C的共享目录到本地
假设A的挂载点是/mnt/C_SHARED:# 可以加-o reconnect参数实现断线自动重连 sshfs user_c@C:/opt/bidirectional_shared /mnt/C_SHARED -o reconnectB挂载C的同一个共享目录到本地
执行和A一样的命令即可:sshfs user_c@C:/opt/bidirectional_shared /mnt/C_SHARED -o reconnect
这样A和B读写本地挂载点的内容,都会同步到C的共享目录里,完全达到类似NFS的共享效果。
一些实用小贴士
- 隧道稳定性:如果担心SSH隧道断开,可以用
autossh替代ssh,它能自动重连断开的隧道,比如:autossh -M 0 -fN -R 2222:localhost:22 user_c@C - SSHFS性能优化:如果是大文件频繁读写,可以加缓存参数提升性能:
sshfs user_b@localhost:/path/to/SHARED /mnt/B_SHARED -p 2223 -o cache=yes -o kernel_cache - 权限排查:如果出现挂载失败、读写报错,优先检查各个节点上的用户对目标目录、挂载点的权限是否足够。
备注:内容来源于stack exchange,提问作者Luis

