Bir SSH tüneli üzerinden bir SSH bağlantısı için kısayol nasıl yapılandırılır


22

Şirketimin üretim sunucuları (FOO, BAR ...) iki ağ geçidi sunucusunun (A, B) arkasında bulunur. FOO sunucusuna bağlanmak için, A veya B sunucusuyla JOHNDOE kullanıcı adıma sahip bir ssh bağlantısı açmam gerekiyor, sonra A (veya B) 'den standart bir kullanıcı adıyla SSH bağlantısı açan herhangi bir üretim sunucusuna erişebilirim WEBBY).

Her seferinde böyle bir şey yapmalıyım:

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

Tahmin edebileceğiniz gibi, kullanmam scpgerektiğinde veya hızlı bir şekilde birden fazla bağlantı açmam gerekiyorsa , bu bir güçlük .

Bir ssh anahtarı yapılandırdım ve ayrıca bazı kısayollar için .ssh / config kullanıyorum.

Yazmak için bir tür ssh yapılandırması yapıp yapamayacağımı merak ediyordum.

ssh foo

ve SSH'nin benim için tüm bağlantıları açmasını / ilerletmesini sağlayın. Mümkün mü?

Düzenle

womble'ın cevabı tam olarak aradığım şeydi ama görünen o ki ağ geçidi sunucusunda kurulu olmadığı için netcat kullanamıyorum.

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

Yanıtlar:


36

Kyle'ın cevabının daha somut bir versiyonu olarak, ~/.ssh/configdosyanıza eklemek istediğiniz şey:

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

host a
  User johndoe

Ardından, "ssh foo" komutunu çalıştırdığınızda, SSH, SSH'yi johndoe@açalıştırmaya netcat( nc), sonra webby@fooda bu tünelden SSH yapmaya çalışacaktır . Sihirli!

Tabii ki, bunu yapabilmek için ağ geçidi sunucusuna netcat kurulmalıdır; Bu paket her büyük dağıtım ve işletim sistemi için mevcuttur.


Mükemmel! Bunu anlamaya çalışıyordum, daha önce hiç böyle bir durumla karşılaşmadım. Gelecekte daha az spesifik bir durumu olan bir başkasına yardım etmesi ihtimaline karşı cevabımı orada tutacağım.
Kyle Brandt

Bağlantımın ayrıntılı çıktısını da içeren orijinal sorumu güncelledim. Görünüşe göre netcat kullanamıyorum. Varsayılan olarak mevcut olması gerekir mi?
Simone Carletti

Her zaman değil, kurma gücünüz var mı? Bunu telnet ile de yapabilirsiniz, daha önce hiç denemedim ...
Kyle Brandt

Ayrıca, netcat'i ana dizininize indirebilir ve orada derleyebilirsiniz. Daha sonra proxy komutunda tam yolu kullanabilirsiniz, yani / home / userName / bin / nc
Kyle Brandt

Az önce sistem ayarlarını kontrol ettim. Ubuntu'da netcat varsayılan olarak erişilebilir görünmektedir, ne yazık ki ağ geçidi sunucuları OpenSUSE tarafından desteklenmektedir. Netcat'ı ağ geçidi sunucularına da yüklemeyi düşüneceğim.
Simone Carletti

7

Netxy'yi röle olarak kullanmak için ~ / .ssh / config dosyanızdaki ProxyCommand yönergesini kullanabilirsiniz:

host server2
    ProxyCommand ssh server1 nc server2 22

Siz sadece 'ssh server2' kullanırsınız. Bu direktifin man sayfa bilgisi 'man ssh_config' içinde bulunur.


5

Ağ geçidi sunucusuna önceden kimliği doğrulanmış bir tüneli koruyan farklı bir yaklaşımı tercih ederim. İçinde ~/.ssh/config:

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

Sonra içinde .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
 }

Yani foo bağlamak için:

s foo

İlk kez bağladığınızda sizi "a" ya karşı doğrular ve kalıcı, arkaplanlı bir ssh tüneli açar. Sonraki "s" çağrıları, önceden yazılmış olan tünelden neredeyse anında açılacaktır.

Harika çalışıyor.


2

Bu tür işlevsellik OpenSSH'nin daha yeni sürümlerinde mevcuttur ve bunu yaparak kullanılabilir.

ssh -W server2 server1

server2Hedef noktanız nerede ve server1proxy sunucunuz. Bunu, ProxyCommandssh config'inizdeki seçeneği kullanarak daha kolay hale getirebilirsiniz :

host = *.example.com
user = packs
port = 22
ProxyCommand ssh -W %h:%p server1

Bunun çalışması için, her üç konumda da OpenSSH 5.4+ uygulamasına ihtiyacınız var: masaüstü, aracı, hedef. (Eh, kesinlikle ilk ve son).
Steve Bennett

@SteveBennett: Bu yöntemi bir süredir kullanıyorum, oldukça iyi çalışıyor. Can sıkıcı birkaç RHEL5 sistemindeki netcat yöntemine geri dönmem gerekti.
Scott Pack,

2

Proxy'de netcatbulunmadığında, şu numarayı deneyin:

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

host a
  User johndoe

O zaman yapabilmelisin ssh foo.

Ayrıca, ssh'nin yeni bir sürümüne sahipseniz (yani, -Wstandart giriş ve çıkışı iletme komutuyla), aşağıdakileri kullanabilirsiniz:

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

host a
  User johndoe

Sonunda, sadece harika bulduğum için (ve özel durumunuzda, kullanıcı adı farklılıkları nedeniyle çalışmayacağından dolayı), bir arkadaşın blog yazısı bu tür bir şeyi nasıl dinamik hale getireceğine ve özyinelemeli olarak SSH proxy'lerini nasıl zincirleyeceğine işaret ediyor bu iyi çalışmıyor):

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

Sonra da tünellenmiş ssh machine1/machine2bir kabuk vermelisin .machine2machine1

Özel kullanarak acaba sedkomutları yerine dirnameve basenamefarklı kullanıcı adları ile sorunu çözmek olmayabilir?


2

Bu yaparak yapılabilir ssh -At johndoe@a ssh webby@foo. -AKomut ileri ssh ajan iken, (eğer vekil üzerine yeniden authenticate zorunda kalmamak böylece) -tolmasını sağlar bir terminal vekil üzerinde var. Aşağıdaki bash işlevi yararlı olabilir:

ssh-bounce () {
    local cmd=""
    for i in "$@"; do
        cmd+="ssh -At $i "
    done
    $cmd
}

Bu, bugüne kadarki en basit çözümdür. Şimdi sadece başka 35 yükselişe ihtiyacı var. (Btw - -A benim için hiçbir şey yapmaz.)
Steve Bennett

0
weppos:~ weppos$ ssh foo -vv
[..]
bash: nc: command not found

Netcat yüklü değil a. Çalıştırdığınızda ssh host "command arg", yerel makinenizde değil command, yürütülür host.


Evet biliyorum. Bu tam olarak bir yorumda womble'ın cevabını bildirdiğim şeydi. :)
Simone Carletti

0

OpenSSH 7.3'ten (2016-08-01) bu yana, ProxyJumpseçenek ve karşılık gelen -Jkomut satırı bayrağı, bir veya daha fazla SSH bastiyonu veya "atlama ana bilgisayarı" yoluyla daha basit bir aktarıma izin vermek için mevcuttu.

Bu nc, Womble'ın çözümünde bulunan harici komuttaki bağımlılığı ortadan kaldırır .

ssh -J johndoe@a webby@foo 

iş istasyonunuzdan akullanıcı johndoe olarak ağ geçidi sunucusuna bir SSH bağlantısı kuracak ve bunun için Webby kullanıcısı için foo barındırmak üzere SSH oturumunu açacaktır .

Sizin için ~/.ssh/configve sizin için hem de sizin için ana bilgisayar tanımları oluşturmayı basitleştirmek içinssh foo

Host a
    User johndoe

Host foo
    User Webby 
    ProxyJump a
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.