Копирование данных через туннель SSH через несколько переходов

14

У нас есть две основные среды:

Разработка и QA

Каждая среда имеет два сервера:

  • Jump Box
  • Сервер приложений

Чтобы подключиться к серверу приложений, вы должны сначала подключиться к переключателю, а затем SSH к серверу приложений.

Есть несколько правил, любезно предоставленных брандмауэром:

  • Вы ДОЛЖНЫ подключиться к серверу приложений через поле перехода
  • Сервер приложений не может подключиться ни к одному из переключателей
  • Коробки переходов находятся в одной подсети, и МОГУТ общаться друг с другом.

Наша проблема

У нас есть много контента (670 ГБ) DEVELOPMENT APPLICATION SERVER, и мы должны передать это QA APPLICATION SERVER.

Копирование этих данных в поля переходов не вариант, потому что им не хватает необходимого места.

Я провел некоторое исследование и узнал, что мы можем потенциально провести серию туннелей через эти серверы, чтобы мы могли передавать данные прямо с одного сервера приложений на другой через туннели. Однако проблема в том, что мы не можем подключиться к переходной коробке с сервера приложений.

У нас есть варианты? Это становится отчаянной ситуацией, и время имеет существенное значение. У нас нет времени на скачивание данных и их повторную загрузку. Копирование по сети на серверах будет происходить быстро, так как это гигабитное соединение.

Барри Чепмен
источник
2
После того, как соединение установлено, вы можете скопировать любым из следующих способов: $ devel_host $ tar -cf - | ssh -t jumbox 'ssh app_serv "tar -xf -"' или другой способ использования tar.
Alex_www
таким образом, мы можем подключиться из dev jump box к серверу приложений dev, но не другим способом. Если у нас установлено это соединение, мы можем скопировать в любом случае? Каков наилучший способ переместить этот контент на другой сервер приложений, не сохраняя его в полях перехода?
Барри Чепмен
Собственно, «обвязка» «смолой» - самое простое решение.
Alex_www

Ответы:

15

Безусловно, самый простой способ - просто скопировать его через scp. Кроме того, этот синтаксис на самом деле работает в отличие от некоторых других предложений.

Вы не можете победить этот синтаксис для простоты. Это позволяет вам рекурсивно копировать, rsync или все, что вам нужно, без необходимости рассматривать потенциально сложные каналы. Этот синтаксис интуитивно понятен, его будут более легко поддерживать администраторы Sys, которые следуют за вами, и не используют бесполезно cat .

scp -3 devappserver:/path/to/copy/from qaappserver:/path/to/copy/to

Со страницы руководства scp : -3Копии между двумя удаленными хостами передаются через локальный хост. Без этой опции данные копируются непосредственно между двумя удаленными хостами. Обратите внимание, что эта опция отключает индикатор прогресса.

В приведенном ниже примере

  • Ваша рабочая станция называется MacBook-Pro.
  • Dev Jump Box называется devjumpserver
  • Сервер приложений Dev называется devapplicationserver
    • Находится в локальной сети DNS зона с именем .local
  • QA Jump Box называется qajumpserver
  • Сервер приложений QA называется qaapplicationserver
    • Находится в локальной сети DNZ зоны с именем .local
  • Мы выполним тестовую копию файла 670GB / etc / hosts ;-)
  • Предполагается, что у вас настроена аутентификация с открытым ключом SSH.



Вот файл ~ / .ssh / config, который устанавливает прямой доступ с вашей рабочей станции к серверам приложений через соответствующий переход (он же бастионный сервер).

MacBook-Pro: ~ barrychapman $ cat ~ / .ssh / config
Хост *
  ServerAliveInterval 60
Хост devapplicationsever
  HostName devapplicationserver.local
  ProxyCommand ssh -i ~ / .ssh / id_rsa barrychapman@devjumpserver.example.com -W% ​​h:% p
  Пользователь barrychapman
Хост qaapplicationserver
  HostName qaapplicationserver.local
  ProxyCommand ssh -i ~ / .ssh / id_rsa barrychapman@qajumpserver.example.com -W% ​​h:% p
  Пользователь barrychapman

MacBook-Pro: ~ Барричапман $



Проверка наличия файла на целевом сервере, его там не будет.

MacBook-Pro: ~ barrychapman $ ssh qaapplicationserver ls / tmp / hosts
ls: не может получить доступ к / tmp / hosts: нет такого файла или каталога
Убит по сигналу 1.
MacBook-Pro: ~ Барричапман $



Теперь давайте скопируем файл с сервера приложений Dev в приложение QA через вашу рабочую станцию.

MacBook-Pro: ~ barrychapman $ scp -3 сервер удаленных приложений: / etc / hosts qaapplicationserver: / tmp /
Убит по сигналу 1.
Убит по сигналу 1.
MacBook-Pro: ~ Барричапман $



Теперь давайте проверим наличие скопированного файла на сервере приложений QA. Это будет там на этот раз.

MacBook-Pro: ~ barrychapman $ ssh qaapplicationserver ls / tmp / hosts
/ TMP / хостов
Убит по сигналу 1.
MacBook-Pro: ~ Барричапман $ 

Заметка

При закрытии соединения ProxyCommand вы увидите предупреждающее сообщение «Убит по сигналу 1». Это SSH разрывает соединение ProxyCommand и не о чем беспокоиться. Вы можете избавиться от этого, добавив LogLevel Quietв ваш раздел конфигурации хоста ваш бастион.

appx
источник
Ура, это решило нашу проблему. С Рождеством!
Барри Чепмен
Что ты имеешь в виду под "stanza config config бастиона" ?? @BraveNewCurrency?
Эндрю Вулф
Я считаю, что каждая строка «Host» и конфиги под ней являются строфой (как в поэзии). Если вы добавите «LogLevel Quiet» под строкой «Host» бастиона, она будет применяться только к этому хосту.
BraveNewCurrency
8

ТРУБЫ!

Если Интернет представляет собой серию каналов, Unix - это серия каналов - что-то вроде:

cat ginormous-file | ssh user@host1 "cat | ssh user@host2 \"cat >out\" "

должно сработать.

Если вам нужно пройти больше хостов, добавьте больше каналов (и больше вложенных слоев \цитаты -escaped) по мере необходимости. (Тем не менее, обратите внимание, что если конвейер / побег становится настолько сложным, что вам нужно нарисовать диаграмму или прибегнуть к подсчету пальцев, чтобы определить, сколько раз вам нужно удвоиться на побегах , возможно, пришло время признать поражение и настроить подходящий VPN !)

voretaq7
источник
1
Как указал Alex_www в своем комментарии, если вам не нужен промежуточный файл для чего-либо, вы также можете просто передать результат tarвокруг. (Кроме того, в вас не нужноcat на промежуточных этапах трубопровода - sshэто с удовольствием едят и реле стандартного ввода НЕГО. catПросто заставляет меня чувствовать себя лучше и является заполнителем для других полезных команд , которые вы можете использовать, как tee.)
voretaq7
Я думаю , что проблема в OP является не машина, и есть данные , и может сделать соединение, не существует какой - либо один аппарат , который может видеть все и всех (выступать в качестве разъема для всех труб).
MadHatter
1
@MadHatter В этом случае сработает комбинация двух наших ответов (подключитесь к серверу dev, перенаправив порт обратно на порт SSH сервера перехода, затем запустите конвейер SSH через этот порт). Это, конечно, делает решение все более отвратительным до такой степени, что люди начнут протестовать вне вашего офиса с большими знаками, которые говорят VPN! NOW!на них ...
voretaq7
Почему да. Да, они будут. С надеждой!
MadHatter
Означает ли это, что промежуточный сервер (в данном случае user@host1) в какой-то момент будет иметь полное cat ginormous-fileхранилище в любой точке? Или данные просто отправляются напрямую user@host2? Или это как-то потекло? Насколько это tarактуально? Я думаю, это относится ко второму и последнему вопросу, который я задал. Ни один из этих вопросов не является риторическим, кстати ...
hello_there_andy
1

Если я правильно понимаю, у вас есть два сервера переходов (jump-qa и jump-dev), защищающие два сервера приложений (app-qa и app-dev); серверы перехода могут соединяться друг с другом по ssh; никакое поле, кроме соответствующего сервера перехода, не может подключиться к соответствующему серверу приложений. Серверы приложений могут SSH к никто. Файл должен быть перенесен из app-dev в app-qa. На обоих серверах прыжков не хватает места для промежуточной копии данных.

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

Настройте туннели (каждую из этих команд нужно будет запустить в отдельном окне jump-qa):

jump-qa% ssh app-qa -R 2345:localhost:2346
jump-qa% ssh jump-dev -L 2346:app-dev:22

Теперь вы должны найти, что в app-qa вы можете сделать это telnet localhost 2345и получить ssh-баннер app-dev. Затем вы можете скопировать файл данных:

app-qa% scp -P 2345 localhost:/path/on/app-dev/data.dat data.dat
Безумный Шляпник
источник
Есть два переключателя - один перед сервером приложений QA, а другой перед сервером приложений DEV. Коробки прыжка могут общаться друг с другом
Барри Чепмен
Есть ли у клиента место для промежуточной копии?
MadHatter
Нет, не хватает места
Барри Чепмен
когда вы говорите клиент, на какой сервер вы ссылаетесь?
Барри Чепмен
Я неправильно понял. В настоящее время я понимаю, что нет клиента; Есть два сервера прыжков и два сервера приложений.
MadHatter