Tek komutta A ile B üzerinden A makinesine nasıl SSH yapabilirim?


103

Bir bilgisayara erişmek istiyorum, diyor ki üniversitemin ağında bulunan A makinesi . Ancak, bu bilgisayara yalnızca üniversitenin iç ağı üzerinden erişilebilir, bu yüzden SSH'yi bu bilgisayara doğrudan evden kullanamıyorum.

İşte şimdi ne yapıyorum:

  1. Farklı bir üniversite makinesine giriş yapın, diyelim B makinesi

    (Bu makineye B, ev bilgisayarımdaki SSH üzerinden erişilebilir.)

  2. A'ya bağlanmak için B üzerinde SSH kullanın.

Bunu daha hızlı yapmanın bir yolu var mı? Sadece bir ssh komutu kullanmak.


Yanıtlar:


97

Evet, ProxyCommandSSH yapılandırmanızda.

Ana dizininizde bir SSH yapılandırma dosyası oluşturun (bunu sistem genelinde yapmak istemiyorsanız) ~/.ssh/config:

Host unibroker          # Machine B definition (the broker)
Hostname 12.34.45.56    # Change this IP address to the address of the broker
User myusername         # Change this default user accordingly 
                        # (`user@unibroker` can overwrite it)

Host internalmachine    # Machine A definition (the target host)
ProxyCommand ssh -q unibroker nc -q0 hostname.or.IP.address.internal.machine 22

Artık doğrudan A Makinesine doğrudan erişebilirsiniz

ssh user@internalmachine

Ayrıca, artık bunun için tek bir SSH ana bilgisayar hedef adınız olduğunu unutmayın, bunu diğer uygulamalarda da kullanabilirsiniz. Örneğin:

  • SCP dosyaları kopyalamak için.

    scp somefile user@internalmachine:~/
    
  • GUI uygulamalarınızda:

    sftp://user@internalmachine/makineye göz atmak için konum olarak kullanın .

    KDE tabanlı (Dolphin): kullanım fish://user@internalmachine/

notlar

Değişim hostname.or.IP.address.internal.machineve port ( 22Ulaşmak istediğiniz makineye) Eğer adım atmayacağını belirtti sanki unibrokermakinenin.

Unibroker ana bilgisayarındaki netcat sürümlerine bağlı olarak, -q0seçenek atlanmalıdır. Kimlik doğrulama ile ilgili olarak; temelde iş istasyonunuzdan iki SSH bağlantısı kuruyorsunuz. Bu, hem unroBker hem de dahili makine ana bilgisayarının birbiri ardına doğrulandığı / kimliğinin doğrulandığı (hem keypair / parola hem de ana bilgisayar anahtarı doğrulaması için) anlamına gelir.

açıklama

Bu ProxyCommandve 'netcat' kullanımı yaklaşımı bunu yapmanın sadece bir yoludur. Bunu sevdim, çünkü SSH müşterim doğrudan hedef makineyle konuşuyor, böylece ana bilgisayar anahtarını müşterimden doğrulayabiliyorum ve ortak anahtar kimlik doğrulamamı aracıda başka bir anahtar kullanmadan da kullanabiliyorum.

Her biri Hostyeni bir ana bilgisayar bölümünün başlangıcını tanımlar. Hostnamebu ana bilgisayarın hedef ana bilgisayar adı veya IP adresidir. UserKullanıcı kısmı olarak sağlayacağınız şeydir ssh user@hostname.

ProxyCommandHedef makineye boru olarak kullanılacaktır. İlk makineye SSH kullanarak ve doğrudan ncoradan hedefe basit bir 'netcat' ( ) kurarak , bu temelde aracılardan iç makineye sadece bir düz metindir. -qSeçenekler herhangi bir çıktı (sadece kişisel bir tercih) susturmak için vardır.

AracıyaNetcat-openbsd programını yükleyin netcat yüklediğinizden emin olun (genellikle varsayılan olarak Ubuntu'da bulunur) - netcat-openbsd veya netcat-traditionalNetcat-traditional yükleyin .

Burada hala iki kez şifrelemeli SSH kullandığınızı unutmayın. Netcat kanalı düz metin iken, PC'nizdeki SSH istemcisi, son hedef makineyle şifrelenmiş başka bir kanal daha kurar.


4
Kullandığım makine tarafından desteklenmediğinden -q0 seçeneğini kaldırmak zorunda kaldım. Bunun dışında hepsi işe yaradı. Bu harika bir ipucudur. Çok teşekkür ederim. :)
Gerry

Bir sorunla karşılaştım, cevabınız benim için terminalden iyi çalışıyor, ancak gui sftp'yi kullanarak yapamıyorum, diyor: işlenmemiş hata mesajı, oturum açarken zaman aşımına uğradı.
Vikash B

@VikashB Peki, gerçekten çalışması gerekir. Özel durumunuzu ele almak için YENİ bir soru oluşturmayı düşünün.
gertvdijk

Burada yaptım soru şu: askubuntu.com/questions/688567/…
Vikash B

1
@Gertvdijk'ün bilge kelimesini tamamlamak için, ssh proxy'leri ve zıplayan konaklar konusunda çok değerli bir referans olarak kullanılabilecek harika bir wikibook var .
Travis Clarke

51

Tek seferde zıpla

Diğer cevabımda verdiğim ProxyCommand yaklaşımına bariz bir alternatif doğrudan hedef makineye 'atlamak' olabilir:

ssh -t user@machineB ssh user@machineA

Not -tİlk üzerindeki sshkomuta. Onsuz, başarısız olacak:

Pseudo-terminal will not be allocated because stdin is not a terminal.
ssh_askpass: exec(/usr/bin/ssh-askpass): No such file or directory
Permission denied, please try again.
[...]

Tahsis edilecek gerçek bir TTY'yi zorlar

Bunun dezavantajı, şimdi tüm yapılandırma, doğrulama ve doğrulama işlemlerinin, güvenlik nedenlerinden dolayı durumumdan gerçekten hoşlanmadığım Makine B'de gerçekleşmesidir. Tuş takımımı kendi bilgisayarımda seviyorum ve son hedef makinemin kimliğini doğrulamak ve kendi bilgisayarımdan doğrulamak istiyorum. Ek olarak, etkileşimli kabuğu yalnızca SSH için kullanabilirsiniz; bu, SCP veya GUI dosya yöneticinizi kullanma gibi diğer araçlarla ilgilenmez.

Yukarıda belirtilen tüm nedenlerden dolayı ProxyCommand yaklaşımını şiddetle tavsiye ediyorum , ancak hızlı bağlantı için bu iyi sonuç veriyor.


Neden 'One Off' ve Kalıcı çözümlerle bir yanıt alamıyorsunuz?
çekingen

5
@demure StackExchange siteleri böyle çalışır ... Bakın: Bir soruyu iki kez yanıtlamadaki resmi görgü kuralları nedir? “İki farklı cevap göndermek, onları tek bir cevaba koymaktan iyidir” diyor . . Ve bunun aynı çözüm olduğunu düşünmüyorum. Kalıcı / geçici olarak bence bu yaklaşımı farklı kılan şey değil.
gertvdijk

Diğer rehberler ek olarak -A anahtarını kullandığını söylüyor, ancak bunun güvenlik çıkarımı olduğunu gösteriyor. Kimlik doğrulama aracısı bağlantısını iletmenin veya iletmenin ne anlama geldiğini biliyor musunuz?
Diagon

@gertvdijk süper ninja burada! en iyi İKİ çözümünüz var. bunu daha önce hiç görmedim. Süper havalı. N çözümleri ile bir uzun mega çözüm üretmekten daha iyi bir yol.
Trevor Boyd Smith

Bu, diğer ssh'leri de engelleyecek bir yapılandırma ayarlamaktan çok daha uygundur.
Nikhil Sahu

37

-JKomut satırı seçeneğini kullanabilirsiniz :

ssh -J user@machineB user@machineA

Kimden man ssh:

-J [user@]host[:port]
     Connect to the target host by first making a ssh connection to
     the jump host and then establishing a TCP forwarding to the
     ultimate destination from there.  Multiple jump hops may be
     specified separated by comma characters.  This is a shortcut to
     specify a ProxyJump configuration directive.

OpenSSH versiyon 7.3'te (Ağustos 2016'da piyasaya sürüldü) tanıtıldı . Ubuntu 16.10 ve sonrasında mevcuttur.


3
+1, çünkü makine A için önemli bir dosya belirlemeniz gerekse bile çalışır
Grief

1
+1, tüm ana bilgisayarlarınız yeterince yeni bir OpenSSH sürümü kullanıyorsa, ProxyCommand cevabımla karşılaştırıldığında daha iyi sürüm.
gertvdijk

OpenSSH sunucusu bu durumda hem A hem de B makinelerine kurulmalı mı? Haklı mıyım?
Mikhail

17

Kullanmayı deneyin

Host <visible hostname alias>
        Controlmaster auto
        User <user>
        hostname <visible hostname>
        port <port>
        IdentityFile ~/.ssh/<id file>

Host <private LAN hostname alias>
     ProxyCommand ssh -q -W <private LAN hostname>:<private LAN port> <visible hostname alias>

~ / .ssh / config dosyanızda ve hepsini yalnızca bilgisayarınızda bulunan tuşlarla tek seferde yapın.


1
Bu, netcat'ı karışıma eklemekten daha temizdir. Ayrıca, özel SSH anahtarının da Bmakinede bulunması gerekmez .
danemacmillan

1

Bu çok faydalı bir öneri. Yaklaşık saatlerce uğraştıktan sonra bu notu buldum ve bunun tam olarak belgelendiği gibi çalıştığını onayladım. MachineA üzerinden MachineB'ye, uzak machineC'den bağlanmak için:

örn .: [xuser @ machineC ~] ssh -t MakineA ssh MachineB

"-T" kritiktir, yoksa ssh başarısız olur. İlk önce MachineA'da parola, sonra da MachineB'de ikinci kez parola istenir. Ayrıca, bunun her üç makinede tanımlanmış bir "xuser" kullanıcısı olduğunu varsaydığını unutmayın. Değilse, sadece ssh sözdizimini kullanın: "yuser @ MachineA ...". Ayrıca isterseniz noktalı dörtlü ham IP # s kullanabileceğinizi unutmayın. Bu, dünyaya açık olmayan IP'leri kullanan - yani özel bir yerel ağ üzerinden bağlanıyorsanız kullanışlıdır. yerel ana makinenizde veya herhangi bir DNS’de bulunmuyor. MachineB'den uzak machineC'ye bir dosya almak için, MachineB'den MachineA'ya, ardından MachineA'dan uzak machineC'ye scp yapabilirsiniz. (Örneğin, uzak makineC, MakineA'ya ping yapabilir, ancak MakineB'ye ping yapabilir.) Uyarı: Fedora ve WindowsXP ile test ettim, MachineA, ICS (Internet Bağlantı Paylaşımı) çalıştıran bir XP kutusudur. MachineB ve uzak machineC ise Fedora-Linux kutularıdır. Bu öneri benim için önemli bir sorunu çözdü - yani. kısıtlı, izlenen uzak site lanıma uzaktan erişim. Ayrıca, MachineB'den "oturumu kapattığınızda", iki "xxx.xxx.xxx.xxx'e bağlantı kapalı" görmeniz gerekir. mesajlar.


Genel anahtar kimlik doğrulamasını ayarladıysanız ve yapılandırırsanız, şifrelerinizi girmek konusunda endişelenmenize gerek yoktur. Ama -tyine de gerekli.
Felipe Alvarez

@FelipeAlvarez A makinesine şifre olmadan giriş yapabilmek için B makinesine güvenmiyorsanız, ikinci şifreyi girmekten endişe duymanız gerekir.
Michael

1

ProxyCommand, her iki sistemde de kabuk erişimine izin verdiğinizde bir durum için temiz bir çözümdür. Uzaktaki kullanıcıların bir aracı (B) üzerinden bir iç makineye (A) erişimini sağlamak istedik, ancak kullanıcının daha iyi güvenlik için bir kabuk erişimine izin vermeden. Bu çalıştı:

Giriş kabuğunu değiştirin

Aracıdaki oturum açma kabuğunu (kullanım chsh) extuseraşağıdaki komut dosyasıyla (bir dosyada saklanır) değiştirin:

#!/bin/sh   # this is essential to avoid Exec format error
ssh internaluser@A

Uzak kullanıcı için extuser @ B’de ve extuser @ B dahili kullanıcı @ A’da parola girişi yapılmazsa, aşağıdaki komutu uygulamak uzaktaki kullanıcıyı doğrudan A

ssh extuser@B

İpucu : Özel giriş kabuğuna geçmeden önce gerekli şifre girişi yapılmadan onay_arafları @ B Extuser ayarını oluşturun. Değişiklikten sonra, bu hesaba bir kabuk aracılığıyla herhangi biri tarafından erişilemediğinden, yalnızca bir sudoer @ B doğrudan düzenleyerek dosyada yetkili_anahtarlar üzerinde değişiklik yapabilir.

sudo vi ~extuser/.ssh/authorized_keys
sudo touch ~extuser/.hushlogin

Son satır, giriş başlığı ekranını B'den kaldırmak, böylece uzaktaki kullanıcı A'ya şeffaf bir şekilde erişebiliyor.


Çok ilginç bir yaklaşım. Bununla birlikte, bunun ana dezavantajları şunlardır: 1) Kullanım, standart SSH kullanımı ile sınırlıdır (SFTP / SCP desteği yoktur). 2) Bir kullanıcı bekar olandan başka bir hedef ana bilgisayarı seçemez (çünkü giriş kabuğunda kodlanmış) 3) Ana bilgisayar anahtar doğrulaması iş istasyonundan son hedef ana bilgisayara kadar yapılamaz (broker SSH binary kullanıldığından beri) . 4) Kullanıcıların nihai hedef ana bilgisayara erişmeleri için özel anahtarlar, kullanıcı yerine kullanıcı üzerinde bulunur. Bu, kullanıcının bir yönetici tarafından kimliğine bürünmesine izin verir (normal olarak mümkün değildir).
gertvdijk

Tüm noktalar doğru, detaylandırdığınız için teşekkürler. Bununla birlikte, birincil amaç B'ye giriş yapmadan A'ya güvenilir bir kullanıcı ssh erişimi sağlamaktır. Yalnızca yönetici güvenilen kullanıcının genel anahtarını B'ye ekleyebildiğinden (sudo aracılığıyla, giriş yapmadan), bu zaten kullanıcının admin) @ extuser'ın özel anahtarına erişim (dışarıdaki güvenilir kullanıcının değil) ve ilk etapta ayarlamış!
Sunthar

1

Birkaç jumper'a ihtiyacın var demek istiyorsun :)

Son zamanlarda, bu sorun jumper1 jumper2 ve son makinemle karşılaştığımda, solum için olduğu gibi

yerel komut dosyası:

#!/bin/bash
sshpass -p jumper1Passwd ssh -t jumper1@jumper1IP ./Y00.sh

daha sonra 1. jumper'a (yönlendiricim olan), Y00.sh adında bir komut dosyası yerleştirdim:

ssh -tt jumper2@jumper2 -i ~/.ssh/id_rsa sshpass -p finalPassWord ssh -tt final@final

Bunları IP ve şifrelerinizle değiştirebilirsiniz, iyi şanslar!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.