Скопіюйте дані через тунель SSH через кілька переходів


14

У нас є два основних середовища:

Розвиток та забезпечення якості

Кожне середовище має два сервери:

  • Стрибок
  • Сервер додатків

Для того, щоб підключитися до сервера додатків, потрібно спочатку підключитися до вікна стрибка, а потім SSH до сервера додатків.

Існує кілька правил, які надаються за допомогою брандмауера:

  • Ви ОБОВ'ЯЗКОВО підключитися до сервера додатків через вікно переходу
  • Сервер додатків не може підключитися ні до перемикачів
  • Стрибки знаходяться в одній підмережі, і МОЖЕ говорити один з одним.

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

У нас багато вмісту (670 ГБ) DEVELOPMENT APPLICATION SERVER, і нам потрібно перейти до цього QA APPLICATION SERVER.

Скопіювати ці дані у вікна для стрибків не є можливим, оскільки їм не вистачає необхідної кількості місця.

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

Чи є у нас варіанти? Це стає відчайдушною ситуацією, а час - суттєвим. У нас немає часу завантажувати дані та повторно завантажувати їх. Копіювання через мережу на сервери пройде швидко, оскільки це гігабітне з'єднання.


2
Після встановлення з'єднання ви можете скопіювати будь-який спосіб: $ devel_host $ tar -cf - | ssh -t jumbox 'ssh app_serv "tar -xf -"' або іншим способом навколо дьогтю.
Alex_www

тож ми можемо підключитися від програми для переходу з програми для Dev-сервера додатків, але не іншим способом. Якщо у нас встановлено цей зв’язок, ми можемо скопіювати будь-який спосіб? який найкращий спосіб перенести цей вміст на інший сервер додатків, не попередньо зберігаючи його на перехідних полях?
Баррі Чапман

Саме "трубопровід" "дьогтю" є найпростішим рішенням.
Alex_www

Відповіді:


15

На сьогодні найпростіший спосіб - просто скопіювати його через scp. Плюс цей синтаксис насправді працює на відміну від деяких інших пропозицій.

Ви не можете перемогти цей синтаксис для зручності. Це дозволяє рекурсивно копіювати, rsync чи що завгодно, без клопоту розглядати потенційно складні труби. Цей синтаксис інтуїтивно зрозумілий, він буде більш сприятливим для підтримки Sys Admins, які стежать за вами і не користуються кіткою марно .

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

З сторінки man scp : -3копії між двома віддаленими хостами передаються через локальний хост. Без цього параметра дані копіюються безпосередньо між двома віддаленими хостами. Зауважте, що ця опція вимикає вимірювач прогресу.

У наведеному нижче прикладі

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



Ось файл ~ / .ssh / config, який встановлює прямий доступ зі своєї робочої станції до серверів додатків через відповідний стрибок (ака-сервер бастіону).

MacBook-Pro: ~ barrychapman $ cat ~ / .ssh / config
Ведучий *
  ServerAliveInterval 60
Розміщувач застосунку
  HostName devapplicationserver.local
  ProxyCommand ssh -i ~ / .ssh / id_rsa barrychapman@devjumpserver.example.com -W% ​​h:% p
  Користувач barrychapman
Хост-сервер Qaapplication
  HostName qaapplicationserver.local
  ProxyCommand ssh -i ~ / .ssh / id_rsa barrychapman@qajumpserver.example.com -W% ​​h:% p
  Користувач barrychapman

MacBook-Pro: ~ barrychapman $



Тестуючи наявність файлу на цільовому сервері, його там не буде.

MacBook-Pro: ~ barrychapman $ ssh qaapplicationserver ls / tmp / hosts
ls: не може отримати доступ / tmp / hosts: Немає такого файлу чи каталогу
Загинув за сигналом 1.
MacBook-Pro: ~ barrychapman $



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

MacBook-Pro: ~ barrychapman $ scp -3 devapplicationserver: / etc / hosts qaapplicationserver: / tmp /
Загинув за сигналом 1.
Загинув за сигналом 1.
MacBook-Pro: ~ barrychapman $



Тепер перевіримо наявність скопійованого файлу на сервері прикладних програм QA. Це буде цього разу.

MacBook-Pro: ~ barrychapman $ ssh qaapplicationserver ls / tmp / hosts
/ tmp / господарі
Загинув за сигналом 1.
MacBook-Pro: ~ barrychapman $ 

Примітка

Закриваючи з'єднання ProxyCommand, ви побачите попереджувальне повідомлення "Убитий сигналом 1". Це SSH, що розриває з'єднання ProxyCommand, і це нічого не турбує. Ви можете позбутися від нього, додавши LogLevel Quietв конфігурацію хоста бастіонного конфігурації.


Ура, це вирішило нашу проблему. Щасливого Різдва!
Баррі Чапман

Що ви маєте на увазі під "строфою конфігурації хостового бастіона" ?? @BraveNewCurrency?
Ендрю Вулф

Я вважаю, що кожен рядок "Хост" та конфігурації під ним є строфою (як у поезії.) Якщо ви додасте "LogLevel Quiet" під вашим бастіонним рядком "Host", він застосовуватиметься лише до цього хоста.
BraveNewCurrency

8

ТРУБИ!

Якщо в Інтернеті є серія труб , Unix - це серія труб - щось на зразок:

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

повинні працювати.

Якщо вам потрібно проїхати більше хостів, додайте більше труб (і більше вкладених шарів \пропозицій), якщо це потрібно. (Однак зауважте, що якщо трубопровід / втеча стає настільки складним, що вам доведеться намалювати схему або вдатися до підрахунку на пальцях, щоб визначити, скільки разів вам доведеться подвоїтись на втечах , можливо, пора визнати поразку та встановити належний VPN !)


1
Як зазначив Alex_www у своєму коментарі, якщо вам не потрібен проміжний файл ні для чого, ви також можете просто передати висновок tarнавколо. (Крім того, вам не потрібно на catпроміжних етапах трубопроводу - sshвін із задоволенням їсть stdin і передає його. catПросто мені стає краще і є заповнювачем інших корисних команд, які ви можете використовувати, наприклад tee.)
voretaq7

Я думаю , що проблема в OP є не машина, і є дані , і може зробити з'єднання, не існує якоїсь - або один апарат , який може бачити все і всіх (виступати в якості роз'єму для всіх труб).
MadHatter

1
@MadHatter Якщо це так, спрацює поєднання наших двох відповідей (підключіться до сервера розробників, переадресувавши порт назад на SSH-порт сервера стрибків, а потім запустіть конвеєр SSH через цей порт). Це, звичайно, робить рішення все більш огидним до того, що люди почнуть протестувати поза вашим офісом з великими знаками, які говорять VPN! NOW!про них ...
voretaq7

Чому так. Так, вони б. Сподіваюсь!
MadHatter

Чи буде це означати, що проміжний сервер (у цьому випадку user@host1) в якийсь момент матиме повний cat ginormous-fileобсяг пам’яті в будь-якій точці? Або дані просто надсилаються безпосередньо user@host2? Або воно якось струменеве? Наскільки це має tarвідношення? Напевно, це стосується другого до останнього питання, яке я задав. Жодне з цих питань не є риторичним btw ...
hello_there_andy

1

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

Ви можете вирішити це за допомогою tushling 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.