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


14

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

開発とQA

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

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

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

ファイアウォールのおかげでいくつかのルールがあります:

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

私たちの問題

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

このデータをジャンプボックスにコピーすることは、必要なスペースがないため、オプションではありません。

いくつかの調査を行った結果、これらのサーバーを介して一連のトンネルを作成し、トンネルを介して1つのアプリサーバーから別のアプリサーバーにデータを直接ストリーミングできることがわかった。ただし、アプリケーションサーバーからジャンプボックスに接続できないという問題。

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


2
接続が確立されたら、次のいずれかの方法でコピーできます。$ devel_host $ tar -cf-| ssh -t jumbox 'ssh app_serv "tar -xf-"'またはtarの他の方法。
Alex_www

開発ジャンプボックスから開発アプリサーバーに接続できますが、その逆はできません。その接続が確立されている場合、どちらの方法でもコピーできますか?最初にジャンプボックスに保存せずに、このコンテンツを他のアプリサーバーに移動する最良の方法は何ですか?
バリーチャップマン

まさに、「パイピング」「タール」は最も簡単なソリューションです。
Alex_www

回答:


15

群を抜いて、最も簡単な方法はscpを介してコピーすることです。さらに、この構文は、他のいくつかの提案とは異なり実際に機能します。

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

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

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

以下の例では

  • ワークステーションの名前はMacBook-Proです。
  • 開発ジャンプボックスの名前はdevjumpserverです
  • Dev Application Serverはdevapplicationserverという名前です
    • .localという名前のLAN DNSゾーンにあります
  • QAジャンプボックスの名前はqajumpserverです
  • QA Application Serverの名前はqaapplicationserverです
    • .localという名前のLAN DNZゾーンにあります
  • 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:〜barrychapman $



ターゲットサーバー上のファイルの存在をテストしますが、存在しません。

MacBook-Pro:〜barrychapman $ ssh qaapplicationserver ls / tmp / hosts
ls:/ tmp / hostsにアクセスできません:そのようなファイルまたはディレクトリはありません
シグナル1で殺されました。
MacBook-Pro:〜barrychapman $



次に、ワークステーションを介して、開発アプリケーションサーバーからQAアプリケーションにファイルをコピーしましょう。

MacBook-Pro:〜barrychapman $ scp -3 devapplicationserver:/ etc / hosts qaapplicationserver:/ tmp /
シグナル1で殺されました。
シグナル1で殺されました。
MacBook-Pro:〜barrychapman $



次に、QA Application Server上のコピーされたファイルの存在を確認しましょう。今回はそこになります。

MacBook-Pro:〜barrychapman $ ssh qaapplicationserver ls / tmp / hosts
/ tmp / hosts
シグナル1で殺されました。
MacBook-Pro:〜barrychapman $ 

注意

ProxyCommand接続を閉じると、警告メッセージ「Kill​​ed by signal 1」が表示されます。これはProxyCommand接続を切断するSSHであり、心配する必要はありません。LogLevel Quiet要塞ホスト構成スタンザに追加することで、それを取り除くことができます。


乾杯、これで問題が解決しました。メリークリスマス!
バリーチャップマン

「要塞ホスト構成スタンザ」とはどういう意味ですか?@BraveNewCurrency?
アンドリューウルフ

各 "Host"行とその下の構成はスタンザ(詩のように)であると考えます。要塞の "Host"行の下に "LogLevel Quiet"を追加すると、そのホストにのみ適用されます。
BraveNewCurrency

8

パイプ!

インターネットが一連のチューブである場合、Unixは一連のパイプです。

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

動作するはずです。

より多くのホストをトラバースする必要がある場合は、必要に応じてパイプ(および- \エスケープされた引用のネストされたレイヤー)を追加します。(ただし、パイプライン/エスケープが非常に複雑になるため、ダイアグラムを描く、指で数えてエスケープを倍にする必要があるかどうかを判断する必要がある場合は、おそらく敗北を認めて適切なVPNを設定する時間です!)


1
以下のようAlex_wwwが彼のコメントで指摘あなたがいない場合は必要何のために中間ファイルをすることもできますちょうどパイプの出力tarの周り。(また、あなたにはありません必要なcatパイプラインの中間段階での- sshSTDINを食べて、それを中継して幸せです。catただ、私は良い感じになり、あなたのような、使用することをお勧めします他の有用なコマンドのプレースホルダですtee。)
voretaq7

私はOPの問題はというマシンが存在しないと思い両方がデータを持っているの接続を行うことができますが、またすべてのものと誰もが(すべてのパイプ用のコネクタとして動作するように)見ることができます任意の1台のマシンがあります。
MadHatter

1
@MadHatterこの場合、2つの答えの組み合わせが機能します(開発サーバーに接続し、ジャンプサーバーのSSHポートにポートを転送し、そのポートでSSHパイプラインを実行します)。これは、人々が言う大きな看板であなたのオフィスの外で抗議を開始しますポイントに嫌ますますソリューションを作ることは勿論であるVPN! NOW!...それらに
voretaq7

なぜいいの。はい、そうです。うまくいけば!
MadHatter

これを行うと、中間サーバー(この場合user@host1)は、ある時点cat ginormous-fileでストレージがいっぱいになりますか?または、データは直接に送信されuser@host2ますか?それとも何らかの形でストリーミングされていますか?tarこれはどのように関連していますか?これは、私が尋ねた最後から2番目の質問に関連していると思います。これらの質問のどれも...ところで修辞ません
hello_there_andy

1

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

これはsshトンネリングで解決できます。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 2345app-devのsshバナーを実行および取得できることがわかります。その後、データファイルをコピーできます。

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

ジャンプボックスは2つあります。1つはQAアプリサーバーの前に、もう1つはDEVアプリサーバーの前にあります。ジャンプボックスは互いに通信できます
バリーチャップマン

クライアントには中間コピー用のスペースがありますか?
MadHatter

いいえ、十分なスペースがありません
バリーチャップマン

クライアントと言うとき、どのサーバーを参照していますか?
バリーチャップマン

誤解していた。私の現在の理解では、クライアントはいないということです。2つのジャンプサーバーと2つのアプリサーバーがあります。
MadHatter
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.