Używam tunelu SSH z pracy do obchodzenia różnych idiotycznych zapór ogniowych (jest w porządku z moim szefem :)). Problem polega na tym, że po pewnym czasie połączenie ssh zwykle się zawiesza, a tunel jest zepsuty.
Gdybym mógł przynajmniej automatycznie monitorować tunel, mógłbym ponownie uruchomić tunel, gdy się zawiesi, ale nawet nie wymyśliłem, jak to zrobić.
Punkty bonusowe dla tego, kto może mi powiedzieć, jak zapobiec zawieszeniu mojego połączenia ssh!
watch
komendy jak:watch -n1 60 echo "wiiiii"
. Tunel nie umrze, chyba że sieć zostanie zerwana lub go nie użyjesz.Odpowiedzi:
Wygląda na to, że potrzebujesz autossh . Spowoduje to monitorowanie tunelu ssh i ponowne uruchomienie go w razie potrzeby. Używamy go od kilku lat i wydaje się, że działa dobrze.
Więcej szczegółów na temat parametru -M tutaj
źródło
autossh
w odpowiedzi?autossh -f -nNT -i ~/keypair.pem -R 2000:localhost:22 [email protected]
Możesz zauważyć, że ustawiłem to za pomocą opcji -nNT, która nie tworzy zdalnego terminala, dzięki czemu mogę umieścić autossh w tle, a także opcję -i dla SSH, aby użyć pliku .pem. Jeśli zamierzasz utrzymywać połączenie otwarte przez cały czas, zdecydowanie zalecamy przejrzenie dodatkowej konfiguracji.-M
parametr: bugs.debian.org/cgi-bin/bugreport.cgi?bug=351162Wszystkie zapory stanowe zapominają o połączeniu po tym, jak przez pewien czas nie widziały pakietu dla tego połączenia (aby zapobiec zapełnieniu się tablic stanów połączeń, w których oba końce zginęły bez zamykania połączenia). Większość implementacji TCP wyśle pakiet podtrzymujący po długim czasie bez słyszenia z drugiej strony (2 godziny to wspólna wartość). Jeśli jednak istnieje zapora stanowa, która zapomina o połączeniu przed wysłaniem pakietów utrzymywania aktywności, połączenie długo działające, ale bezczynne, zostanie przerwane.
W takim przypadku rozwiązaniem jest zapobieganie bezczynności połączenia. OpenSSH ma opcję o nazwie ServerAliveInterval, której można użyć, aby zapobiec zbyt długiemu bezczynności połączenia (jako bonus, wykrywa, kiedy peer zmarł wcześniej, nawet jeśli połączenie jest bezczynne).
źródło
Na własnym komputerze Mac lub Linux skonfiguruj ssh, aby utrzymać serwer ssh przy życiu co 3 minuty. Otwórz terminal i przejdź do swojego niewidzialnego .ssh w domu:
następnie utwórz 1-liniowy plik konfiguracyjny z:
powinieneś również dodać:
wartością domyślną jest 3, więc ServerAliveInterval 180 przestanie wysyłać po 9 minutach (3 z 3-minutowego przedziału czasu określonego przez ServerAliveInterval).
źródło
ServerAliveInterval 180
daje nam 6 minut? intuicja każe mi spróbować tego:180/60 == 3
. CzyServerAliveInterval
działa w wielokrotnościach 30 sekund?Użyłem następującego skryptu Bash, aby odradzać nowe tunele ssh po śmierci poprzedniego. Korzystanie ze skryptu jest przydatne, gdy nie chcesz lub nie możesz zainstalować dodatkowych pakietów lub użyć kompilatora.
Zauważ, że wymaga to pliku klucza do automatycznego nawiązania połączenia, ale dotyczy to również autossh.
źródło
Systemd idealnie nadaje się do tego.
Utwórz plik usługi
/etc/systemd/system/sshtunnel.service
zawierający:(Zmodyfikuj polecenie ssh, aby dopasować)
sshtunnel
więc upewnij się, że użytkownik istnieje jako pierwszysystemctl enable sshtunnel
aby ustawić, aby uruchamiał się w czasie uruchamianiasystemctl start sshtunnel
aby rozpocząć natychmiastAktualizacja stycznia 2018 r . : niektóre dystrybucje (np. Fedora 27) mogą korzystać z polityki SELinux, aby uniemożliwić korzystanie z SSH z systemd init, w takim przypadku konieczne będzie utworzenie niestandardowej polityki w celu zapewnienia niezbędnych wyjątków.
źródło
systemd
systemu. Jeśli ktoś użyjeRestart=on-failure
tego, wówczas ręczne zabicie klienta SSH nie spowoduje ponownego uruchomienia przez systemd jako klienta SSH z pomyślnym zakończeniem.ExecStart
na przykład zbudowaćssh
listę argumentów, wykonaj podstawowe kontrole itp., A następnie wywołaj go ze skryptu w ten sposóbexec /bin/ssh -N ...
. Oto moje polecenie:exec /bin/ssh -N -oExitOnForwardFailure=Yes -oTCPKeepAlive=no -oServerAliveInterval=5 -oServerAliveCountMax=6 -i "${LOCAL_PRIVATE_KEY}" -L "${TUNNEL_INLET}:${TUNNEL_OUTLET}" "${REMOTE_USER}@${REMOTE_MACHINE}"
gdzieTUNNEL_INLET="127.0.0.1:3307"
iTUNNEL_OUTLET="127.0.0.1:3306"
Z pewnością wygląda na to, że wszyscy źle interpretujecie ServerAliveCountMax. Jak rozumiem dokumentację, jest to liczba wiadomości z serwera, które mogą pozostać bez odpowiedzi bez przerywania połączenia. Tak więc w przypadkach takich jak omawiany tutaj ustawienie wysokiej wartości zapewni po prostu, że zawieszone połączenie nie zostanie wykryte i zakończone!
Po prostu ustawienie ServerAliveInterval powinno wystarczyć do rozwiązania problemu z zaporą zapominającą o połączeniu, a pozostawienie ServerAliveCountMax na niskim poziomie pozwoli początkowemu końcowi zauważyć awarię i zakończyć połączenie, jeśli połączenie i tak się nie powiedzie.
To, czego chcesz, to: 1) aby połączenie pozostało otwarte na stałe w normalnych okolicznościach, 2) aby wykryć awarię połączenia i strona inicjująca wyjść z niego po awarii, oraz 3) aby komenda ssh była wydawana za każdym razem wychodzi (sposób, w jaki to robisz, jest bardzo zależny od platformy, sugerowany przez Jawę skrypt „while true” jest jednym ze sposobów, w rzeczywistości system OS XI konfiguruje uruchomiony element).
źródło
Zawsze używaj
ServerAliveInterval
opcji SSH, jeśli problemy z tunelem są generowane przez wygasłe sesje NAT.Zawsze używaj metody odrodzenia na wypadek, gdyby łączność całkowicie się pogorszyła, masz tutaj co najmniej trzy opcje:
while true do ssh ...; sleep 5; done
) nie usuwa polecenia uśpienia,ssh
może szybko zawieść i odrodzi się zbyt wiele procesów/etc/inittab
, aby mieć dostęp do skrzynki wysłanej i zainstalowanej w innym kraju, za NAT, bez przekierowywania portów do skrzynki, możesz skonfigurować ją tak, aby utworzyła z powrotem tunel ssh:skrypt upstart na Ubuntu, gdzie
/etc/inittab
nie jest dostępny:lub zawsze używaj obu metod.
źródło
Rozwiązałem ten problem w ten sposób:
Edytować
I dodaj
Według strony man dla ssh_config:
źródło
ExitOnForwardFailure yes
jest dobrym dodatkiem do innych sugestii. Jeśli łączy się, ale nie może ustanowić przekierowania portów, jest dla ciebie tak samo bezużyteczny, jak gdyby w ogóle się nie łączył.źródło
Musiałem utrzymać długoterminowy tunel SSH. Moje rozwiązanie działało z serwera Linux i jest to tylko mały program C, który odradza ssh przy użyciu uwierzytelniania opartego na kluczach.
Nie jestem pewien co do zawieszenia, ale miałem śmierć tuneli z powodu przekroczenia limitu czasu.
Chciałbym podać kod dla respawnera, ale nie mogę go teraz znaleźć.
źródło
podczas gdy istnieją narzędzia takie jak autossh, które pomagają zrestartować sesję ssh ... to, co uważam za naprawdę przydatne, to uruchomienie polecenia „screen”. Umożliwia Wznowienie sesji SSH nawet po rozłączeniu. Szczególnie przydatne, jeśli połączenie nie jest tak niezawodne, jak powinno być.
... nie zapomnij zaznaczyć, że jest to „poprawna” odpowiedź, jeśli pomaga ci! ;-)
źródło
Trochę hack, ale lubię używać screena, żeby to zachować. Obecnie mam zdalne przekazywanie, które działa od tygodni.
Przykład, zaczynając lokalnie:
Po zastosowaniu zdalnego przekazywania i gdy na komputerze zdalnym znajduje się powłoka:
Masz teraz nieprzerwany zdalny przekaz. Sztuką jest uruchomienie ekranu na obu końcach
źródło
Ostatnio sam miałem ten problem, ponieważ te rozwiązania wymagają ponownego wprowadzenia hasła za każdym razem, jeśli używasz loginu do hasła. Użyłem sshpass w pętli wraz z monitem tekstowym, aby uniknąć posiadania hasła w pliku wsadowym.
Pomyślałem, że podzielę się tym rozwiązaniem na wypadek, gdyby ktoś miał ten sam problem:
źródło
Miałem podobne problemy z poprzednim usługodawcą internetowym. Dla mnie było tak samo z każdym połączeniem tcp, odwiedzaniem stron internetowych lub wysyłaniem poczty.
Rozwiązaniem było skonfigurowanie połączenia VPN przez UDP (korzystałem z OpenVPN). To połączenie było bardziej tolerancyjne na wszystko, co powodowało rozłączenia. Następnie możesz uruchomić dowolną usługę za pośrednictwem tego połączenia.
Nadal mogą występować problemy z połączeniem, ale ponieważ tunel będzie bardziej tolerancyjny, każda sesja ssh będzie odczuwać krótkie zawieszenie, a nie rozłączanie.
Aby to zrobić, potrzebujesz usługi VPN online, którą możesz skonfigurować na własnym serwerze.
źródło
Ponieważ
autossh
nie spełnia naszych potrzeb (istnieje błąd, jeśli nie może połączyć się z serwerem przy pierwszej próbie), napisaliśmy aplikację czysto bashową: https://github.com/aktos-io/link- z serweremDomyślnie tworzy tunel zwrotny dla portu sshd NODE (22) na serwerze. Jeśli musisz wykonać inne czynności (takie jak przekierowanie dodatkowych portów, wysyłanie wiadomości e-mail przy połączeniu itp.), Możesz umieścić swoje skrypty
on-connect
ion-disconnect
foldery.źródło