Stałe połączenie ssh w tle w celu utworzenia tunelu zwrotnego: jaki jest prawidłowy sposób?


41

Powiązane pytanie: zainicjuj połączenie ssh z serwera do klienta

Odpowiedzi stamtąd bardzo mi pomogły, to polecenie robi to, czego potrzebuję:

ssh -R 2225:localhost:22 loginOfServerWithPublicIP@publicIP

Napisałem więc skrypt, aby cały czas łączyć się ponownie:

 #!/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

I dodał to do /etc/crontab. Ale dowiedziałem się, że działa, jeśli wykonam go „ręcznie” z powłoki, ale jeśli zostanie wywołany przez crona, ssh łączy się i natychmiast kończy. (więc powyższy skrypt ciągle się łączy)

Z man ssh, odkryłem, że w przypadku połączeń w tle powinienem wywoływać to -nkluczem, ale to nie pomogło. Potem rozejrzałem się za podobnymi skryptami i odkryłem, że działa, jeśli wywołam tail -f something, tj. Jakieś polecenie „niekończącego się”, więc właśnie utworzyłem pusty plik, /tmp/dummy_filea teraz moje polecenie ssh wygląda następująco:

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

Teraz działa! Ale to rozwiązanie wydaje się trochę brzydkie, a ponadto nie rozumiem faktycznych przyczyn takiego zachowania. Przez przypadek próbowałem zadzwonić bashzamiast tail -f( bashwydaje mi się to również „niekończącym się” poleceniem), ale to nie działa.

Czy ktoś mógłby wyjaśnić to zachowanie i jaki jest prawidłowy sposób utworzenia połączenia ssh w tle, aby utrzymać tunel ssh odwrotny?


a co z użyciem &na końcu polecenia ssh:ssh -o ServerAliveInterval=240 -R 2225:localhost:22 user@host &
Networker

Ale wtedy moja whilepętla będzie się uruchamiała od nowa, rozpoczynając nowe sshpołączenie w tle co 5 sekund, prawda? Nie tego potrzebuję.
Dmitry Frank

Odpowiedzi:


37

Wygląda na to, że chcesz mieć -Nopcję ssh.

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

16

Zdecydowanie sugeruję rozważenie autossh. Ma pewną heurystykę, która pozwoli mu ustalić, czy przyczyną utraty połączenia jest podstawowa przyczyna i obniży częstotliwość prób ponownego połączenia. Ponadto monitoruje połączenie za pomocą dodatkowych tuneli, co czyni go bardzo przydatnym w scenariuszach takich jak ten, o który pytasz.

Na przykład w systemie Ubuntu możesz wyszukać w Internecie, autossh upstartaby znaleźć przydatne przykłady konfiguracji Ubuntu, aby tunel był utrzymywany w sposób trwały.

Używam tego, aby utrzymać tunelowane połączenie otwarte dla mojego serwera przez cały czas dla niektórych usług.


Rzeczywiście próbowałem autossh, przeczytałem ten artykuł: goo.gl/jVuuSR , ale zadziałało to tylko wtedy, gdy mam połączenie internetowe od razu po uruchomieniu systemu; ale jeśli połączenie zostanie nawiązane później, nie zadziała. Nie jestem pewien, może zrobiłem coś źle, ale nawet w tym artykule autor ma sleep 10w jego /etc/rc.local, aby mieć pewność, internet jest już gotowy, kiedy autossh nazywa.
Dmitry Frank

2
@DmitryFrank: to niesprawiedliwe, aby nie wspomnieć o tym w swoim pytaniu, jeśli próbowałeś. Nadal go polecam. Za pomocą upstarti innych wymian init możesz powiązać początek tunelu z jednym lub więcej podłączonymi urządzeniami sieciowymi. Najlepsze z rozwiązań (IMO) w Internecie to: erik.torgesta.com/tag/ssh-upstart ... i sleep 10w niektórych przypadkach i tak nie pomoże.
0xC0000022L

Przepraszam, że o tym nie wspomniałem, szczerze mówiąc, kiedy to nie działało, postanowiłem to zrobić „ręcznie” i całkowicie zapomniałem o autossh. Dzięki za ssh-upstart, popatrzę na to!
Dmitry Frank

późno na imprezę, ale chciałem dodać, że nie mogłem niezawodnie uzyskać autossh do utrzymania tunelu zwrotnego. jeśli z jakiegoś powodu awaria tunelu zwrotnego nie powiodła się, autossh nie zauważyłby i nie odbudowałby połączenia. Potrzebuję wielu tuneli z wielu serwerów, a to komplikuje sprawy
DeveloperChris

@DeveloperChris: Cóż, uruchamiam dokładnie ten scenariusz - i niezawodnie. O ile zdalny serwer dosłownie nie zawiedzie i trzeba będzie go ponownie włączyć, tunel zawsze zostanie przywrócony. Być może powinieneś napisać własne pytanie i podać szczegóły. Z pewnością można to zrobić. Używałem tego do obejścia problemów VPN od miesięcy.
0xC0000022L

9

Po drugie poproszę @ 0xC0000022L sugestię i skorzystam z niej autossh. Używam go do utrzymywania połączenia SSH z mojego laptopa, ponieważ zabieram go z miejsca na miejsce i to po prostu działa. Używam tego połączenia do tunelowania tylnych portów 25 i 2143 w celu uzyskania dostępu do moich osobistych serwerów SMTP i IMAP.

Oto skrypt, którego używam:

$ 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

Następnie utrzymuję Hostwpis w moim $HOME/.ssh/configpliku dla hosta imap-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.shSkrypt jest uruchamiany jako część mojego pulpitu po zalogowaniu się. Można do niego dostęp za pośrednictwem gnome-session-properties.

       ss # 1

                                          ss # 2

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.