挂载没有直接路由的服务器的远程目录,但有一个仅接收 ssh 连接的中间服务器

挂载没有直接路由的服务器的远程目录,但有一个仅接收 ssh 连接的中间服务器

我面临的设置是这样的:

在服务器 A 上我想从服务器 B 挂载一个目录(我们称之为SHARED)。没有路由,也没有办法从 A 到 B 或从 B 到 A 添加任何路由。相反,在 B 中挂载来自 A 的目录也是必要的。

有第三台服务器 C。C 可以 ping 通 A 和 B,但无法 pingssh通其中任何一个。但 A 和 B 可以sshping 通 C。C 无法 NFS(或 Samba)导出目录。

回答接近它,但它缺少目录的公共共享的第二个分支。

如果无法在 B 中挂载 A 的目录(反之亦然),那么有没有办法在 C 中挂载一个由 A 和 B 共享的目录,就像将 C 导出为 NFS 共享一样,但使用sshfs反向模式?

答案1

sshfs

A 和 B 可以ssh到 C。

有没有办法在 C 中挂载一个由 A 和 B 共享的目录,就像将 C 导出为 NFS 共享一样,但使用sshfs反向模式?

我不知道你说的“反向模式”是什么意思,但是既然你可以ssh从 A 到 C,那么你应该能够sshfs在 A 上运行以挂载 C 上存在的目录(除非 C 上的 SSH 服务器不支持 SFTP)。这很简单:

# on A
sshfs user@C:/specific/dir/of/C /some/mountpoint

B 也是一样。这样 A 看到的/specific/dir/of/C将是/some/mountpointA 上的;而 B 看到的将/specific/dir/of/C/some/mountpointB 上的。

缺点:

  • 无论 A (或 B) 对其做什么/some/mountpoint,在 C 上它都会通过 来完成usersshfs在 A (或 B) 上使用 FUSE 和有一种方法可以允许调用者以外的用户在 A(或 B)上使用它,仍然在 C 上它们都将充当user

  • user如果A 指定的目录与 B 指定的目录不同user,并且两个用户无法在 C 上找到在所有权和权限方面适合他们的“公共”目录,则可能出现其他问题。

  • 将文件从 A 复制到 B(或从 B 复制到 A)需要将其从 A(B)上传到 C,然后从 C 下载到 B(A)。您无法仅通过执行 A xor B 来实现此目的。

  • 此外,这种复制要求您下载速度不要太快(或不要太早),因此当您到达文件末尾时,这才是真正的结束,而不是因为您赶上了同时运行并将继续追加到 C 上现有文件的上传过程。实际上,您很可能希望一端在另一端下载(或使用)文件之前完全上传。在复制目录时,下载程序很可能希望等待上传程序上传整个目录,否则可能会错过一些文件。


隧道链接

从 A 可以通过连接两个 SSH 隧道到达 B 的 TCP 端口。在这是另一个答案我通过从“中间节点”进行操作来执行此操作,因为在这种情况下,从中间到两端都有 SSH 访问权限。您需要通过从两端向“中间节点”(即您的 C)进行操作来执行此操作,因为这些是您可以ssh进入的方向。请按如下方式继续:

# on A
ssh -N -L 3333:localhost:4444 user@C
# on B
ssh -N -R 4444:localhost:5555 user@C

当这些工作时,任何连接到 A 的进程localhost:3333都将通过隧道传输到localhost:4444C,最终传输到localhost:5555B。

33334444是任意端口,请根据需要调整数字(注意特权端口)。5555是您要访问的服务在 B 上使用的端口。

笔记:

  • 这种情况是对称的,因此要从 B 到达 A 的服务,只需在上面的例子中交换 A 和 B。
  • 某些服务需要多个端口。
  • 您可以在一次调用中使用多个-Land/or选项。这意味着您只需在 A 上使用一个隧道,在 B 上使用一个隧道,即可建立多个链式隧道(一些朝一个方向,一些朝相反方向)。-Rsshsshssh
  • ~/.ssh/config是你的朋友。在 A 和 B 上,在配置文件中定义隧道的相应部分,然后ssh -N user@C在每一端都定义隧道就足够了。请参阅man 5 ssh_config
  • autossh也是你的朋友。
  • SSH 无法通过 UDP 隧道传输数据。不要相信另一个答案, 他们是有缺陷的。 一般来说ssh -w可以使用这个很难(硬即使您不需要链接连接。

相关内容