Ters SSH tüneli nasıl çalışır?


350

Bunu anladığım gibi, güvenlik duvarları (varsayılan ayarları varsayarsak), önceden gelen giden trafiği olmayan tüm gelen trafiği reddeder.

Bir ssh bağlantısını ters çevirme ve SSH Tünel Yapma Kolaylığına dayanarak, sinir bozucu güvenlik duvarı kısıtlamalarını aşmak için ters SSH tünelleme kullanılabilir.

Uzak bir makinede kabuk komutları çalıştırmak istiyorum. Uzak makinenin kendi güvenlik duvarı var ve ek bir güvenlik duvarının (yönlendirici) arkasında. 192.168.1.126 (veya benzeri bir şey) gibi bir IP adresine sahiptir. Güvenlik duvarının arkasında değilim ve uzak makinenin IP adresini Internet'ten görüldüğü gibi biliyorum (192.168.1.126 adresi değil). Ayrıca, birinden ssh (something)önce uzaktaki makinede root olarak çalışmasını isteyebilirim .

Biri bana, adım adım, SSH tünelinin güvenlik duvarlarını (yerel ve uzak makinelerin güvenlik duvarları ve aralarındaki ek güvenlik duvarı) etrafından dolaşmak için nasıl çalıştığını açıklayabilir mi?

Anahtarlar (rolü nedir -R, -f, -L, -N)?


Yanıtlar:


402

Bu tür şeyleri görselleştirme yoluyla açıklamayı seviyorum. :-)

SSH bağlantılarınızı tüp olarak düşünün. Büyük tüpler Normalde, uzak bir bilgisayarda bir kabuk çalıştırmak için bu tüplere ulaşırsınız. Kabuk sanal bir terminalde çalışır (tty). Ama sen bu kısmı zaten biliyorsun.

Tüneli bir tüpün içindeki bir tüp olarak düşünün. Hala büyük SSH bağlantınız var, ancak -L veya -R seçeneği içinde daha küçük bir tüp kurmanıza izin veriyor.

Her tüpün bir başlangıcı ve bir sonu vardır. SSH bağlantınız olan büyük tüp SSH istemcinizle başladı ve bağlandığınız SSH sunucusunda sona erdi. Küçük tüplerin tümü aynı uç noktalara sahiptir; ancak "başlangıç" veya "son" rolünün, bunları oluşturmak için -Lveya -R(sırasıyla) kullanıp kullanmamaya göre belirlenmesi haricinde belirlenir .

(Söylemediniz, ancak güvenlik duvarının arkasındaki bilgisayardan bahsettiğiniz "uzak" makinenin Ağ Adresi Çevirisi (NAT) kullanarak İnternete erişebildiğini varsayacağım. lütfen yanlışsa bu varsayımı düzeltin.)

Bir tünel oluşturduğunuzda, cevaplayacağı bir adres ve bağlantı noktası ve teslim edileceği bir adres ve bağlantı noktası belirtirsiniz. -LOpsiyon tüneli (ana bilgisayar müşterinize çalıştıran) lokal tarafında cevap tüneli anlatır. -RSeçeneği uzak tarafında (SSH sunucusu) üzerinde cevaplamak için tünel söyler.

ssh tünel tarifi

Yani ... İnternetten bir güvenlik duvarının arkasındaki bir makineye SSH yapabilmek için, söz konusu makineye dış dünyaya bir SSH bağlantısı açmanız ve -R"giriş" noktası "uzak" tarafı olan bir tünel eklemeniz gerekir . onun bağlantısı.

Yukarıda gösterilen iki modelden birinin sağda olmasını istersiniz.

Güvenlik duvarı ana bilgisayarından:

ssh -f -N -T -R22222:localhost:22 yourpublichost.example.com

Bu, müşterinize bir -Remote giriş noktası olan bir tünel kurmasını söyler . Tünelin uzak ucundaki 22222 numaralı limana takılan herhangi bir şey, "localhost" un tünelin çıkış noktası (yani ssh istemciniz) perspektifinden olduğu “localhost port 22” ye ulaşacaktır.

Diğer seçenekler:

  • -f kimliğini doğruladıktan sonra ssh'nin kendisini arkaya bildirmesini sağlar, böylece tünelin hayatta kalması için uzak sunucuda bir şeyler çalıştırarak oturmak zorunda kalmazsınız.
  • -NSSH bağlantısı istediğinizi, ancak gerçekte herhangi bir uzak komutu çalıştırmak istemediğinizi söylüyor. Yarattığınız tek şey bir tünelse, bu seçeneğin dahil edilmesi kaynakları korur.
  • -T Etkileşimli bir kabuk oluşturmaya çalışmadığınız için uygun olan sözde tty tahsisini devre dışı bırakır.

Parolasız bir oturum açma için DSA veya RSA anahtarlarını ayarlamadıysanız, bir parola mücadelesi olacaktır.

Sadece bu tünel / müşteri / sunucu için kurduğunuz bir fırlatma hesabı (kendi giriş bilgilerinizi değil) kullanmanız şiddetle tavsiye edilir.

Şimdi, genel evinizdeki kabuğunuzdan , güvenlik duvarı olan ana makineyle tünel üzerinden bir bağlantı kurun:

ssh -p 22222 username@localhost

Muhtemelen daha önce hiç bu ana makineye isabet etmediğiniz için bir ana bilgisayar anahtar mücadelesi alırsınız. Ardından usernamehesap için bir şifre ile karşılaşacaksınız (şifresiz giriş için anahtarlar ayarlamadıysanız).

Bu ana bilgisayara düzenli olarak erişecekseniz, ~/.ssh/configdosyaya birkaç satır ekleyerek erişimi de basitleştirebilirsiniz :

host remotehostname
    User remoteusername
    Hostname localhost
    Port 22222

Ayarlayın remotehostnameve remoteusernameuygun. remoteusernameAlan uzak sunucudaki kullanıcı adınızı eşleşmesi gerekir, ancak remotehostnamesize uygun herhangi bir konak ismi, bu çözülebilir bir şey eşleşmesi gerekmez.

( Localhost olmayan bir IP üzerinde ters uç noktasını göstermek için bu gönderiye göz atın )


2
Peki ya ssh -D. Lütfen aynı yöntemi kullanarak açıklayın.
BigSack

6
SOCKS vekilleri tüneller ile aynı değildir. Bunları nasıl kullanacağınızla ilgili bir sorunuz varsa, lütfen sorunuz .
ghoti

12
Sunucu, müşteri, yerel makine, uzak makine, ev sahibi, genel yayıncınız, yerel ana bilgisayar, uzak ana bilgisayar adı: terimlerin gevşek kullanımı nedeniyle bu açıklamanın ardından çok zor bir zaman geçiriyorum. Bütün bu gevşek ve tanımsız terimlerle, birisinin bunu ayarlamak için 8 bilgisayara ihtiyaç duyacağı varsayılabilir. Bunu belirtiyorum çünkü diğer tüm yönlerden çok iyi bir açıklama gibi görünüyor. Lütfen terimleri azaltın ve tanımlayın.
Rucent88

4
@ Rucent88, hangi indirgemenin mümkün olacağından emin değilim. Bir istemci bir sunucuya bağlantı kurar. Ağ dünyasının tamamında yaygın bir terminoloji budur. Yerel ve uzak makineler oldukça belirgin görünüyor. Dokümantasyonu okuduktan sonra SSH veya genel unix terminolojisi konusunda kafanız karışırsa, burada olabilecek sorularınızı yanıtlamak isteyen insanları bulmakta hiç zorlanmayacağınıza eminim.
saat

9
@ghoti Gerçekten kafa karıştırıcı, çünkü yerel ve uzak makineler göreceli. İşyerinde otururken ev bilgisayarım uzak, evde oturduğumda işyeri bilgisayarım uzak. Sunucu ve müşteri aynı zamanda tünelden bahsederken kafa karıştırıcıdır. Örneğin, ssh -R ile işten eve bağlanırsam. İşimi ev bilgisayarından localhost bağlayarak bağlarım. Yani soket bakış açısına göre sunucu ev bilgisayarı kendisidir. Ama mantıksal olarak iş bilgisayarıma bağladım. Bu kafa karıştırıcı.
Calmarius

357

Bazı çizimler çizdim

Ssh tunnel komutunun yazıldığı makine, “ sunucunuz” olarak adlandırılır .

Yerelden başlayan ssh tüneli


uzaktan başlayan ssh tüneli

Giriş

  1. yerel: -L Specifies that the given port on the local (client) host is to be forwarded to the given host and port on the remote side.

    ssh -L sourcePort:forwardToHost:onPort connectToHostşu anlama gelir: ssh ile bağlanın connectToHostve tüm bağlantı denemelerini , makineden ulaşılabilen makinedeki bağlantı noktasına yerel sourcePort olarak iletin .onPortforwardToHostconnectToHost

  2. uzaktan: -R Specifies that the given port on the remote (server) host is to be forwarded to the given host and port on the local side.

    ssh -R sourcePort:forwardToHost:onPort connectToHostşu anlama gelir: ssh ile bağlanın connectToHostve tüm bağlantı denemelerini yerel makinenizden ulaşılabilen makinedeki uzak sourcePort bağlantı noktasına yönlendirin .onPortforwardToHost

Ekstra seçenekler

  • -f kimliğini doğruladıktan sonra ssh'nin kendisini arkaya bildirmesini sağlar, böylece tünelin hayatta kalması için uzak sunucuda bir şeyler çalıştırarak oturmak zorunda kalmazsınız.
  • -NSSH bağlantısı istediğinizi, ancak gerçekte herhangi bir uzak komutu çalıştırmak istemediğinizi söylüyor. Yarattığınız tek şey bir tünelse, bu seçeneğin dahil edilmesi kaynakları korur.
  • -T Etkileşimli bir kabuk oluşturmaya çalışmadığınız için uygun olan sözde tty tahsisini devre dışı bırakır.

Senin örnek

Üçüncü resim bu tüneli temsil eder. Ancak “sunucunuz” adlı mavi bilgisayar, birinin ssh tüneli başlattığı bilgisayarı , bu durumda güvenlik duvarı makinasını temsil eder.

Bu nedenle, birisinden makinenize bir ssh tüneli bağlantısı başlatmasını isteyin . Komut temelde benzemelidir

ssh -R 12345:localhost:22 YOURIP

Şimdi tünel açılıyor. Artık ssh ile güvenlik duvarı olan makineye tünel üzerinden komut ile bağlanabilirsiniz.

ssh -p 12345 localhost

bu bağlantı noktasında kendi localhostmakinenize (makinenize) bağlanacak 12345, ancak bağlantı noktası 12345tünelden güvenlik duvarı olan bilgisayarın yerel ana bilgisayarının 22 numaralı bağlantı noktasına (yani güvenlik duvarı olan bilgisayarın kendisi) iletilir.


9
Mükemmel cevap! Bunu bir sunumda kullanacaksınız.
Isaiah Turner

4
Teşekkür ederim. Rica ederim. Vektör görüntülerini istiyorsanız (svg veya pdf) bana bir mesaj yazın.
erik

1
@erik, Bu görüntüleri nasıl çizdiniz?
Pacerier

31
oh dostum, keşke man sayfalarının bunun gibi açıklamaları olsaydı! Teşekkürler!
Lucas Pottersky

30
Biliyor musun ? Metin açıklamalarını okumak zorunda bile değildim. Harika iş !
deppfx

21

ssh tüneli ek trafik göndermek için önceden kurulmuş olan ssh bağlantısını kullanarak çalışır.

Uzak bir sunucuya bağlandığınızda, normal kullanıcı etkileşimi için genellikle sadece 1 kanalınız olur (veya STDIN / STDOUT / STDERR'yi ayrı görürseniz 3 kanal). Herhangi bir zamanda yerel veya uzak ssh işlemi, mevcut bağlantıda ek kanallar açabilir. Bu kanallar daha sonra tünel trafiğini gönderir / alır. Herhangi bir trafik gönderirken veya alırken, ssh işlemi basitçe "bu trafik kanal foobar içindir" der.

Esasen şöyle çalışır:

  1. Ssh'e XXXX bağlantı noktasını dinlemeye başlamasını ve alınan herhangi bir trafiğin tünellenmesi ve ardından ZZZZ bağlantı noktasında YYYY olarak ayarlanmasını söyleyin.
  2. Yerel ssh, XXXX bağlantı noktasını dinlemeye başlar (genellikle açık 127.0.0.1ancak değiştirilebilir).
  3. Bazı uygulamalar yerel makinede XXXX bağlantı noktasına bağlantı açar.
  4. Yerel ssh, uzak ssh'e bir kanal açar ve "bu kanaldaki herhangi bir trafik YYYY'ye gider: ZZZZ
  5. Remote ssh YYYY: ZZZZ'ye bağlanır ve "Tamam, kanal açık" mesajını geri gönderir
  6. Artık yerel makinedeki XXXX bağlantı noktasına bağlantıyla gönderilen herhangi bir trafik, ssh ile YYYY: ZZZZ arasında proxy ile beslenir.

Bu işlem hem ileri hem de geri tünelleme için aynıdır (yukarıdaki prosedürde 'yerel' ve 'uzak' kelimelerini değiştirin). Her iki taraf da tünele başlayabilir. İlk ssh'ye başladığında bile olmak zorunda değil. Ssh zaten çalışırken tünelleri açabilirsiniz ( ESCAPE CHARACTERSözellikle bakınız ~C).

Rolü için -R, -f, -L, ve -N, gerçekten sadece adam sayfasına bakmalısınız, bu size mümkün olan en iyi açıklama verir. Ama söz edeceğiz -Rve -L.
-RRemote ssh'a bağlantıları dinlemesini ve yerel ssh'nin gerçek hedefe bağlanması gerektiğini söyler. -Lyerel ssh'a bağlantıları dinlemesini söyler ve bu uzak ssh'ın gerçek hedefe bağlanması gerekir.

Not, bu çok kaba bir açıklamadır, ancak neler olduğunu bilmeniz için size yeterli bilgi vermelidir.


16

Bu SSH kılavuzunda, özellikle -L(yerel) ve -R(uzak) arasındaki farklar açıklanmaktadır .


-L

-L [bind_address:]port:host:hostport

Yerel (istemci) ana bilgisayarda verilen bağlantı noktasının, uzaktaki belirli ana bilgisayara ve bağlantı noktasına iletileceğini belirtir .

Bu, isteğe bağlı olarak belirtilen bind_adresine bağlı olarak, yerel taraftaki bağlantı noktasını dinlemek için bir soket tahsis ederek çalışır.

Bir bağlantı bu bağlantı noktasına yapıldığında, bağlantı iletilir güvenli bir kanal üzerinden ve Bağlantı yapıldıktan için hostlimana hostportuzak makineden .

Aşağıdaki örnek, bağlantı noktası 1234'ü kullanarak istemci makineden 127.0.0.1( localhost) bir IRC oturumunu uzak sunucuya tünellemektedir server.example.com:

$ ssh -f -L 1234:localhost:6667 server.example.com sleep 10

Not: -fArka planlar ssh ve remote komutu sleep 10, tünellenecek olan servisi başlatmak için bir süre izin verecek şekilde belirlenir.

Örnek:

ssh `-N` -L 22000:localhost:11000 remote.server.com
  • -N Bağlandıktan sonra sadece orada asılı (bir kabuk istemi almazsınız)

    Uzak bir komut çalıştırma.

  • -L 22000Bağlantı, kişisel L maal makinenizin 22000 numaralı portundan kaynaklanacaktır.

  • localhost:11000- remote.server.comtünelin diğer ucunun localhostliman olduğundan emin olun11000

ssh -N-L 22000: 192.168.1.2: 11000 remote.server.com

Kaynak: Resimli bir rehber, öğretici, nasıl yapılır, ssh tünel açma hakkında .


-R

-R [bind_address:]port:host:hostport

Uzak (sunucu) ana bilgisayarda verilen bağlantı noktasının, yerel sunucudaki belirli ana bilgisayara ve bağlantı noktasına iletileceğini belirtir .

Bu dinlemek için bir soket ayırarak çalışır portuzak tarafında ve bağlantı bu bağlantı noktasına yapıldığında, bağlantı iletilir güvenli bir kanal üzerinden ve Bağlantı yapıldıktan için hostlimana hostportyerel makineden .

Örnek:

ssh -N -R 22000:localhost:11000 remote.server.com
  • -N Bağlandıktan sonra sadece orada asılı (bir kabuk istemi almazsınız)

    Uzak bir komut çalıştırma.

  • -R22000 bağlantısı bağlantı noktası 22000 köken olacak R emote bilgisayar (bu durumda, remote.server.com)

  • localhost:11000kişisel, yerel bilgisayarınız tünelin diğer ucunun localhostbağlantı noktası olduğundan emin olacaktır.11000

ssh -N -R 22000: yerel bilgisayar: 11000 remote.server.com

Kaynak: Resimli bir rehber, öğretici, nasıl yapılır, ssh tünel açma hakkında .


6
kulak ve ağız, kimin konuştuğunu ve kimin dinlediğini net bir şekilde ortaya koyuyor!
Thufir

1
Resimlerinizi çok seviyorum!
Mcantsin
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.