Назад | Перейти на главную страницу

прозрачная маршрутизация ssh между несколькими контейнерами системы Linux

У меня есть система, в которой я запускаю несколько контейнеров. Каждый контейнер - это Linux-система с определенной целью, и в каждом контейнере включен ssh-сервер. Я хочу создать объект, который управляет новыми ssh-подключениями к хост-машине и прозрачно маршрутизирует это подключение к определенному контейнеру (ведь у него тоже есть ssh-прослушивание) на основе критериев. Я знаю, что могу прозрачно маршрутизировать подключения к контейнеру, например, с помощью ProxyCommand. Моя проблема в том, что я хочу перенаправить подключение к другому контейнеру «на лету» на основе других критериев, например: если хост-компьютер обнаружил, что подключение к контейнеру A начало загрузку двоичного файла, перенаправьте соединение ssh прозрачно в контейнер B и начать загрузку оттуда. Я хочу сделать это таким образом, чтобы пользователь системы не осознавал, что он находится в контейнере, а соединение маршрутизируется между разными контейнерами, пока он использует систему.

Полный пример, который может помочь понять: клиент подключается к ssh. Это соединение выполняется с хост-машиной, на которой запущены контейнеры A и B. На хост-машине есть процесс, который перенаправляет это входящее ssh-соединение в контейнер A по умолчанию (или в зависимости от некоторых условий). Хост-компьютер продолжает анализировать, что клиент делает в контейнере A, обнюхивая пакеты и проверяя команды, переданные клиентом. Если хост-машина обнаруживает некоторую конкретную команду, например "wget", хост-машина прозрачно перенаправляет ssh-соединение из контейнера A в контейнер B таким образом, чтобы клиент не осознавал, что контейнер изменился, а затем начинается загрузка в контейнере Б.

Редактировать:

Я использую Docker, и контейнеры, которые меняют соединение, всегда имеют одинаковую среду (та же ОС и версия).

Изменить 2:

Мне нужен способ сделать это с помощью некоторой перенаправления соединения, чтобы применить эту методологию в других случаях, таких как этот пример: у меня есть хост X с контейнером A. Когда клиент подключается к хосту X, соединение ssh перенаправляется для хоста Y, который находится в той же сети, что и прослушивающий ssh. Как и раньше, в зависимости от условия хост X перенаправляет ssh с хоста Y в контейнер A прозрачно для пользователя.

Как я могу сделать это с помощью маршрутизации, iptables или любого другого метода перенаправления соединения?

Изменить 3:

В основном мне нужен способ перенаправить ssh с одного компьютера на другой без заметного повторного подключения. Самый простой случай - это одна машина (A), которая обрабатывает соединение от клиента. Клиент из Интернета подключается к этому компьютеру (A), который перенаправляет соединение с компьютером (B) с помощью ProxyCommand. Для простоты представим, что у нас есть таймер, который через 5 минут выполняет сценарий на машине (A), который творит чудеса. Я хочу, чтобы я мог направить это ssh-соединение с машины (B) на машину (C). Сложность в том, что я хочу, чтобы это изменение с B на C не было замечено пользователем (клиентом). Я хочу, чтобы клиент не заметил, что маршрутизируемое соединение и машина, к которой он был первоначально подключен, изменились во время его использования. Итак, для этой «иллюзии» я представляю, есть ли способ сохранить исходное соединение с клиентом, но направить соединение на машине (A), от B к C, и когда клиент выполняет следующую команду вместо машины (B), машина (C) выполнит эту команду.