Menyalin data melalui terowongan SSH melalui beberapa hop

14

Kami memiliki dua lingkungan utama yang dipertanyakan:

Pengembangan dan QA

Setiap lingkungan memiliki dua server:

  • Kotak Lompat
  • Server aplikasi

Untuk menyambung ke server aplikasi, Anda harus terhubung ke kotak lompatan terlebih dahulu, dan kemudian SSH ke server Aplikasi.

Ada beberapa aturan yang diberlakukan dari firewall:

  • Anda HARUS terhubung ke server aplikasi melalui kotak lompat
  • Server aplikasi tidak dapat terhubung ke kotak lompatan
  • Kotak lompatan berada di subnet yang sama, dan BISA berbicara satu sama lain.

Masalah kita

Kami memiliki banyak konten (670 GB) di Internet DEVELOPMENT APPLICATION SERVER, dan kami perlu membawanya ke Internet QA APPLICATION SERVER.

Menyalin data ini ke kotak lompatan bukanlah pilihan karena mereka tidak memiliki jumlah ruang yang diperlukan.

Saya melakukan riset, dan mengetahui bahwa kami berpotensi melakukan serangkaian terowongan melalui server ini sehingga kami dapat mengalirkan data langsung dari satu server aplikasi ke yang lain melalui terowongan. Namun, masalah yang tidak dapat kita sambungkan ke kotak lompat dari server aplikasi.

Apakah kita punya opsi? Ini menjadi situasi yang menyedihkan, dan waktu adalah esensinya. Kami tidak punya waktu untuk mengunduh data dan mengunggahnya kembali. Menyalin di jaringan pada server akan berjalan cepat, karena itu adalah koneksi gigabit.

Barry Chapman
sumber
2
Setelah koneksi tersambung, Anda dapat menyalin dengan cara apa pun: $ devel_host $ tar -cf - | ssh -t jumbox 'ssh app_serv "tar -xf -"' atau sebaliknya.
Alex_www
jadi kita bisa terhubung dari kotak lompat dev ke server aplikasi dev, tetapi tidak dengan cara lain. Jika koneksi kami sudah terhubung, kami bisa menyalinnya? apa cara terbaik untuk memindahkan konten ini ke server aplikasi lain tanpa terlebih dahulu menyimpannya di kotak lompat?
Barry Chapman
Tepatnya, "piping" "tar" adalah solusi paling sederhana.
Alex_www

Jawaban:

15

Sejauh ini, cara termudah adalah dengan menyalinnya melalui scp. Plus, sintaks ini sebenarnya berfungsi tidak seperti beberapa saran lainnya.

Anda tidak dapat mengalahkan sintaks ini untuk kemudahan. Ini memungkinkan Anda untuk menyalin, rsync, atau apa pun yang Anda inginkan secara rekursif tanpa harus repot-repot mempertimbangkan kemungkinan pipa yang rumit. Sintaks ini jelas secara intuitif, akan lebih mudah didukung oleh Sys Admin yang mengikuti Anda dan tidak menggunakan kucing secara sia - sia .

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

Dari halaman manual scp : -3Salinan antara dua host jarak jauh ditransfer melalui host lokal. Tanpa opsi ini, data disalin langsung antara dua host jarak jauh. Perhatikan bahwa opsi ini menonaktifkan pengukur kemajuan.

Dalam contoh di bawah ini

  • Workstation Anda bernama MacBook-Pro.
  • Dev Jump Box bernama devjumpserver
  • Dev Application Server bernama devapplicationserver
    • Apakah pada zona DNS LAN bernama .local
  • QA Jump Box bernama qajumpserver
  • Server Aplikasi QA diberi nama qaapplicationserver
    • Apakah pada zona LAN DNZ bernama .local
  • Kami akan melakukan salinan uji file 670GB / etc / hosts ;-)
  • Asumsi dibuat bahwa Anda telah mengonfigurasi otentikasi kunci publik SSH.



Berikut adalah file ~ / .ssh / config yang mengatur akses langsung dari workstation Anda ke server aplikasi melalui lompatan yang sesuai (alias server benteng).

MacBook-Pro: ~ barrychapman $ cat ~ / .ssh / config
Tuan rumah *
  ServerAliveInterval 60
Tuan rumah aplikasi
  HostName devapplicationserver.local
  ProxyCommand ssh -i ~ / .ssh / id_rsa [email protected] -W% ​​h:% p
  Pengguna barrychapman
Host server aplikasi
  HostName qaapplicationserver.local
  ProxyCommand ssh -i ~ / .ssh / id_rsa [email protected] -W% ​​h:% p
  Pengguna barrychapman

MacBook-Pro: ~ barrychapman $



Menguji keberadaan file di server target, itu tidak akan ada.

MacBook-Pro: ~ barrychapman $ ssh qaapplicationserver ls / tmp / hosts
ls: tidak dapat mengakses / tmp / hosts: Tidak ada file atau direktori tersebut
Dibunuh oleh sinyal 1.
MacBook-Pro: ~ barrychapman $



Sekarang mari kita salin file dari server Aplikasi Dev ke Aplikasi QA melalui workstation Anda.

MacBook-Pro: ~ barrychapman $ scp -3 devapplicationserver: / etc / hosts qaapplicationserver: / tmp /
Dibunuh oleh sinyal 1.
Dibunuh oleh sinyal 1.
MacBook-Pro: ~ barrychapman $



Sekarang mari kita periksa keberadaan file yang disalin di Server Aplikasi QA. Ini akan ada di sana saat ini.

MacBook-Pro: ~ barrychapman $ ssh qaapplicationserver ls / tmp / hosts
/ tmp / hosts
Dibunuh oleh sinyal 1.
MacBook-Pro: ~ barrychapman $ 

Catatan

Saat menutup koneksi ProxyCommand, Anda akan melihat pesan peringatan "Dibunuh oleh sinyal 1". Ini SSH menghancurkan koneksi ProxyCommand dan tidak perlu khawatir. Anda dapat menyingkirkannya dengan menambahkan LogLevel Quietstanza konfigurasi host bastion Anda.

appx
sumber
Cheers, ini menyelesaikan masalah kami. Selamat Natal!
Barry Chapman
Apa yang Anda maksud dengan "bastion host config stanza" ?? @BraveNewCurrency?
Andrew Wolfe
Saya menganggap setiap baris "Host" dan konfigurasi di bawahnya sebagai bait (seperti dalam puisi.) Jika Anda menambahkan "LogLevel Quiet" di bawah garis "Host" benteng Anda, itu hanya akan berlaku untuk host itu.
BraveNewCurrency
8

PIPA!

Jika internet adalah serangkaian tabung , Unix adalah serangkaian pipa - sesuatu seperti:

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

harus bekerja.

Jika Anda perlu melintasi lebih banyak host, tambahkan lebih banyak pipa (dan lebih banyak lapisan \kutip -disingkirkan) sesuai kebutuhan. (Namun perlu dicatat bahwa jika saluran pipa / pelarian menjadi sangat rumit sehingga Anda harus menggambar diagram atau mengandalkan jari-jari Anda untuk menentukan berapa kali Anda harus menggandakan pelarian , mungkin ini saatnya untuk mengakui kekalahan dan mengatur VPN yang tepat. !)

voretaq7
sumber
1
Seperti yang ditunjukkan oleh Alex_www dalam komentarnya jika Anda tidak memerlukan file perantara untuk apa pun, Anda juga dapat menyalurkan output tarsekitar. (Juga di Anda tidak perlu yang catpada tahap menengah pipa - sshsenang makan stdin dan relay The. catHanya membuat saya merasa lebih baik dan merupakan tempat bagi perintah yang berguna lain yang mungkin ingin digunakan, seperti tee.)
voretaq7
Saya pikir masalah OP adalah tidak ada mesin yang keduanya memiliki data dan dapat membuat koneksi, juga tidak ada satu mesin yang dapat melihat semuanya dan semua orang (untuk bertindak sebagai penghubung untuk semua pipa).
MadHatter
1
@ MadHatter Jika itu kasus kombinasi dari dua jawaban kami akan bekerja (terhubung ke server dev, meneruskan port kembali ke port SSH server melompat, kemudian jalankan pipa SSH di atas port itu). Ini tentu saja membuat solusi semakin menjijikkan ke titik di mana orang akan mulai memprotes di luar kantor Anda dengan tanda-tanda besar yang mengatakan VPN! NOW!pada mereka ...
voretaq7
Kenapa iya. Ya, mereka akan melakukannya. Semoga!
MadHatter
Apakah melakukan ini berarti server perantara (dalam hal ini user@host1) akan memiliki cat ginormous-filepenyimpanan penuh pada suatu saat? Atau data hanya dikirim langsung ke user@host2? Atau apakah itu entah bagaimana dialirkan? Bagaimana tarrelevan dengan ini? Saya kira itu relevan dengan pertanyaan kedua hingga terakhir yang saya tanyakan. Tak satu pun dari pertanyaan-pertanyaan ini retorika btw ...
hello_there_andy
1

Jika saya mengerti dengan benar, Anda memiliki dua server lompat (lompat-qa dan lompat-dev) yang melindungi dua server aplikasi (app-qa dan app-dev); server lompat dapat ssh satu sama lain; tidak ada kotak selain server lompatan yang relevan yang dapat melakukan ssh ke server aplikasi yang sesuai. Server aplikasi dapat ssh kepada siapa pun. File akan ditransfer dari app-dev ke app-qa. Kedua server lompatan tidak memiliki ruang untuk salinan data sementara.

Anda dapat menyelesaikan ini dengan tunneling ssh. Kami mengatur koneksi ke satu server aplikasi jarak jauh, membawa terowongan jarak jauh yang menghubungkan kembali ke port yang tidak digunakan pada server lompatnya. Kami menyiapkan koneksi kedua dari satu server lompat ke server lompat lainnya, membawa sebuah terowongan yang mengambil ujung yang menggantung dari port yang diteruskan secara jarak jauh dari terowongan satu dan mengirimkannya ke port ssh server aplikasi lain.

Siapkan terowongan (masing-masing perintah ini perlu dijalankan di jendela terpisah jump-qa):

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

Anda sekarang harus menemukan itu di app-qa, Anda dapat melakukan telnet localhost 2345dan mendapatkan spanduk ssh app-dev. Anda kemudian dapat menyalin file data:

app-qa% scp -P 2345 localhost:/path/on/app-dev/data.dat data.dat
MadHatter
sumber
Ada dua kotak lompatan - satu di depan server aplikasi QA, dan satu di depan server aplikasi DEV. Kotak lompatan dapat berkomunikasi dengan satu sama lain
Barry Chapman
Apakah klien memiliki ruang untuk salinan sementara?
MadHatter
Tidak, tidak ada ruang yang cukup
Barry Chapman
ketika Anda mengatakan klien, server apa yang Anda maksud?
Barry Chapman
Saya telah salah paham. Pemahaman saya saat ini adalah bahwa tidak ada klien; ada dua server lompat, dan dua server aplikasi.
MadHatter