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

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

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

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

В каждой среде есть два сервера:

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

Благодаря брандмауэру существует несколько правил:

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

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

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

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

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

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

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

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
    • Находится в зоне LAN DNZ с именем .local
  • Мы сделаем тестовую копию файла / etc / hosts размером 670 ГБ ;-)
  • Предполагается, что у вас настроена аутентификация с открытым ключом SSH.



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

MacBook-Pro:~ barrychapman$ кошка ~ / .ssh / config
Host *
  ServerAliveInterval 60
Host devapplicationsever
  HostName devapplicationserver.local
  ProxyCommand ssh -i ~/.ssh/id_rsa barrychapman@devjumpserver.example.com -W %h:%p
  User barrychapman
Host qaapplicationserver
  HostName qaapplicationserver.local
  ProxyCommand ssh -i ~/.ssh/id_rsa barrychapman@qajumpserver.example.com -W %h:%p
  User barrychapman

MacBook-Pro:~ barrychapman$



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

MacBook-Pro:~ barrychapman$ ssh qaapplicationserver ls / tmp / hosts
ls: cannot access /tmp/hosts: No such file or directory
Killed by signal 1.
MacBook-Pro:~ barrychapman$



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


MacBook-Pro:~ barrychapman$ scp -3 devapplicationserver: / etc / hosts qaapplicationserver: / tmp /
Killed by signal 1.
Killed by signal 1.
MacBook-Pro:~ barrychapman$



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

MacBook-Pro:~ barrychapman$ ssh qaapplicationserver ls / tmp / hosts
/tmp/hosts
Killed by signal 1.
MacBook-Pro:~ barrychapman$ 

Заметка

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

ТРУБЫ!

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

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

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

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

Если я правильно понимаю, у вас есть два сервера перехода (jump-qa и jump-dev), защищающие два сервера приложений (app-qa и app-dev); серверы перехода могут передавать друг другу ssh; ни один ящик, кроме соответствующего сервера перехода, не может подключиться по 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