SSH trafiğini orta bir makineden yönlendirin


110

SSH tüneli benim için çok kafa karıştırıcı. Bunu Linux'ta yapıp yapamayacağımı merak ediyorum.

3 makinem var.

A. My local machine at home.
B. Machine at work that I can SSH into (middle man).
C. My desktop at work that I can only SSH into from machine B.

Böylece SSH'yi A -> B'den ve B -> C'den alabilirim, fakat A -> C'den değil.

A'dan B'ye bir SSH tüneli kurmanın bir yolu var mı, bu yüzden diğer SSH komutlarını çalıştırdığımda yerel makinemden mi çalışıyorlar? Temel olarak işten eve bir git repo klonlamaya çalışıyorum (ve Git B makinesine yükleyemiyorum).

Ayrıca, bir kez kurulum .. Nasıl da ayarlarım ki?


Bir yerde etrafta yinelenen bir soru olduğuna inanıyorum, ancak arama-fu'm bugün zayıf.
quack quixote



A makinesinde Linux kullanıyorsanız, A -> B tüneli üzerinden C için tüm trafiği seçerek yönlendirmenize olanak tanıyan sshuttle adlı bir araç kullanın (C'nin B'den göründüğünü varsayalım).
Ocak'ta

Yanıtlar:


128

Bunu .ssh/confighostA'daki dosyanıza yerleştirin ( ayrıntılar için man 5 ssh_config'e bakınız):

# .ssh/config on hostA:
Host hostC
    ProxyCommand ssh hostB -W %h:%p

Şimdi aşağıdaki komut hostB üzerinden otomatik olarak tünel açacaktır.

hostA:~$ ssh hostC

Sen gibi seçenekleri eklemek isteyebileceğiniz -oCiphers=arcfourve -oClearAllForwardings=yessarma beri şeyleri hızlandırmak için sshiçeride sshhesaplama daha pahalı ve ekstra çaba ve sarıcı o tünel zaten şifreli trafik olduğunda kadar güvenli olması gerekmez.


OpenSSH'yi 5.3'ten daha önce kullanıyorsanız, -Wseçenek kullanılamaz. Bu durumda yukarıdakileri netcat ( nc) kullanarak uygulayabilirsiniz :

ProxyCommand ssh hostB nc %h %p  # or netcat or whatever you have on hostB

1
Bu harika! Teşekkür ederim. Bu, son 2 gündür beni yiyen bir sorunu çözüyor: hostC bir güvenlik duvarının arkasında oturuyor ve dünyanın herhangi bir yerinde olabilecek bir dizüstü bilgisayar olan hostA'dan erişmek istediğim verilere sahip. hostB ayrıca hostC ile aynı güvenlik duvarının arkasındadır, ancak dünyaya açık bir SSH portu vardır. Böylece hostC -> hostB'den ssh yapabilirim. HostC & hostB arasına ters bir SSH tüneli kurarım, böylece hostB -> hostC'den (localhost aracılığıyla iletilir) ssh yapabilirim. Hile ile hostA -> hostC'den gidebilirim! OSX'te SCP ve Fugu ile sorunsuz bir şekilde çalışıyor! Teşekkür ederim!
AndyL

-WSeçeneği yerine kullanılmalıdır ncseçeneği.
vy32

Hangi SSH'yi -W, yalnızca hostA'da (orijinli) veya aynı zamanda hostB'de (orta makine) olanı desteklemelidir?
gioele

Bilgi için, aynı üzerinden erişmeniz gereken birden fazla ana makineniz varsa , ortadaki sunucu aracılığıyla birkaç ana bilgisayara erişmeyi süper kolaylaştırarak hostBbirden fazla Host hostCsatır belirtmek mümkündür ProxyCommand.
fduff

7

Düzenleme: Bu yanlış bir yaklaşımdır. Bunun yerine ephemient'in cevabına bakınız . Bu cevap işe yarayacak, ancak potansiyel olarak daha az güvenli ve kesinlikle daha az harika.

Aşağıdaki gibi bir çözüm istediğiniz gibi geliyor:

ssh -L localhost:22:machinec:22 machineb

Bu size bir kabuk kazandıracak machineb. Bunu yalnız bırak; terminal penceresini simge durumuna küçültün.

Eğer bir SSH bağlantısı yaptığınızda Şimdi localhost, aslında bağlı olacaktır machinecyoluyla machineb. Tünel ile işiniz bittiğinde, sadece yukarıdaki komutu kullandığınız terminali kapatın.

Komutu çalıştırmak için süper kullanıcı ayrıcalıklarına ihtiyacınız olacağını unutmayın.


+1 Teşekkürler Wesley. Bu gerçek ssh tünelleme cevabı. İşte bu konuda bir makale: securityfocus.com/infocus/1816
Larry K

3
Genel olarak, bu oldukça kötüdür ... ama bunu OpenSSH'nin eski versiyonlarıyla ya da diğer ssh istemcilerle yapmak zorunda kaldım. 8022 gibi bazı yüksek portları seçebilirsiniz: bu şekilde localhost'taki herhangi bir ssh servisine müdahale etmez ve root olarak çalıştırılması gerekmez. Sadece -p 8022ssh komutlarınıza ekleyin . Ve git ile kolay iş yapmak kolaydır: URI kullanın ssh://localhost:8022/path/to/repo.git.
efemient

3

A'da ssh'nin C'de cereyan etmesine neden olan bir kabuk takma adı istediğiniz gibi görünüyor

  1. A'da ssh me @ b "ssh me @ c hostname" yazıp "C" yi geri alabileceğinizi varsayıyorum.
  2. Sshc foo'yu ssh me içine genişleten bir takma ad sshc yapın @ b "ssh me @ c foo"
  3. Takma adın tam sözdizimi için superuser.com adresine bakın

1
-tEtkileşimli bir kabuk istiyorsanız dış komutun seçeneklerine eklemeniz gerekebilir , çünkü bir komut verildiyse sshvarsayılır -T.
efemient

1

Etkileşimli kabuk için bu basit komutu kullanabilirsiniz:

ssh -J <user>@<hostB> <user>@<hostC>

-J seçenekleri atlama içindir .


0

İşvereniniz bir VPN sağlıyorsa, bunun yerine kullanmanızı öneririm.

Bu şekilde, herhangi bir uygulamayı özel olarak yapılandırmanız gerekmez (ssh dahil) ve güvenlik duvarının arkasındaki herhangi bir makineyi görebilirsiniz. Ek olarak, trafiğinizin tamamı VPN yazılımı tarafından şifrelenecek olup, yanlışlıkla veya kasıtlı olarak şifrelenmemiş trafiğe güvenlik ekleyecektir.


6
Bazen bu hilelere ihtiyacımız olan sebep olan VPN ...
Louis

0

YASS Yine Bir Basit Çözüm

ssh -f -L 2222:HostC_IP_or_Name:22 userOnB@hostB sleep 10 &&
    ssh -o HostKeyAlias=HostC -p 2222 userOnC@localhost
  • İlk komut için bir ssh bağlantısı açın HostB ve anlatmak HostB gelen bağlantıları iletmek için localhost: 2222 için HostC: 22 .
  • -fBağlantı kurulduktan sonra parametre arka gitmek için SSH söyle
  • İkinci komut açık yerel sunucuya basitçe müşteri bağlantısı açar : 2222
  • Seçenek HostKeyAlias gerekli değildir, ancak yanlış ana makineye bağlantıyı önlemeye yardımcı olabilir
  • Not: sleep 10ikinci ssh komutu iletilen bağlantı noktasını kullanana kadar bağlantıyı sürdürmek için komut gerekir. Sonra ikinci ssh iletilen bağlantı noktasını terk ettiğinde ilk ssh kapanacaktır .

şimdi sonraki ssh oturumlarını çalıştırabilirsin:

ssh -o HostKeyAlias=HostC -p 2222 userOnC@localhost

Varyant:

ssh -f -L 2222:HostC_IP_or_Name:22 userOnB@hostB sleep 10 &&
    ssh -M -S ~/.ssh/ssh_HostC22userOnC.sock -o HostKeyAlias=HostC -p 2222 userOnC@localhost

sonraki ssh oturumları çalıştırılarak açılabilir:

ssh -S ~/.ssh/ssh_HostC22userOnC.sock userOnC@localhost

-M ve -S paramunu kullanmanın temel avantajı, HostA'dan HostC'ye yalnızca bir bağlantının açık olması, sonraki oturumun tekrar doğrulanmaması ve daha hızlı çalışmasıdır.


0

Özel durum, karma nix platformlar:

  hostA (linux) -> Ana BilgisayarB (solaris) -> HostC (linux)

HostC'de bir X uygulamasına ihtiyaç duyulursa ve ara atlama, Solaris kutusundadır ... bu durumda ProxyCommand'da ihtiyaç duyulan netcat'ı (nc) şöyle buldum:

hostA: ~ $ vi .ssh / config:

Ana bilgisayar hostC
    ProxyCommand ssh ana bilgisayarıB nc% h% p # burada nc netcat'tır

Sonra otomatik tünel açma işleri:

ana bilgisayarA: ~ $ ssh ana bilgisayarC

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.