SCP melalui koneksi gateway SSH

8

Layout jaringan saya kira-kira seperti ini:

Sekarang Alice memiliki akses ke SSH gateway (hanya gateway dari sekarang) dengan:

ssh [email protected]

dan file kunci yang diotorisasi pada gateway terlihat seperti ini

#/home/Alice/.ssh/authorized_keys
command="ssh -t alice@web" ssh-rsa ABCD...E== alice@somehost

jadi ketika Alice mencoba untuk terhubung ke Gateway dengan kunci privatnya, dia sebenarnya akan terhubung ke server Web (pc gateway dapat membuat koneksi ke server web dengan kunci privat tanpa kata sandi, sehingga tetap transparan).

Pertanyaan

  1. Bagaimana saya bisa mengatur ini sehingga Alice akan dapat scp hal-hal ke server web juga?

  2. Saya tahu ini membuat koneksi terpisah, tetapi apakah ada cara untuk ini berfungsi sebagai ssh normal sehingga bahkan sesuatu seperti itu -R12345:localhost:22akan berfungsi?

zidarsk8
sumber

Jawaban:

10

Jika Anda ingin mengakses server ssh di belakang server ssh lain, cukup gunakan "ProxyCommand". Contoh: tambahkan ke .ssh / config

Host Alice  
   User myLoginAtAlice # optional 
   ProxyCommand ssh -o Compression=no gateway netcat -w 90 %h %p
   ServerAliveInterval 30
   Compression yes

Host gateway
   HostName gateway.public.ip
   User myLoginAtTheGateway # optional 
   Compression yes

Kemudian, Anda cukup "ssh Alice" atau "rsync" atau "scp" secara langsung menggunakan "Alice" sebagai nama host. Keajaiban itu disembunyikan untuk klien.

Ini memungkinkan Anda untuk dengan cepat mengkonfigurasi ulang ssh Anda jika topologi / konfigurasi jaringan Anda berubah, dan cukup ganti .ssh / config, alih-alih mengubah setiap skrip.

Penjelasan: ssh menggunakan perintah yang diberikan sebagai "perintah proxy" sebagai transportasi alih-alih koneksi TCP langsung. Netcat adalah alat jaringan yang (di antara jutaan fitur lainnya) hanya mengarahkan stdin / stdout ke host jarak jauh yang ditentukan. Jadi, "ssh gateway nc sshserver 22" menghubungkan Anda ke server ssh mesin itu. % h adalah nama host dan% p adalah porta. Pengaturan semacam itu memungkinkan Anda menentukan "Port N" untuk mengubah port tanpa mengubah jalur ProxyCommand.

Saya mengaktifkan kompresi ke komputer akhir dan menonaktifkan kompresi luar karena mengompresi data terenkripsi atau terkompresi tidak mengurangi volume data lebih jauh. Setiap mengutak-atik pengaturan kompresi juga tentu saja opsional.

Raúl Salinas-Monteagudo
sumber
Satu pertanyaan lagi, rysnc tidak berfungsi seperti itu jika saya memiliki port khusus ke mesin gateway. Ada pemikiran tentang itu.
zidarsk8
Tambahkan "Port port_number" ke bagian yang relevan dari .ssh / config. Harap baca halaman manual ssh_config dan sshd_config. Mereka banyak informasi dan mereka mungkin memberi Anda banyak inspirasi.
Raúl Salinas-Monteagudo
Maksud saya, rsync tidak berfungsi jika port yang berbeda ditentukan. Saya telah mengkonfigurasi port agar koneksi berfungsi normal, tetapi rsync menyebabkan masalah bagi saya.
zidarsk8
3

Saya memiliki masalah yang sama persis seperti ini tetapi saya membuatnya bekerja tanpa secara radikal mengubah segalanya.

Yang saya lakukan adalah menambahkan $ SSH_ORIGINAL_COMMAND ke gateway otor_keys untuk melewati apa pun di rantai ke server terakhir.

Jadi ini:

#/home/Alice/.ssh/authorized_keys
command="ssh -t alice@web" ssh-rsa ABCD...E== alice@somehost

Menjadi:

#/home/Alice/.ssh/authorized_keys
command="ssh -q -t alice@web $SSH_ORIGINAL_COMMAND" ssh-rsa ABCD...E== alice@somehost

-Q digunakan untuk menekan koneksi pesan tertutup dari mesin titik akhir sehingga tidak berakhir pada output lokal jika menggunakan pengalihan secara lokal.

Anda kemudian dapat menggunakan scp seperti ini:

scp localFileName [email protected]:/path/on/end/point/remoteFileName

Ini memiliki keuntungan tambahan yaitu membiarkan pengguna melewati perintah melalui perintah ke server titik akhir dan mendapatkan hasilnya kembali di sesi lokal mereka sehingga mereka dapat mengarahkan mereka ke file atau menyalurkannya ke program lain.

Sebagai contoh:

ssh -t [email protected] "ls -l" > tmp

Ini berfungsi karena tampaknya sshd mengisi variabel lingkungan $ SSH_ORIGINAL_COMMAND dengan dan perintah yang ditentukan oleh klien ssh tetapi saya tidak yakin mengapa ini secara ajaib memungkinkan scp untuk melewati mesin endpoint serta perintah.

Ash Vince
sumber
0

Sayangnya port-forwarding tidak akan membantu untuk menyalin file langsung dari workstation Alice ke server web menggunakan scp. Dalam posting SO ini saya menjelaskan mengapa ssh (dan scp karena menggunakan mekanisme otentikasi yang sama) tidak akan berfungsi untuk koneksi port-forwarded menggunakan ssh.

Pilihannya adalah mengatur server VPN di mesin yang bertindak sekarang sebagai gateway SSH, sambungkan ke sana dan kemudian Anda memiliki akses langsung ke mesin apa pun di belakang firewall.

Serge
sumber