我有一个运行多个容器的系统。每个容器都是具有特定用途的 Linux 系统,每个容器都启用了 ssh 服务器。我想创建一个实体来管理与主机的新 ssh 连接,并根据条件将该连接透明地路由到特定容器(该容器也有 ssh 监听)。我知道我可以使用 ProxyCommand 透明地将连接路由到容器。我的问题是,我想根据其他标准“动态”将连接重新路由到另一个容器,例如:如果主机检测到与容器 A 的连接开始下载二进制文件,则将 ssh 连接透明地重新路由到容器 B 并在那里开始下载。我想以一种方式来做到这一点,即系统用户不会意识到他在容器中,并且在他使用系统时连接正在不同的容器之间路由。
一个有助于理解的完整示例是:客户端连接到 ssh。此连接与运行容器 A 和 B 的主机建立。主机有一个进程,默认情况下(或基于某些条件)将此传入的 ssh 连接重定向到容器 A。主机通过嗅探数据包和检查客户端传递的命令来不断分析客户端在容器 A 中执行的操作。如果主机检测到某些特定命令(如“wget”),主机会透明地将 ssh 连接从容器 A 重新路由到容器 B,这样客户端就不会意识到容器已更改,然后在容器 B 中开始下载。
编辑:
我正在使用 Docker,并且交换连接的容器始终具有相同的环境(相同的操作系统和版本)。
编辑2:
我希望通过某种方式重新路由连接来实现这一点,以便在其他情况下应用此方法,例如以下示例:我有主机 X,其中有容器 A。当客户端连接到主机 X 时,ssh 连接被重新路由到与侦听 ssh 位于同一网络中的主机 Y。像以前一样,根据条件,主机 X 将 ssh 从主机 Y 重新路由到容器 A,对用户透明。
我如何使用路由、iptables 或任何其他重定向连接的方法来实现这一点?
编辑3:
基本上,我需要一种方法来将 ssh 从一台机器重新路由到另一台机器,而无需明显的重新连接。最简单的情况是一台机器 (A) 处理来自客户端的连接。来自互联网的客户端连接到这台机器 (A),该机器使用 ProxyCommand 将连接重定向到机器 (B)。为了简单起见,让我们假设我们有一个计时器,5 分钟后在机器 (A) 中执行一个脚本,该脚本会产生神奇的效果。我想要的是一种可以将这个 ssh 连接从机器 (B) 路由到机器 (C) 的方法。棘手的部分是,我希望用户 (客户端) 不会注意到从 B 到 C 的这种变化。我希望客户端不会注意到路由的连接和他最初连接的机器在他使用时已经发生了变化。因此,对于这个“幻觉”,我想象如果有一种方法可以让原始连接保持与客户端的活动状态,但将机器 (A) 中的连接从 B 路由到 C,并且当客户端执行下一个命令而不是机器 (B) 时,机器 (C) 将执行该命令。