Automatyczne ponowne łączenie tunelu TCP

9

Mam niepewne połączenie sieciowe między dwoma komputerami: czasami aktywne połączenia TCP są przerywane z przyczyn niezależnych ode mnie. Chcę ustanowić niezawodne połączenie TCP między dwoma komputerami.

Gdyby sieć była niezawodna, po prostu uruchomiłbym ssh -L 1234:localhost:1234 remotehostserwer z nasłuchiwaniem na porcie 1234 remotehosti wskazał klientowi localhost:1234. Ale jeśli połączenie ssh umrze, tak samo będzie z połączeniem przekazywanym. Jak mogę ustawić automatyczne przywracanie połączenia między klientem a serwerem?

Brak rozwiązań:

  • Nie dotyczy to aplikacji interaktywnych, więc ekran nie ma zastosowania.
  • Tu nie chodzi tylko o automatyczne ponowne podłączanie tunelu SSH la autossh . Chcę nadal używać tego samego tunelowanego połączenia TCP, a nie uruchamiać nowego.
  • Zasadniczo VPN załatwi sprawę. Ale wydaje się przesada, gdy chcę tylko jedno połączenie TCP i chciałbym rozwiązania, które działa, nawet jeśli nie mam uprawnień roota po obu stronach.

Mam słabą pamięć programu, rocksktóry to właśnie zrobił, ale wydaje się, że spadł z powierzchni sieci. Najbardziej interesuje mnie Linux po obu stronach (choć spodziewałbym się, że program na tym poziomie będzie przenośny dla innych unikatów), ale jeśli znasz program, który działa między QNX i VMS, tym lepiej.

Gilles „SO- przestań być zły”
źródło
Gilles, czy używasz keepcives tcp ze swoimi połączeniami ssh? Jeśli nie, wypróbuj najpierw ... niektóre implementacje translacji NAT szybko łączą się
Mike Pennington
@ Mike: Dzięki za wskazówkę. Nie potrzebuję natychmiastowej pomocy, ale napotkałem zarówno sytuacje, w których pojawiła się i minęła jakaś pośrednia trasa (więc zapisy TCP wyrządziły więcej szkody niż pożytku) oraz sytuacje, w których NAT przeciążał mnie i upuścił (więc zapisy TCP mogą pomóc). Keepalives TCP i tak nie miałyby znaczenia dla ciągłego strumienia (np. Scp), prawda? W każdym razie chciałbym zachować ten ogólny: następnym razem, gdy napotkam łuszczącą się sieć o dowolnym smaku, co mogę zrobić?
Gilles „SO- przestań być zły”
Gilles, rozwiązania są różne dla stałych strumieni, takich jak scp. Odpowiadałem w / ssh keepalives na podstawie twojego przykładu przekierowania portów. Re: flaky downstream hop, niewiele możesz zrobić, oprócz stworzenia sesji ssh z keepalives, które są bardziej tolerancyjne (tj. Pozwalają na więcej upuszczonych keepalives z ServerAliveInterval > 0i ServerAliveCountMax > 3). NAT wymaga niższych odstępów czasu podtrzymania. Kluczową kwestią jest określenie, na czym polega problem i odpowiednie dostosowanie. Ustaw opcje, .ssh/configaby były zawsze dostępne
Mike Pennington
@Mike: Jednym z moich przypadków użycia jest to, że klient uzyskuje swój adres IP z przeciążonego NAT, niż losowo odrzuca nawet aktywne połączenia (pomyśl więcej P2P niż powinno). Po kilku sekundach klientowi uda się ponownie połączyć, ale może uzyskać inny adres IP. W takim przypadku połączenie TCP nie przetrwa. Rocks radzi sobie, ale wolałbym coś, co kompiluje się od razu po wyjęciu z pudełka w dzisiejszych systemach.
Gilles „SO- przestań być zły”
w przypadku NAT, który daje ci nowe adresy IP, nie możesz zrobić nic więcej niż naprawić NAT lub mieć nadzieję na kolejną rocksimplementację ... chociaż jest to oczywiście prawdziwa kludge
Mike Pennington

Odpowiedzi:

5

Czy stary to nieobsługiwane Niezawodne Gniazda ( Skały ), czego szukasz?

Trzymaj się w spokojnej desperacji
źródło
1
Dziękuję, Rocks jest rzeczywiście tym, co zapamiętałem. Oczywiście wolałbym coś, co zostanie utrzymane.
Gilles „SO- przestań być zły”
@ Gilles'SO-stopbeingevil 'Nie tylko jest nieusuwalny, ale wydaje się, że całkowicie zniknął z Internetu!
Michael
1

Jedyny standardowy protokół, jaki znam z tą funkcją, to MPTCP . Jest przezroczysty dla warstwy aplikacji, więc SSH na MPTCP powinien po prostu działać. Może uruchamiać podstawowe połączenia TCP na różnych ścieżkach z różnymi adresami IP, więc w zasadzie można go użyć do migracji połączenia SSH do i z połączenia VPN, w zależności od tego, czy połączenie VPN jest aktywne.

Nie wiem wiele o dojrzałości implementacji MPTCP, ale konstrukcja protokołu wygląda dość solidnie.

Powinien chronić połączenia SSH przed zgubieniem z powodu niestabilnej łączności sieciowej. Nie ochroni cię przed mitmem, który chce zerwać połączenie SSH. Mitm może nadal wstrzykiwać uszkodzone dane, które SSH wykryje i przerwie połączenie.

Metoda przypominająca MPTCP wbudowana w protokół SSH byłaby metodą, którą mogłem sobie wyobrazić, utrzymując połączenie przez jak najdłuższy czas. Ale nie sądzę, że taka funkcja została zaprojektowana dla protokołu SSH.

kasperd
źródło
0

Możesz użyć, daemontoolsaby utrzymać port ssh do przodu; nie musi utrzymywać programów w zależności od połączenia, gdy jest ono wyłączone (jak przypuszczalnie, gdy ssh się rozłączy, port lokalny zacznie odmawiać ich połączeń), ale to początek.

Podejrzewam, że są pewne iptablessztuczki, jak na przykład spowodowanie, że ten port do pakietów DROP, jak tylko ssh przesunie się do przodu, więc łączące się programy wiedzą, że pakiety znikają, a nie są odrzucane. Właśnie się uczę daemontools(ponownie), więc nie jestem pewien, czy możesz uruchomić niestandardowy skrypt po śmierci usługi, ale podejrzewam, że możesz.

Gordon Morehouse
źródło
-2

TCP robi to automatycznie. Musisz tylko wyłączyć lub osłabić typowe praktyczne hacki do czyszczenia używane do zabijania konających połączeń TCP. Wyłącz utrzymywanie połączenia TCP dla swojego połączenia i znacznie zwiększ limit nadmiernych retransmisji. Na przykład w systemie Linux napisz dużą liczbę do /proc/sys/net/ipv4/tcp_retries2.

Jednak w nowoczesnej sieci zapora stanowa do inspekcji pakietów prawdopodobnie zapomni o połączeniu TCP, które nie wymienia regularnie pakietów, więc może padać na twoją paradę.

Aecolley
źródło
1
Prawdą jest, że TCP może obsłużyć sytuację, o ile każdy punkt końcowy ma statyczny adres IP i nie ma stanowych pól pośrednich. Pytanie wspomina reasons beyond my control, które czytam jako dynamiczne IP lub stanowe skrzynki pośrednie. W takich scenariuszach utrzymywanie aktywności TCP może trochę pomóc. Ale bez względu na to, jak skonfigurujesz utrzymywanie aktywności protokołu TCP, połączenie nie będzie wystarczające, gdy stan skrzynki pośredniej zostanie utracony z powodu ponownego uruchomienia.
kasperd
@kasperd Zgadzam się. Jednak w takich przypadkach nie ma sensu próbować utrzymywać otwartego połączenia TCP. Założyłem zatem, że pytający nie stoi przed tymi szczególnymi wyzwaniami.
aecolley
Nie ma sensu, jeśli kontrolujesz oba punkty końcowe i możesz je uaktualnić do stosu z obsługą MPTCP. Ponadto rozwiązanie warstwy aplikacji można zaimplementować na TCP bez potrzeby MPTCP.
kasperd