多个Linux系统容器之间的ssh透明路由

多个Linux系统容器之间的ssh透明路由

我有一个运行多个容器的系统。每个容器都是一个具有特定用途的 Linux 系统,并且每个容器都启用了 ssh 服务器。我想创建一个实体来管理与主机的新 ssh 连接,并根据标准将该连接透明地路由到特定容器(女巫也有 ssh 侦听)。例如,我知道我可以使用 ProxyCommand 透明地将连接路由到容器。我的问题是,我想根据其他条件“动态”重新路由到另一个容器的连接,例如:如果主机检测到到容器 A 的连接开始下载二进制文件,则重新路由 ssh 连接透明地传输到容器 B 并开始在那里下载。我希望以一种方式做到这一点,即系统的用户在使用系统时不会意识到他位于容器中并且连接在不同容器之间路由。

可能有助于理解的完整示例是:客户端连接到 ssh。此连接是与正在运行容器 A 和 B 的主机建立的。主机有一个进程,默认情况下(或基于某些条件)将此传入 ssh 连接重定向到容器 A。主机通过嗅探数据包并检查客户端传递的命令来不断分析客户端在容器 A 中执行的操作。如果主机检测到某些特定命令(例如“wget”),主机会透明地重新路由从容器 A 到容器 B 的 ssh 连接,客户端不会意识到容器已更改,然后在容器中开始下载B.

基本操作

我正在使用 Docker,并且将交换连接的容器始终具有相同的环境(相同的操作系统和版本)。

编辑:

我想要一种通过某种重新路由连接来实现此目的的方法,以便在其他情况下应用此方法,例如以下示例:我的主机 X 具有容器 A。当客户端连接到主机 X 时,ssh 连接将被重新路由到与侦听 ssh 位于同一网络中的主机 Y。与之前一样,主机 X 根据条件将 ssh 从主机 Y 重新路由到容器 A,对用户透明。

如何使用路由、iptables 或任何其他重定向连接的方法来实现此目的?

编辑2:

基本上我需要一种方法将 ssh 从一台机器重新路由到另一台机器,而不需要明显的重新连接。最简单的情况是一台机器 (A) 处理来自客户端的连接。来自 Internet 的客户端连接到这台计算机 (A),并使用 ProxyCommand 将连接重定向到计算机 (B)。为了简单起见,我们假设我们有一个计时器,5 分钟后会在机器 (A) 中执行一个脚本来发挥魔力。我想要的是一种可以将此 ssh 连接从机器 (B) 路由到机器 (C) 的方法。棘手的部分是我希望用户(客户端)不会注意到从 B 到 C 的这种更改。我希望客户端在使用时不会注意到路由的连接和他最初连接的机器发生了变化。因此,对于这个“幻觉”,我想象是否有一种方法可以使原始连接保持对客户端的活动状态,但在机器(A)中将连接从B路由到C,并且当客户端执行下一个命令而不是机器(B)时机器(C)将执行该命令。

答案1

不;

不可能以稳健的方式实现这一点。当然,您可以破解某些东西(通过将 shell 包装在脚本中),但任何不平凡的使用都会立即暴露您在做什么,并且会破坏。此外,没有充分的理由说明为什么有人会想要这个。无论你最终想要实现什么目标,都有更好的方法。

如果这符合您未声明的最终目标,您可以进行“使用 CRIU 进行实时迁移” https://linuxcontainers.org/lxd/introduction/

相关内容