web-dev-qa-db-ja.com

複数のホップ上のSSHトンネルを介してデータをコピーする

問題の2つの主要な環境があります。

開発とQA

各環境には2つのサーバーがあります。

  • ジャンプボックス
  • アプリケーション・サーバー

アプリケーションサーバーに接続するには、まずジャンプボックスに接続してから、アプリケーションサーバーにSSHで接続する必要があります。

ファイアウォールの好意により、いくつかのルールがあります。

  • ジャンプボックス経由でアプリケーションサーバーに接続する必要があります
  • アプリケーションサーバーがどちらのジャンプボックスにも接続できない
  • ジャンプボックスは同じサブネット上にあり、CANは互いに通信できます。

私たちの問題

DEVELOPMENT APPLICATION SERVERには多くのコンテンツ(670 GB)があり、これをQA APPLICATION SERVERに取得する必要があります。

このデータを必要なスペースが不足しているため、このデータをジャンプボックスにコピーすることはできません。

私はいくつかの調査を行い、これらのサーバーを介して一連のトンネルを実行できる可能性があることを知り、トンネルを介して1つのアプリサーバーから他のアプリサーバーにデータを直接ストリーミングできるようにしました。ただし、アプリケーションサーバーからジャンプボックスに接続できないという問題。

オプションはありますか?これは絶望的な状況になりつつあり、時間が最も重要です。データをダウンロードして再アップロードする時間はありません。サーバー上のネットワークを介したコピーは、ギガビット接続であるため、すばやく処理されます。

14
Barry Chapman

これまでのところ、最も簡単な方法は、scp経由でコピーすることです。さらに、この構文は実際には他のいくつかの提案とは異なり動作します。

簡単にこの構文を打ち負かすことはできません。複雑な可能性のあるパイプを考慮する手間をかけずに、再帰的にコピー、rsync、または必要な処理を行うことができます。この構文は直感的にわかりやすく、あなたをフォローしているシステム管理者がより簡単にサポートできるようになり、 役に立たないcatの使用 を行いません。

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

From scp man page-3 2つのリモートホスト間のコピーは、ローカルホストを介して転送されます。このオプションがない場合、データは2つのリモートホスト間で直接コピーされます。このオプションは、進行状況メーターを無効にすることに注意してください。

以下の例では

  • ワークステーションの名前はMacBook-Proです。
  • 開発ジャンプボックスの名前はdevjumpserverです
  • Dev Application Serverはdevapplicationserver という名前です。
    • .localという名前のLAN DNSゾーンにある
  • QAジャンプボックスの名前はqajumpserver
  • QAアプリケーションサーバーの名前はqaapplicationserver です。
    • .localという名前のLAN DNZゾーン上にある
  • 670GBの/ etc/hostsファイルのテストコピーを実行します;-)
  • SSH公開鍵認証が構成されていることを前提としています。



これは、適切なジャンプ(別名、要塞サーバー)を介してワークステーションからアプリケーションサーバーへの直接アクセスを設定する〜/ .ssh/configファイルです。

 MacBook-Pro:〜barrychapman $cat〜/ .ssh/config
 Host * 
 ServerAliveInterval 60 
ホストdevapplicationsever 
ホスト名devapplicationserver.local 
 ProxyCommand ssh -i〜/ .ssh/id_rsa [email protected] -W%h:%p 
ユーザーbarrychapman 
 Host qaapplicationserver 
 HostName qaapplicationserver.local 
 ProxyCommand ssh -i〜/ .ssh/id_rsa [email protected] -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/hosts
シグナル1によって強制終了されました。
 MacBook-Pro:〜barrychapman $ 
 

注意

ProxyCommand接続を閉じると、「シグナル1によって強制終了されました」という警告メッセージが表示されます。これは、SSHがProxyCommand接続を切断することであり、心配する必要はありません。要塞Host configスタンザにLogLevel Quietを追加することで、それを取り除くことができます。

15
appx

パイプ!

インターネットが 一連のチューブ の場合、Unixは一連のパイプ-次のようなものです。

cat ginormous-file | ssh user@Host1 "cat | ssh user@Host2 \"cat >out\" "

うまくいくはずです。

さらに多くのホストを走査する必要がある場合は、必要に応じてパイプ(および\エスケープされた引用符のネストされたレイヤー)を追加します。 (ただし、パイプライン/エスケープが非常に複雑になり、ダイアグラムを描くか、指で数えることに頼らなければならない場合は注意してください エスケープで何倍にする必要があるかを決定するため おそらくそれは認める時です適切なVPNを無効にして設定してください!)

8
voretaq7

私が正しく理解していれば、2つのジャンプサーバー(jump-qaとjump-dev)があり、2つのアプリサーバー(app-qaとapp-dev)を保護しています。ジャンプサーバーは互いにsshできます。関連するジャンプサーバー以外のボックスは、対応するアプリサーバーにSSH接続できません。アプリサーバーは誰にでもsshできます。ファイルはapp-devからapp-qaに転送されます。両方のジャンプサーバーには、データの中間コピー用のスペースがありません。

これはsshトンネリングで解決できます。 1つのリモートアプリサーバーへの接続をセットアップし、そのジャンプサーバー上の未使用のポートに接続するリモートトンネルを伝送します。 1つのジャンプサーバーから別のジャンプサーバーへの2番目の接続を設定し、リモート転送されたポートのぶら下がり端をトンネル1からピックアップして、他のアプリサーバーの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を実行して、app-devのsshバナーを取得できることがわかります。次に、データファイルをコピーします。

app-qa% scp -P 2345 localhost:/path/on/app-dev/data.dat data.dat
1
MadHatter