Cara mengonfigurasi pintasan untuk koneksi SSH melalui terowongan SSH

22

Server produksi perusahaan saya (FOO, BAR ...) terletak di belakang dua server gateway (A, B). Untuk terhubung ke server FOO, saya harus membuka koneksi ssh dengan server A atau B dengan nama pengguna saya JOHNDOE, kemudian dari A (atau B) saya dapat mengakses server produksi yang membuka koneksi SSH dengan nama pengguna standar (sebut saja WEBBY).

Jadi, setiap kali saya harus melakukan sesuatu seperti:

ssh johndoe@a
...
ssh webby@foo
...
# now I can work on the server

Seperti yang dapat Anda bayangkan, ini merepotkan ketika saya perlu menggunakan scpatau jika saya perlu dengan cepat membuka banyak koneksi.

Saya telah mengkonfigurasi kunci ssh dan juga saya menggunakan .ssh / config untuk beberapa pintasan.

Saya bertanya-tanya apakah saya dapat membuat beberapa jenis konfigurasi ssh untuk mengetik

ssh foo

dan biarkan SSH membuka / meneruskan semua koneksi untuk saya. Apa itu mungkin?

Edit

Jawaban womble adalah persis apa yang saya cari tetapi tampaknya sekarang saya tidak dapat menggunakan netcat karena itu tidak diinstal pada server gateway.

weppos:~ weppos$ ssh foo -vv
OpenSSH_5.1p1, OpenSSL 0.9.7l 28 Sep 2006
debug1: Reading configuration data /Users/xyz/.ssh/config
debug1: Applying options for foo
debug1: Reading configuration data /etc/ssh_config
debug2: ssh_connect: needpriv 0
debug1: Executing proxy command: exec ssh a nc -w 3 foo 22
debug1: permanently_drop_suid: 501
debug1: identity file /Users/xyz/.ssh/identity type -1
debug2: key_type_from_name: unknown key type '-----BEGIN'
debug2: key_type_from_name: unknown key type 'Proc-Type:'
debug2: key_type_from_name: unknown key type 'DEK-Info:'
debug2: key_type_from_name: unknown key type '-----END'
debug1: identity file /Users/xyz/.ssh/id_rsa type 1
debug2: key_type_from_name: unknown key type '-----BEGIN'
debug2: key_type_from_name: unknown key type 'Proc-Type:'
debug2: key_type_from_name: unknown key type 'DEK-Info:'
debug2: key_type_from_name: unknown key type '-----END'
debug1: identity file /Users/xyz/.ssh/id_dsa type 2
bash: nc: command not found
ssh_exchange_identification: Connection closed by remote host
Simone Carletti
sumber

Jawaban:

36

Sebagai versi yang lebih konkret dari jawaban Kyle, yang ingin Anda masukkan ke ~/.ssh/configfile Anda adalah:

host foo
  User webby
  ProxyCommand ssh a nc -w 3 %h %p

host a
  User johndoe

Kemudian, ketika Anda menjalankan "ssh foo", SSH akan berusaha untuk SSH untuk johndoe@a, jalankan netcat( nc), kemudian lakukan SSH untuk webby@foomelalui terowongan ini. Sihir!

Tentu saja, untuk melakukan ini, netcat perlu diinstal pada server gateway; paket ini tersedia untuk setiap distribusi utama dan OS.

womble
sumber
Luar biasa! Saya mencoba untuk mencari tahu, saya belum pernah mengalami situasi yang tepat sebelumnya. Saya akan menyimpan jawaban saya di sana, jika itu dapat membantu orang lain dengan situasi yang kurang spesifik di masa depan.
Kyle Brandt
Saya telah memperbarui pertanyaan awal saya termasuk keluaran verbal dari koneksi saya. Sepertinya saya tidak bisa menggunakan netcat. Haruskah itu tersedia secara default?
Simone Carletti
Tidak selalu, apakah Anda memiliki kekuatan untuk menginstalnya? Anda mungkin bisa melakukan ini dengan telnet juga, saya belum pernah mencoba itu ...
Kyle Brandt
Anda juga mungkin dapat mengunduh netcat ke direktori home Anda dan mengompilasinya di sana. Anda kemudian bisa menggunakan path lengkap dalam perintah proxy, yaitu / home / userName / bin / nc
Kyle Brandt
Saya baru saja memeriksa pengaturan sistem. Pada Ubuntu netcat tampaknya tersedia secara default, sayangnya server gateway ditenagai oleh OpenSUSE. Saya akan mempertimbangkan untuk menginstal netcat di server gateway juga.
Simone Carletti
7

Anda dapat menggunakan perintah ProxyCommand di file ~ / .ssh / config Anda, misalnya untuk menggunakan netcat sebagai relai:

host server2
    ProxyCommand ssh server1 nc server2 22

Anda hanya akan menggunakan 'ssh server2'. Informasi halaman manual untuk arahan ini ditemukan di 'man ssh_config'

Kyle Brandt
sumber
5

Saya lebih suka pendekatan berbeda yang memelihara terowongan pra-otentikasi ke server gateway. Dalam ~/.ssh/config:

Host a
    ControlMaster auto
    ControlPath ~/.ssh/control-master/%r@%h:%p

Kemudian di .bashrc:

s () {
        if ( ssh -O check a 2>&1 > /dev/null 2>&1 )
        then
                ssh -t a ssh $1
        else
                if [[ -S ~/.ssh/control-master/insyte@a:22 ]]
                then
                        echo "Deleting stale socket..."
                        rm ~/.ssh/control-master/insyte@a:22
                fi
                echo "Opening master session..."
                if ssh -Nf a
                then
                         ssh -t a ssh $1
                fi
        fi
 }

Jadi untuk terhubung ke foo:

s foo

Pertama kali Anda menghubungkannya akan mengotentikasi Anda terhadap "a" dan membuka terowongan ssh latar belakang yang persisten. Panggilan selanjutnya ke "s" akan terbuka hampir secara instan melalui terowongan yang telah diautautkan.

Bagus sekali.

Insyte
sumber
2

Jenis fungsionalitas ini ada di versi OpenSSH yang lebih baru dan dapat digunakan dengan melakukan

ssh -W server2 server1

Di mana server2tujuan yang Anda tuju dan server1merupakan host proxy Anda. Anda dapat membuatnya lebih mudah dengan menggunakan ProxyCommandopsi di konfigurasi ssh Anda, sesuatu seperti:

host = *.example.com
user = packs
port = 22
ProxyCommand ssh -W %h:%p server1
Scott Pack
sumber
Tampaknya agar ini berfungsi, Anda memerlukan OpenSSH 5.4+ di ketiga lokasi: desktop, perantara, tujuan. (Ya, yang pertama dan terakhir, tentu saja).
Steve Bennett
@SteveBennett: Saya sudah menggunakan metode ini untuk sementara waktu sekarang, ini berfungsi dengan sangat baik. Saya harus kembali ke metode netcat pada beberapa sistem RHEL5, yang menjengkelkan.
Scott Pack
2

Ketika netcattidak tersedia di proksi, coba trik ini:

host foo
  User webby      
  ProxyCommand ssh a 'exec 3<>/dev/tcp/foo/22; cat <&3 & cat >&3;kill $!'

host a
  User johndoe

Maka Anda harus bisa ssh foo.

Juga, jika Anda memiliki versi terbaru dari ssh pada (yaitu, dengan -Wperintah untuk meneruskan input dan output standar), Anda mungkin dapat menggunakan:

host foo
  User webby
  ProxyCommand ssh -W foo:%p a

host a
  User johndoe

Akhirnya, hanya karena saya menemukan itu keren (dan bukan karena itu akan bekerja dalam kasus khusus Anda, karena perbedaan nama pengguna), posting blog seorang teman menunjukkan bagaimana membuat hal semacam ini dinamis dan secara rekursif rantai proxy SSH (bersama dengan beberapa hal) itu tidak bekerja dengan baik):

host */*
  ProxyCommand ssh ${$(dirname %h)/\%%/@} nc ${$(basename %h)#*%%} %p

Dan kemudian ssh machine1/machine2harus memberi Anda shell machine2, diteruskan machine1.

Saya ingin tahu apakah menggunakan sedperintah khusus sebagai ganti dirnamedan basenamemungkin tidak menyelesaikan masalah dengan nama pengguna yang berbeda?

Paul Price
sumber
2

Ini bisa dicapai dengan melakukan ssh -At johndoe@a ssh webby@foo. The -APerintah depan agen ssh Anda (sehingga Anda dapat menghindari untuk re-authenticate pada proxy), sedangkan -tMemastikan terminal ada di proxy. Fungsi bash berikut mungkin berguna:

ssh-bounce () {
    local cmd=""
    for i in "$@"; do
        cmd+="ssh -At $i "
    done
    $cmd
}
Marcin
sumber
Sejauh ini, ini adalah solusi paling sederhana. Sekarang hanya perlu 35 upvotes lagi. (Btw the -A tidak melakukan apa pun untuk saya.)
Steve Bennett
0
weppos:~ weppos$ ssh foo -vv
[..]
bash: nc: command not found

Netcat tidak diinstal pada a. Ketika Anda menjalankan ssh host "command arg", commanddieksekusi pada host, bukan pada mesin lokal Anda.

markdrayton
sumber
Ya saya tahu. Inilah tepatnya yang saya laporkan dalam komentar untuk jawaban womble. :)
Simone Carletti
0

Sejak OpenSSH 7.3 (2016-08-01) ProxyJumpopsi dan -Jflag baris perintah yang sesuai telah tersedia untuk memungkinkan tipuan yang lebih sederhana melalui satu atau lebih benteng SSH atau "host melompat".

Itu menghilangkan ketergantungan pada ncperintah eksternal seperti yang ditemukan dalam solusi Womble .

ssh -J johndoe@a webby@foo 

akan membuat koneksi SSH dari workstation Anda ke server gateway asebagai pengguna johndoe dan tunnel sesi SSH untuk meng-host foo untuk pengguna Web dengan itu.

Untuk menyederhanakan yang membuat definisi host untuk Anda ~/.ssh/configdan Anda dapat dengan mudah menjalankannyassh foo

Host a
    User johndoe

Host foo
    User Webby 
    ProxyJump a
HBruijn
sumber