Мне нужно написать сценарий для некоторых сотрудников для подключения по следующей топологии, используя закрытый ключ для аутентификации (один и тот же ключ для каждого человека работает как при доступе к бастиону, так и к базе данных):
┌────────────┐ ┌────────────┐ ┌────────────┐ ┌────────────┐
│ │ │ │ │ │ │ │
│ desktop │───>│ bastion │────>│ db access │────>│ db 3306 │
│ (windows) │ │ (linux) │ │ (linux) │ │ (mysql) │
└────────────┘ └────────────┘ └────────────┘ └────────────┘
Затем мои коллеги будут использовать это соединение в инструменте запросов к базе данных рабочего стола.
Чтобы упростить развертывание, я хочу указать всю конфигурацию в командной строке, не обращаясь к каким-либо сохраненным данным сеанса, настроенным в пользовательском интерфейсе Putty. У меня есть файлы .ppk для закрытых ключей, на которые может ссылаться сценарий.
Какая (возможно, очень длинная) командная строка putty и / или plink сделает это возможным?
Исходя из моей интерпретации руководства, я пробовал это:
plink -ssh -2 -i C:\temp\key.ppk -agent -A -t -l user -L 6035:127.0.0.1:6035 user@BASTION ssh -v -L 6035:DBHOST:3306 user@DBACCESS
Это приводит меня к бастиону, но затем он ищет закрытый ключ на бастионе, чтобы установить соединение с доступом к базе данных.
Я могу подключиться к нему с помощью ssh со своего Mac (код показан ниже), поэтому я знаю, что текущая конфигурация ящиков разрешает такой доступ. Я ищу решение для шпатлевки / плинка для доступа из оконных ящиков.
ssh -v -A -t \
-L ${LOCAL_PORT}:localhost:${LOCAL_PORT} ${USER}@${BASTION_HOST} \
-t ssh -v -L ${LOCAL_PORT}:${DB_HOST}:${DB_PORT} ${USER}@${DB_ACCESS_HOST}
С выпуском PuTTY 0.68 plink
получил новый параметр командной строки под названием -proxycmd
. Использование этой новой функции дает более надежное и менее загроможденное решение проблемы. ИМХО.
К сожалению, для -proxycmd
вариант. Он выполняет локальную команду и использует ее как прокси. Можно использовать даже plink
с -nc
возможность создать туннель до db access
хост.
Для вашей топологии команда, выполняемая на desktop
машины это в командной строке выглядит так:
plink -A ^
-proxycmd "plink -A -nc DBACCESS:22 user@BASTION" ^
-L 6035:DBHOST:3306 ^
user@DBACCESS
Примечание: для входа без пароля peagent
должен работать на desktop
host и загрузите соответствующие ключи. Как уже упоминалось в комментариях, переадресация агента должна быть включена на bastion
хосты, чтобы он работал без проблем.
Соединение выглядит как изображение ASCII ниже. Внешний туннель идет к хосту db access
через команду прокси. Инкапсулирован в туннелях plink
и устанавливает порт вперед к db
хост.
┌────────────┐ ┌────────────┐ ┌────────────┐ ┌────────────┐
│ │ │ │ │ │ │ │
│ ───────────────────────────── │ │ │
│ (1) │ │ │
│ ──────────────────────────────────────────── │
│ (2) │
│ ──────────────────────────────────────────── │
│ ───────────────────────────── │ │ │
│ desktop │ │ bastion │ │ db access │ │ db 3306 │
│ (windows) │ │ (linux) │ │ (linux) │ │ (mysql) │
└────────────┘ └────────────┘ └────────────┘ └────────────┘
1) Tunnel via `-proxycmd "plink -A -nc DBACCESS:22 user@BASTION"`
2) Proxied `plink` connection with port forward `-L 6035:DBHOST:3306`