NAT yönlendirici arkasındaki ofis ana bilgisayarına SSH erişimi


33

Ofis linux sunucumun ssh portuna evden erişmek istiyorum. Maalesef, ana bilgisayar bir NAT yönlendiricisinin arkasında bulunur. Dolayısıyla, IP adresi halka açık değildir. Ancak, ne yazık ki sadece root olmayan erişim olan başka bir internet sunucusuna (Sunucu) erişim var. Bir süre aradıktan sonra uygun bir çözüm bulamıyorum.

Aşağıdaki kurulum:

  • Office PC'si (linux, root erişimi) NAT'un arkasında (IP genel değil) ancak tam İnternet erişimi.
  • Sunucu PC (linux, root erişimi yok) statik ve genel IP ve tam Internet erişimi.
  • Ev arkasındaki PC (linux, root erişimi) NAT (IP herkese açık değil) fakat tam İnternet erişimi.

Olası bağlantılar: Office PC -> Server <- Home PC

Mümkün değil: Office PC <-X- Sunucu -X-> Ev Bilgisayarı

Ne Home PC ne de Sunucu, Office PC'ye erişimi başlatamaz. Ancak, hem Office PC hem de Home PC, Sunucuya bağlantılar başlatabilir.

Ters SSH tüneli mümkün değil: Ters ssh-tüneli adı verilen bir yöntem denedim. Maalesef bu, Sunucu üzerinde Ağ Geçidi seçeneğinin, / etc / ssh / sshd_config içinde "yes" olarak ayarlanmasını gerektirir;

Prensip olarak mümkün olmalıdır:

0) Sunucuda 2 bağlantı noktasını dinleyen bir kullanıcı alanı programı başlatıyorum (1 gelen, 1 giden)

1) Ofis bilgisayarımda, TCP bağlantısını sunucudaki giden bağlantı noktasına açık tutan başka bir program yürütüyorum.

2) Evden, Sunucunun gelen bağlantı noktasına bağlanıyorum.

Bunun için standart bir çözüm olmalı.

Bunu çözmek için en hızlı ve en temiz çözüm nedir?

dürüst


1
iş bilgisayarı eve bağlanabilir mi ssh tüneli kurar? en.gentoo-wiki.com/wiki/Autossh

FileZilla'yı sftp ve port yönlendirme ile kullanabilirsiniz. Çıkış: superuser.com/a/1286681/141314
Noam Manos

Yanıtlar:


31
youatwork@officepc$ autossh -R 12345:localhost:22 notroot@serverpc

Sonra:

you@homepc$ autossh -L 23456:localhost:12345 notroot@serverpc

you@homepc$ ssh youatwork@localhost -p 23456

Yapabilecekleriniz şuydu: 1. adımda, ofis PC'den sunucuya uzak bir bağlantı noktası iletin ( 12345örnek olarak kullanılırsa,> 1024 herhangi bir bağlantı noktası yapmalıdır). Şimdi sunucuda 12345'e bağlanma sizi officepc'deki 22 numaralı bağlantı noktasına bağlamalıdır.

2. adımda, 23456 numaralı bağlantı noktasını ev makinenizden sunucuda 12345'e iletin (bu nedenle 1. adımda ayarlandığı gibi resmi program: 22'ye iletilir)

3. adımda, ofis PC giriş bilgilerinizle yerel 23456 numaralı bağlantı noktasına bağlanırsınız . Bu, 2. adımda sunucunuzdaki 12345 numaralı bağlantı noktasına ve 1. adımda ofis PC'nize iletilir.

Aktarımlar için otomatik olarak kullandığımı, bağlantının kesilmesi durumunda tüneli otomatik olarak yeniden bağlayan bir ssh sarmalayıcısı olduğunu unutmayın; ancak normal ssh, bağlantı kopmadığı sürece de işe yarayacaktır.

Olası bir güvenlik açığı vardır: serverpc üzerindeki localhost: 12345 ile bağlantı kurabilen herkes şimdi officepc: 22'ye bağlanabilir ve bunu hacklemeye çalışabilir. (Not Bir SSH sunucusuna çalıştırıyorsanız, zaten varsayılan olarak açık olan temel korumaları yukarıda sabitleyin gerektiğini; - örneğin bkz ben root giriş devre dışı bırakma ve şifre doğrulaması devre dışı bırakılması en azından tavsiye bu )

Düzenleme : Bunu aynı yapılandırma ile doğruladım ve işe yarıyor. GatewayPorts noyerel tünelleri değil yalnızca dünyaya açık olan limanları etkiler. İletilen bağlantı noktaları budur:

homepc:
  outgoing ssh to serverpc:22
  listening localhost:23456 forwarded through ssh tunnel
serverpc:
  listening ssh at *:22
  incoming localhost ssh tunnel (from homepc) forwarded to localhost:12345
  listening localhost ssh tunnel (from officepc) forwarded from localhost:12345
officepc:
  outgoing ssh to serverpc:22
  incoming localhost through ssh tunnel (from serverpc) forwarded to localhost:22

Yani, bildiğim kadarıyla ağ yığını söz konusu olduğunda, bu, ilgili döngü arayüzleri (artı ssh bağlantılarında bölgenin trafik var etmek serverpc); bu nedenle GatewayPortshiç kontrol edilmedi.

Bununla birlikte, yönerge vardır AllowTcpForwarding: öyleyse no, bu kurulum geridönüşüm arayüzünde bile değil, hiçbir yönlendirme yapılmasına izin vermediğinden başarısız olur.

Uyarılar :

  • autossh ve en son ssh kullanıyorsanız, ssh kullanmak ServerAliveIntervalve ServerAliveCountMaxtüneli açık tutmak isteyebilirsiniz . Autossh'un yerleşik bir kontrolü var, ancak görünüşte Fedora'da bazı sorunları var. -M0bunu devre dışı bırakır ve -oServerAliveInterval=20 -oServerAliveCountMax=3bağlantının kurulup kurulmadığını kontrol eder - her 20 saniyede bir çalışır, arka arkaya 3x başarısız olursa, ssh'yi durdurur (ve autossh yeni bir tane yapar):

    autossh -M0 -R 12345:localhost:22 -oServerAliveInterval=20 -oServerAliveCountMax=3 notroot@serverpc
    
    autossh -M0 -L 23456:localhost:12345 -oServerAliveInterval=20 -oServerAliveCountMax=3 notroot@serverpc
    
  • ileri başarısız olursa ssh tünelini yeniden başlatmak faydalı olabilir -oExitOnForwardFailure=yes- eğer bağlantı noktası zaten bağlıysa, çalışan bir SSH bağlantısı elde edebilirsiniz, ancak iletilen tünel yoktur.

  • kullanarak ~/.ssh/configseçenekler (ve limanların) için başka komut satırları çok ayrıntılı olsun, tavsiye edilir. Örneğin:

    Host fwdserverpc
        Hostname serverpc
        User notroot
        ServerAliveInterval 20
        ServerAliveCountMax 3
        ExitOnForwardFailure yes
        LocalForward 23456 localhost:12345
    

Sonra sadece sunucu takma adını kullanabilirsiniz:

    autossh -M0 fwdserverpc

Diyelim ki kabul ettiğiniz bu yönteme "reverse ssh-tunnel" denir. Ne yazık ki bu, Sunucudaki Ağ GeçidiPorts'unun / etc / ssh / sshd_config içinde "yes" olarak ayarlanmasını gerektirir. Bu sunucunun ağ geçidi portları etkin değil ve orada root erişimim yok.

3
@Frank: Aslında, sanmıyorum: GatewayPorts noaçılan bağlantı noktalarının yalnızca geridöngü arabiriminde erişilebilir olmasını kısıtlar; 2. adımda geridöngü arabiriminde ilettiğinize dikkat edin (aslında, her ikisi de iletenin "yalnızca yerel ana bilgisayar" olduğunu), bu nedenle çalışabilir ( AllowTcpForwarding nosshd config de bunu kırar).
Piskvor

3
@ Frank: Evet, onaylandı. Bu bile çalışır GatewayPorts no; cevabı düzenledi. Bu kurulumu kırabilecek başka yönergeler (örneğin PermitOpenve gibi AllowTcpForwarding) olduğunu unutmayın: manpagez.com/man/5/sshd_config
Piskvor

1
Mükemmel cevap! Çalışıyor, hafta sonumu kurtardın! Çok teşekkürler!!

1
autossh versiyonum (Fedora Core) -M'siz terminalden çalışamadı. Ayrıca bunu yaşayan başka biriyle de bağlantı kurdum. Bu kılavuzda isteğe bağlı bir argüman olarak işaretlenmiş haklısınız. Çok sayıda insan için işe yararsa, yazık ki bu herkes için değil.
Yaroslav Nikitenko

4

Dahili sunucuya evden ve dahili sunucudan ofis Linux makinenize ssh kurabiliyorsanız, o zaman evden ssh ProxyCommandkullanarak sunucudan iç makineye sessizce sıçramak için kullanabilirsiniz nc(netcat)

# ~/.ssh/config on your home machine:
Host internalpc 
   ForwardAgent yes 
   ProxyCommand ssh user@server.example.com exec nc internal.pc.example.com %p

O zaman siz ssh user@internalpcve sadece sessizce sunucu makinesine iletilirsiniz, iki tarafta da bağlantı noktası veya tünel açmaya gerek yoktur.


1
Cevabınız için teşekkürler. Ne yazık ki, ne Ev PC'si ne de Sunucu, Office PC'ye erişimi başlatamaz. Ancak, hem Office PC hem de Home PC, Sunucuya bağlantılar başlatabilir.

4

Robo-TiTO'ya SSH'ya uzaktan erişmek istediğiniz bilgisayara yükleyin.

  • Bu, herhangi bir yerdeki Google Talk İstemci Uygulamalarından kullanarak SSH'ye erişmenize olanak sağlar.
  • Genel bir IP adresine veya özel ayarlara gerek yoktur.
  • Artık Ücretsiz ve Açık Kaynaklıdır, artık herhangi bir uygulama hizmetini ödememektedir.
  • SSH portunu açmanıza gerek yok (bilgisayarınızı güvende tutun).
  • Herhangi bir tünel açmaya gerek yok (örneğin, VPN veya buna benzer bir şey)

Aşağıdaki yükleme yönergeleri, site taşındığı için eskidir. Yeni URL, https://github.com/formigarafa/robotito şeklindedir.

Robo-TiTO'yı Raspberry Pi, Debian veya Ubuntu Box'a (Debian paket dağıtımı) kolayca yükleyebilmeniz için bir Raspbian işletim sistemimde Raspberry Pi’de test edildim. Linux kutunuzu uzaktan tanımak için atılacak adımlar budur:

  1. Shell Command'ı açın veya Terminal'i çağırabilir, ana klasörünüze gidin, Installer komut dosyasını indirin:

    $ wget https://opengateway.googlecode.com/files/robotito
    
  2. Bundan sonra komut dosyasını çalıştırarak komut dosyasını çalıştırın:

    $ sudo ./robotito
    
  3. ve sonra credentials.rbGTalk hesabınızı kullanarak Robo-TiTO yapılandırma klasöründen dosyayı düzenleyebilir ve Ctrl+ Xve tuşlarına basarak kaydedebilirsiniz Y. Varsayılan nano editörü kullanıyor.

  4. Robo-TiTO'yı Robo-TiTO klasöründen komut ile çalıştırmak

    $ cd robotito
    $ ./jabbershd start
    
  5. Artık bu yapıldığında herhangi bir Google talk istemcisinden SSH kullanabilirsiniz. Robo-TiTO GTalk hesabını Google talk hesabınıza eklemeyi ve hesabı kullanmadan önce birbirleriyle sohbet ederek test etmeyi unutmayın.


5
"SSH bağlantı noktasını açmaya gerek yok (bilgisayarınızı kurtarmaya devam et ") - ciddi bir sorunum var - teklif ettiğiniz jeober botu , düz metin olarak alıntı ile güvence altına alınmıştır . Bu kelimenin tam anlamıyla sıfır güvenlik - kimsenin girmesi için kamyon boyutunda bir delik açıyorsunuz. SSH ortak anahtar kimlik doğrulamasının aksine: Kabloyu asla geçmeyen kimlik bilgileri kullanarak güvenli bir kanal üzerinden kimlik doğrulaması yapıyorum . Şimdi bilgisayarını kim güvende tutuyor? CLIENT_PASSPHRASE = "logmein"
Piskvor

@Piskvor, robotito komutları yalnızca beyaz listedeki kişilerden çalıştırır. github.com/formigarafa/robotito/blob/master/config/…
formigarafa

Beyaz liste tabanlı kimlik doğrulaması yüzünden hiçbir zaman sorun yaşamadım. Yanılmıyorsam, GTalk ile kullanırken mesaj aktarımı şifrelenir. Öyle ya da böyle, kısa süre önce değiştirdim ve şimdi erişime izin vermek için Google Authenticator veya benzeri bir araçtan bir One Time Password kullanıyor.
formigarafa

1
@formigarafa: (1) Bu ürünün geliştirilmesinde iseniz veya ilginiz varsa, açıkça söylemelisiniz. Aynı ismi kullanmak yeterli değil; çoğu insan bunu farketmez. ( Profilinizde bunu belirtebilirsiniz .) (2) Bir yayını düzenlerken, olabildiğince düzeltmelisiniz. Örneğin, “I'ts” gibi yazım hataları yakalamaya çalışın. Ve eğer bir bağlantı kopmuşsa, sadece bağlantıyı ölü bağlantı olarak etiketlemeyin; yeni URL'yi gönderiye yerleştirin . İnsanların doğru bilgileri bulmak için yorumları incelemesi gerekmemelidir.
G-Man 'Reinstate Monica' Dedi

@ G-Man, Orijinal cevap ve düzenleme benim değildi. Ve asla benim gibi görünmesini sağlama niyetim olmadı. Yanıtta ölü bir bağlantı olduğunu fark ettim, bağlantıyı ben de oluşturmadım. Aslında içeriğini görmeye istekliydim ve izlemeye çalıştım. Maalesef kaynağı bulamadım. Cevabı yazan her kim tarafından değişiklik bildirileceğini ve düzeltmeye çalışacağını ümit ettim.
formigarafa

3

Piskvor'un çözümü işe yarıyor ve çok hoş. Ancak, giriş kabukları asılıyken sarkan terminallerin açık kalmasını sağlar. Çok havalı değil.

Her zaman bir sunucuya bağlanmak ve cron'da çalıştırarak bağlantıda kalmak için yazdığım bu küçük betiği kullandım:

#!/bin/bash
TARGET_HOST=${1:-myserver.example.com}
TARGET_PORT=${2:-7777}
TUNNEL_PORT=${3:-22}
T_USER="odin"

#Check that we have an active connection to the remote system
ACTIVE_PROCESS=`ps -ef | \
    grep "ssh $TARGET_HOST -l $T_USER -R $TARGET_PORT:127.0.0.1:$TUNNEL_PORT" | \
    grep -v grep | \
    wc -l`
if [ $ACTIVE_PROCESS -lt 1 ]; then
    echo "`date` : establishing connection to $TARGET_HOST on port $TARGET_PORT"
    screen -m -d ssh $TARGET_HOST -l $T_USER -R $TARGET_PORT:127.0.0.1:$TUNNEL_PORT > /dev/null
fi

Bahse girerim Piskvor’un çözümünü belki ayrık bir ekranla birlikte daha zarif autossh kullanarak düzeltebiliriz ya da bağlantıyı arka planda tutmak için -NT ssh argümanlarını kullanabiliriz.


İltifatlar için teşekkür ederim :) Kullanım durumlarım için düzenli olarak kabuk erişimine ve sevkiyatlara ihtiyacım var; Ayrıca, minimal durumu burada göstermeye çalıştım (yukarıdakileri şeffaf SSH ana bilgisayar atlamalıyken iki komutla basitleştirmek mümkündür, ancak bu, homepcbilgisayarda ek yapılandırma gerektirir ).
Piskvor

2

Bana göre, SSH tüneli yerine, bir VPN denemelisiniz: Hamachi gibi proxy yapmak için dışarıdan bir sunucu kullanarak çalışan bir tür . Bunun gibi başka özgür yazılımlar da var, ama Hamachi benim favorim.


1
Şimdi bu 5.0.0.0/8ağ aslında atanan genel IPv4 adresleri, Hamachi (Hamachi çalışıyorsa, sen internetin biraz rasgele kısmını erişemez) dertte. Ayrıca, Hamachi artık kullanımı ücretsiz değil.
Piskvor,
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.