Minta ssh untuk menyelesaikan nama host dari config saat menggunakan mode ProxyCommand dan netcat

16

Saya mencoba mengatur beberapa opsi universal untuk memantulkan koneksi ssh. Ini ~/.ssh/configfile saya , disingkat:

Host *%via
  ProxyCommand ssh gateway -W $(echo %h | cut -d%% -f1) %p

Host gateway
  HostName gateway.example.com
  User username
  ForwardAgent yes
  IdentityFile keypathg

Host target
  User username
  HostName target.example.com
  IdentityFile keypatht

Ketika saya memanfaatkan *%viamenggunakan Hostalias, saya mendapatkan:

% ssh -vvv target%via
OpenSSH_5.9p1, OpenSSL 0.9.8y 5 Feb 2013
debug1: Reading configuration data /Users/myuser/.ssh/config
debug1: /Users/myuser/.ssh/config line 5: Applying options for *
debug1: /Users/myuser/.ssh/config line 12: Applying options for *%via
debug1: Reading configuration data /etc/ssh_config
debug1: /etc/ssh_config line 20: Applying options for *
debug1: auto-mux: Trying existing master
debug1: Control socket "/Users/myuser/.ssh/tmp/target%via_22_myuser" does not exist
debug2: ssh_connect: needpriv 0
debug1: Executing proxy command: exec ssh -A gateway -W $(echo target%via | cut -d% -f1):22
debug1: permanently_drop_suid: 501
debug1: identity file /Users/myuser/.ssh/id_rsa type -1
debug1: identity file /Users/myuser/.ssh/id_rsa-cert type -1
debug1: identity file /Users/myuser/.ssh/id_dsa type -1
debug1: identity file /Users/myuser/.ssh/id_dsa-cert type -1
ssh_exchange_identification: Connection closed by remote host

Namun, jika saya manfaatkan

% ssh target.example.com%via

Saya menekan server target, tetapi sebagai pengguna yang salah dan tanpa otentikasi pubkey.

Saya pikir pertanyaan saya, pada titik ini, apakah metode memantul ini, ketika menggunakan ForwardAgent, melewati seluruh konfigurasi ssh / lingkungan saya, atau hanya kunci. Jika hanya kunci, dapatkah bekas digunakan dengan cara tertentu?

Versi ssh saya adalah 5.9v1, gateway 5.9v1, dan targetnya 5.3p1. Saya percaya -Wdiperkenalkan di 5.4, tapi itu tidak masalah untuk kotak akhir sejalan? memanfaatkan sekolah yang lebih tua nctampaknya tidak berbeda.

Saya telah memverifikasi bahwa saya dapat secara manual ssh ke setiap kotak di baris. Melakukan hal itu menunjukkan bahwa informasi alias nama host tidak lulus, seperti ketika di gateway, saya tidak bisa ssh targettetapi saya bisa ssh target.example.com. Ini bekerja dengan authunckey pubkey. gateway dan target secara kebetulan memiliki nama pengguna yang sama, itulah sebabnya ini berfungsi jika tidak ada konfigurasi yang didorong.

Jika ForwardAgentatau konfigurasi serupa tidak dapat mendorong informasi ini, apa cara terbaik untuk menyiasatinya, menyimpan .ssh / config di gateway dengan informasi ini?

Joshua Hogendorn
sumber

Jawaban:

14

Wow, terima kasih sudah mengajukan pertanyaan ini. Saya merasa jarang melihat seseorang mengeksploitasi SSH sepenuhnya dan pertanyaan ini mengenai beberapa area.

Ini bukan ProxyCommandmasalah. The ProxyCommandhanya menginstruksikan klien ssh lokal untuk melakukan sesuatu dalam persiapan sebelum mencoba untuk berbicara dengan klien remote. Ya, dalam contoh kami, kami berbicara dengan sesi ssh lain, tetapi sesi itu, dengan -Whanya mengambil input kami dan meneruskannya ke komputer lain. Anda dapat menganggap bahwa sesi persiapan ssh sepenuhnya independen. Analogi mobil yang tak terhindarkan: Mobil Anda adalah mobil yang sama, terlepas dari apakah Anda harus naik feri untuk naik dari titik A ke titik B.

Ini bukan ForwardAgentmasalah. ForwardAgentmemiliki klien lokal menyediakan fasilitas yang membuat kunci lokal tersedia dalam lingkungan sesi jarak jauh. Anda belum melewati sesi remote.

Ini adalah .ssh/configmasalah format. Perhatikan baris debug1 kedua dan ketiga. Mereka mencantumkan apa stanza Host sedang diterapkan dari Anda .ssh/config. Anda perhatikan itu $ ssh target.example.com%viaberfungsi, tetapi sebagai nama pengguna dan kunci salah. Nah, bait untuk Host targettidak dibaca (yang akan memberikan nama pengguna dan keyfile yang benar). Bait mana yang digunakan? *dan *%via.

Bagaimana cara mendapatkan opsi ini untuk lulus? Yah, cukup menarik, wildcard cocok dengan 0 string panjang. Host target*akan cocok target, target%via, target.example.comdan target.example.com%via.

Dan sehingga Anda mengajukan pertanyaan, akan menetapkan .ssh/configpada gatewaymesin bantuan. Tidak, itu tidak akan terjadi. Itu tidak akan pernah dibaca. Semuanya terjadi dari mesin lokal kami.

Yang saya jelaskan, hanya jawaban mengapa $ ssh target.example.com%viatidak bekerja.

Anda lebih suka $ ssh target%via. Memang benar, itu lebih nyaman. Bentuk singkat gagal karena, sebagai nama host, targettidak ditemukan; itu tidak menyelesaikan. Mengapa tidak tidak ssh memuntahkan: ssh: Could not resolve hostname target: Name or service not known? Karena ProxyCommandsudah berhasil dibuat. Elemen koneksi ssh telah dibangun, tetapi kegagalan nama host terjadi di tempat yang tidak diharapkan, dan karenanya gagal dengan pesan yang lebih umum. Saya akan mengajukan laporan bug tentang ini, untuk membantu mengidentifikasi di mana informasi debug dapat ditingkatkan.

Komentar akhir:

Saya suka Host *%viasintaksisnya. Ini bersih, namun fleksibel. Saya sebelumnya telah melihat Host *+*dan menggunakan bagian pertama dan terakhir %h(ost)untuk menentukan ke mana harus pergi. Tetapi butuh sedikit usaha lebih untuk mendapatkan pikiran Anda di sekitar itu. tautan: http://wiki.gentoo.org/wiki/SSH_jump_host

Hefeweizen
sumber