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

Как использовать командную строку putty (и / или plink) для пересылки через 2 промежуточных хоста в базу данных?

Мне нужно написать сценарий для некоторых сотрудников для подключения по следующей топологии, используя закрытый ключ для аутентификации (один и тот же ключ для каждого человека работает как при доступе к бастиону, так и к базе данных):

 ┌────────────┐    ┌────────────┐     ┌────────────┐     ┌────────────┐
 │            │    │            │     │            │     │            │
 │  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`