Kalıcı arka ssh bağlantısı ters tünel oluşturmak için: doğru yol nedir?


41

İlgili soru: Sunucudan istemciye ssh bağlantısı başlat

Oradan cevap bana çok yardımcı oldu, bu komut ihtiyacım olanı yapıyor:

ssh -R 2225:localhost:22 loginOfServerWithPublicIP@publicIP

Böylece her zaman yeniden bağlanmak için senaryo yazdım:

 #!/bin/bash

 while true; do
    echo "try to connect..."
    ssh -o ServerAliveInterval=240 -R 2225:localhost:22 user@host
    echo "restarting in 5 seconds.."
    sleep 5
 done

Ve bunu da ekledi /etc/crontab. Fakat bunun sadece kabuğundan "elle" çalıştırılması durumunda işe yaradığını öğrendim, ancak cron tarafından çağrılırsa ssh bağlanır ve hemen biter. (yani, yukarıdaki komut dosyası her zaman yeniden bağlanır)

Ondan man ssh, arkaplan bağlantıları için onu -nanahtarla çağırmam gerektiğini öğrendim , ancak yardımı olmadı. Sonra, sadece benzer betikleri araştırdım ve aradığımı tail -f something, bazı "bitmeyen" komutları çağırdığımda çalıştığını gördüm , bu yüzden boş bir dosya oluşturdum /tmp/dummy_fileve şimdi ssh komutum şöyle gözüküyor:

ssh -o ServerAliveInterval=240 -R 2225:localhost:22 -n user@host tail -f /tmp/dummy_file

Şu an çalışıyor! Ancak, bu çözüm biraz çirkin görünüyor, artı bu davranışın gerçek nedenlerini gerçekten anlamıyorum. Sadece tesadüfen, bashyerine aramaya çalıştım tail -f( bashbana da "bitmeyen" emri geldi), ama işe yaramadı.

Öyleyse, lütfen kimse bu davranışı açıklayabilir mi ve ters ssh tüneli açık tutmak için arkaplan ssh bağlantısı oluşturmanın doğru yolu nedir?


&ssh komutunuzun sonunda kullanmaya ne dersiniz :ssh -o ServerAliveInterval=240 -R 2225:localhost:22 user@host &
Networker

Ama daha sonra whiletekrar tekrar çalışacağım, sshher 5 saniyede bir yeni arkaplan bağlantısı başlıyor , değil mi? İhtiyacım olan bu değil.
Dmitry Frank

Yanıtlar:


37

-NSeçeneğin ssh olmasını istediğiniz gibi geliyor .

 -N      Do not execute a remote command.  This is useful for just forwarding ports
         (protocol version 2 only).

16

Düşünmenizi şiddetle tavsiye ederim autossh. Bağlantı kaybının altta yatan sebep olup olmadığını belirlemeye olanak sağlayacak ve yeniden bağlanma girişimlerinin sıklığını düşürecek belirli sezgisel özelliklere sahiptir. Ayrıca, fazladan tüneller kullanarak bağlantıyı izler, bu da sorduğunuz gibi senaryolar için oldukça faydalı olmasını sağlar.

Örneğin, autossh upstartUbuntu'daysanız, tünelin kalıcı bir şekilde tutulması için Ubuntu'yu nasıl yapılandıracağınıza dair bazı faydalı örnekler bulmak için bir web araması yapabilirsiniz .

Bunu, belirli hizmetler için her zaman tünelli bir bağlantının sunucuma açık kalmasını sağlamak için kullanıyorum.


Aslında denedim autossh, bu yazıyı okudum: goo.gl/jVuuSR , ancak sistem önyüklemesinde hemen Internet bağlantım varsa; ancak bağlantı daha sonra kurulursa çalışmadı. Emin değilim, belki yanlış bir şey yaptım, ama bu makalede bile yazar, sleep 10içinde, /etc/rc.localautossh çağrıldığında internet bağlantısının zaten hazır olduğundan emin olmak için var.
Dmitry Frank

2
@DmitryFrank: eğer denemişseniz, sorunuzda bundan bahsetmemenin haksızlık türü. Hala tavsiye ederim. Diğer upstartve init değiştirmeleriyle, tünelin başlangıcını bir veya daha fazla ağ cihazına bağlayabilirsiniz. Web üzerindeki çözümlerin (IMO) en iyisi şudur: erik.torgesta.com/tag/ssh-upstart ... ve hiçbir sleep 10durumda, bazı son durumlarda hiçbir şey için yardımcı olmaz.
0xC0000022L

Bundan bahsetmediğim için üzgünüm, dürüst olmak gerekirse, bana işe yaramadığı zaman bunu sadece "elle" yapmaya karar verdim ve tamamen autossh'u unuttum. Teşekkürler ssh-upstart, ben bir göz atacağım!
Dmitry Frank

partiye geç kaldı ama eklemek istediğim bir ters tüneli korumak için otomatik olarak autossh alamadım. eğer ters tünel bir nedenden ötürü başarısız olursa, autossh farketmez ve bağlantıyı yeniden kurmazdı. Birden fazla sunucudan birden fazla tünele ihtiyacım var ve bu işleri karmaşıklaştırıyor
DeveloperChris

@DeveloperChris: Bu senaryoyu tam olarak çalıştırıyorum - ve güvenilir bir şekilde Uzak sunucu tam anlamıyla kapanmazsa ve tekrar açmanız gerekmedikçe, tünel her zaman yeniden kurulur. Belki de kendi sorunuzu yazmalı ve detay vermelisiniz. Kesinlikle bu yapılabilir. Bunu aylardır VPN sorunlarını çözmek için kullandım.
0xC0000022L

9

@ 0xC0000022L'nin önerisini ikinci olarak söyleyeceğim ve kullanacağım autossh. Dizüstü bilgisayarımdan SSH bağlantısını korumak için kullanıyorum, bir yerden bir yere götürüyorum ve sadece çalışıyor. Bu bağlantıyı kişisel SMTP ve IMAP sunucularına erişim için 25 ve 2143 numaralı bağlantı noktalarının arkasına tünellemek için kullanıyorum.

İşte kullandığım komut dosyası:

$ more /home/saml/bin/autossh_mail.sh
#!/bin/bash

autossh -M 0 -f -N -L 2025:localhost:25 -L 2143:localhost:143 sam@imap-o

Daha sonra host için dosyama bir Hostgiriş yaptım .$HOME/.ssh/configimap-o

$ more $HOME/.ssh/config
ServerAliveInterval 15
ForwardX11 yes
ForwardAgent yes
ForwardX11Trusted yes

GatewayPorts yes

Host *
ControlMaster auto
ControlPath ~/.ssh/master-%r@%h:%p
IdentityFile ~/.ssh/id_dsa

Host imap-o
    User sam
    ProxyCommand ssh sam@mygw.mydom.com nc `echo %h|sed 's/-o//'` %p

autossh_mail.shSenaryo ı giriş Masaüstümdeki bir parçası olarak çalıştırılır. Sen üzerinden erişebilirsiniz gnome-session-properties.

       ss # 1

                                          ss # 2

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.