Menyiapkan file konfigurasi ssh dengan id_rsa melalui tunnel

17

Saya telah berjuang untuk mengatur konfigurasi yang valid untuk membuka koneksi dengan mesin kedua, melewati yang lain, dan menggunakan id_rsa (yang meminta saya kata sandi) untuk terhubung ke mesin ketiga.

Saya telah mengajukan pertanyaan ini di forum lain, tetapi saya belum menerima jawaban yang dapat dianggap sangat membantu.

Masalahnya, dijelaskan dengan lebih baik, adalah sebagai berikut:

Local machine: user1@localhost
Intermediary machine: user1@inter
Remote target: user2@final

Saya dapat melakukan seluruh koneksi menggunakan pseudo-tty:

ssh -t inter ssh user2@final

(ini akan menanyakan kata sandi untuk file id_rsa yang saya miliki di mesin "inter")

Namun, untuk mempercepat, saya ingin mengatur file .ssh / config saya, sehingga saya bisa terhubung ke mesin "final" menggunakan:

ssh final

Apa yang saya dapatkan sejauh ini - yang tidak berfungsi - adalah, dalam file .ssh / config saya:

Host inter
    User user1
    HostName inter.com
    IdentityFile ~/.ssh/id_rsa

Host final
    User user2
    HostName final.com
    IdentityFile ~/.ssh/id_rsa_2
    ProxyCommand ssh inter nc %h %p

File id_rsa digunakan untuk terhubung ke mesin tengah (ini mengharuskan saya tidak mengetik kata sandi), dan file id_rsa_2 digunakan untuk terhubung ke mesin "final" (ini meminta kata sandi).

Saya sudah mencoba mencampurkan beberapa LocalForwarddan / atau RemoteForwardbidang, dan meletakkan file id_rsa di mesin pertama dan kedua, tapi saya tidak bisa berhasil tanpa konfigurasi sama sekali.

PS: utas saya sudah mencoba mendapat bantuan dari:

http://www.linuxquestions.org/questions/linux-general-1/proxycommand-on-ssh-config-file-4175433750/

Rubens
sumber

Jawaban:

21

METODE 1 (gunakan kunci ssh di antar)

Jika Anda ingin mempertahankan alur otentikasi

local -- authenticate --> inter -- authenticate (ask password) --> final

Ini tidak dapat dilakukan dengan .ssh / config proxyhost.

Yang Anda butuhkan adalah bash shell alias (saya harap Anda menggunakan bash).

Di ~/.bashrc, tambahkan baris berikut

alias ssh-final='ssh -t inter ssh [email protected]'

Di command prompt, cukup ketikkan berikut ini

ssh-final

finalbagian dalam ~/.ssh/configtidak digunakan.

Detail Koneksi (1)

ssh -t inter ssh [email protected] dapat dilihat sebagai berikut

local# ssh inter
inter# ssh [email protected]

localhanya "berbicara" dengan inter. Tidak ada koneksi ssh langsung atau tidak langsung antara localdan final. localhanya menampilkan output dari ssh [email protected].

METODE 2 (gunakan kunci ssh di lokal)

Otentikasi dengan ssh-key yang sama

Host inter
    User user1
    HostName inter.example.com

Host final
    User user2
    Hostname <final.com / final IP Address>
    Port 22
    ForwardAgent yes
    ProxyCommand ssh inter nc %h %p

Salin lokal ~/.ssh/id_ras.pub ke

/home/user1/.ssh/authorized_keys in `inter`
/home/user2/.ssh/authorized_keys in `final`

Rincian Koneksi (2)

tunneling ssh

Sebelum kita masuk ke detail ProxyCommand, mari kita lihat contoh berikut

Langkah 1, di jendela terminal 1

local# ssh inter -L 2000:final.com:22

Langkah 2, di jendela terminal 2

local# ssh localhost -p 2000

Di terminal 1, sebuah terowongan diatur antara port lokal 2000 dan port final.com 22. Apa pun yang dikirim ke port lokal 2000 akan diteruskan ke port final.com 22 dan sebaliknya.

Di terminal 2, ssh terhubung ke port lokal 2000, tetapi sebenarnya berkomunikasi dengan port final.com 22, yang merupakan sshd.

Dengan tunneling, klien ssh lokal di Langkah 2 terhubung dengan final.com sshd secara langsung.

"Output" dari port lokal 2000, adalah "mentah" lalu lintas daemon ssh.

Penggunaan umum terowongan semacam itu adalah untuk mengakses server web internal atau server email. Berikut ini adalah contoh untuk server web

local# ssh inter -L 2000:final.com:80

Di browser gunakan URL berikut

http://localhost:2000

Dua titik akhir terowongan adalah port lokal 2000, dan port final.com 80.

Lalu lintas masuk dan keluar dari titik akhir terowongan "SEBAGAIMANA ADANYA". Mari kita sebut lalu lintas "mentah" itu.

Perintah Proxy

Host final
    User user2
    Hostname <final.com / final IP Address>
    Port 22
    ForwardAgent yes
    ProxyCommand ssh inter nc %h %p

The ProxyCommandmengambil satu langkah lebih lanjut. Itu melewati langkah membuat port lokal dan terhubung ke sana.

Seorang klien ssh akan mengeksekusi perintah apa yang pernah diberikan di belakang ProxyCommand, dan memperlakukan output dari perintah itu sebagai lalu lintas "mentah". Itu memegang titik akhir lokal, dan kemudian memulai koneksi ssh dengannya.

Mengapa yang satu bekerja dan yang lainnya tidak?

Perintah berikut

ssh inter nc final.com 22

pada dasarnya berarti (1) terhubung ke inter, kemudian (2) aktif inter, jalankan perintah nc final.com 22.

nc - arbitrary TCP and UDP connections and listens

Jadi nc final.com 22akan terhubung ke port final.com 22, mencetak semua lalu lintas masuk ke stdout, dan mengirim semua stdin ke sisi lain. Ini adalah "terowongan" antara nc stdin / out dan port final.com 22.

Karena ncdijalankan dalam sesi ssh, semua stdoutnya dilewatkan kembali ke klien ssh, sebagai lalu lintas "mentah". Dan klien ssh dapat meneruskan traffic ke nc stdin, yang akan berakhir di port final.com 22.

Melalui "tunnel" di atas, klien ssh lokal akan memulai sesi ssh dengan final.comlangsung.

Perintah berikut

ssh -t inter ssh [email protected]

tidak bekerja dengan ProxyCommandkarena itu bukan lalu lintas "mentah" dari daemon ssh. Ini adalah stdout klien ssh . Bicara klien dengan klien berarti tidak ada bisnis.

Otentikasi dengan ssh-key yang berbeda (OP original config)

Host inter
    User user1
    HostName inter.com
    IdentityFile ~/.ssh/id_rsa

Host final
    User user2
    HostName final.com
    IdentityFile ~/.ssh/id_rsa_2
    ProxyCommand ssh inter nc %h %p

Salin lokal ~/.ssh/id_ras.pub ke

/home/user1/.ssh/authorized_keys in `inter`

Salin lokal ~/.ssh/id_ras_2.pub ke

/home/user2/.ssh/authorized_keys in `final`

Kedua hal di atas akan memungkinkan penggunaan berikut

local# ssh final

Pemeriksaan Tambahan

Gunakan verbose

local# ssh -v final

Itu akan membantu mengidentifikasi masalah ssh.

Periksa nc

ProxcyCommandmengeksekusi ncpada inter. Periksa apakah ncsebenarnya tersedia pada inter.

local# ssh inter
inter# nc final.com 22

Periksa kunci rsa sudah diatur dengan benar

Jika kunci yang berbeda akan digunakan untuk interdan final, file-file berikut harus ada di mesin lokal

local# ls ~/.ssh
id_rsa id_rsa_2 id_rsa.pub id_rsa_2.pub

Karena Anda sudah bisa intermelakukannya, periksa pengaturan tombol aktif final. Dari mesin lokal Anda

local# ssh -t inter ssh user2@final
final# cat .ssh/authorized_keys

Anda harus melihat konten di id_rsa_2.pubsana.

John Siu
sumber
Maaf, saya harus menunjukkan ini; Saya sebenarnya dapat terhubung menggunakan ssh -t, tetapi apa yang ingin saya lakukan adalah persis mensimulasikan perilaku yang saya miliki ssh -tmenggunakan hanya menggunakan konfigurasi pada Windows .ssh/config.
Rubens
File konfigurasi, bahkan yang Anda posting harusnya berfungsi. Coba lewati checkinglangkahnya. Pasti ada yang salah / salah.
John Siu
1
Dengan ssh -t, ssh to Anda finaldimulai dari inter, yang "hampir" sama dengan saat local# ssh interitu inter# ssh final. Otentikasi berada di antara interdan final. Dengan proxy / nc, ssh ke final dimulai dari mesin lokal Anda, melalui terowongan, hingga final. Otentikasi berada di antara localdan final.
John Siu
@ Ruben berdasarkan komentar Anda, saya pikir Anda salah mengira Anda masih menggunakan interssh-key untuk diautentikasi final. Coba salin id_rsa_2ke local~ / .ssh / id_rsa_2 (JANGAN MENULIS id_rsa lokal) dan masalah Anda mungkin hilang.
John Siu
2
Perhatikan bahwa ssh2 telah nctertanam. Jadi alih-alih ProxyCommand ssh gateway nc %h %p, Anda akan menulis ProxyCommand ssh inter -W %h:%p.
user123444555621
2

Saya tidak melihat kesalahan sebenarnya terdaftar atau pernyataan ssh -v yang akan membantu melihat di mana itu tergantung.

Hai kawan Anda sudah hampir benar --- cara terbaik dan paling aman adalah dengan memiliki kedua kunci pada mesin lokal. Anda kemudian akan menggunakan penerusan ssh-agent untuk menghubungkan daripada meninggalkan kunci pada langkah-langkah perantara. Anda juga memiliki keuntungan karena harus mengetikkan frasa sandi utama Anda hanya sekali per masuk.

Jika Anda memiliki OS modern / ramah pengguna seperti ubuntu (pada mesin lokal Anda) ini seharusnya tidak masalah tanpa * memijat *. Saya meninggalkan file identitas dengan sengaja, Anda tidak akan membutuhkannya.

File konfigurasi Anda akan terlihat seperti ini:

Host inter
    User user1
    ForwardAgent yes
    HostName inter.com

Host final
    ForwardAgent yes
    User user2
    HostName final.com
    ProxyCommand ssh inter nc %h %p

Jika tidak, jalankan langkah-langkah ini untuk memastikan Anda menjalankan ssh-agent:

'ssh-add -l' (lower case L) will list your private keys if any are loaded, or will be blank, or will say can’t connect to ssh-agent, if so, start ssh-agent.
'eval `ssh-agent`' (those are backticks) starts ssh agent
'ssh-add' will add your key… you can add a path argument if you have a key in a non-default area. At this point you will enter your passphrase.

Ada panduan bagus yang menjelaskan cara kerjanya, di sini.

MattPark
sumber