Git zawiesza się bez VPN? OpenSSH oznacza pakiety przez IPQoS
OpenSSH domyślnie oznacza swoje pakiety wartością QoS. Tam, gdzie ścieżka odrzuca to oznaczenie, push zawiesza się, dopóki tunel nie zmieni trasy, którą podążają pakiety.
Klon z biura działa, ten sam klon przez hotspot telefonu działa, a ten sam klon z sieci hotelowej wisi, dopóki nie włączy się VPN. Uścisk ręki SSH kończy się, a sesja milknie przy pierwszym rzeczywistym transferze. Jedna linia dodana do konfiguracji klienta leczy git i ssh razem. Gdy jedno ustawienie klienta naprawia kilka narzędzi naraz, błąd leży w tym, co klient wysyła, a nie w łączu, przez które wysyła.
Czytaj objaw jako różnicę w trasowaniu
Tunel, który leczy problem, rzadko jest naprawą. Zmienia trasę, operatora i urządzenia pośredniczące, podczas gdy laptop nadal wytwarza dokładnie te same pakiety. Jeśli jedna trasa źle traktuje nagłówek, a inna przepuszcza go nietknięty, różnica leży w polityce urządzenia pośredniczącego, nie w kliencie. Tunel jest tu świadkiem, nie rozwiązaniem.
Miejsce, w którym sesja umiera, zawęża to jeszcze bardziej. Nic, co zawodzi przy wyszukiwaniu nazw lub przy wymianie kluczy, tak nie wygląda. Sesja, która się uwierzytelnia, wypisuje baner, a potem zastyga przy pierwszym dużym zapisie, już dowiodła, że trasowanie, nazwy i poświadczenia działają.
Klient stempluje bajt QoS na każdym gnieździe SSH
Każde połączenie OpenSSH od wersji 7.8 wzwyż niesie w nagłówku IP wartość, której routery mogą użyć do priorytetyzacji ruchu. Sesje terminala dostają jedną wartość, a masowe kopie inną, zgodnie z teorią, że człowiek piszący zasługuje na lepsze traktowanie niż transfer pliku. Większość sieci całkowicie ignoruje tę podpowiedź, dlatego przez lata pozostaje niezauważona. Mniejszość sterowników Wi-Fi, operatorów komórkowych i koncentratorów VPN działa na jej podstawie, a niektóre z nich działają źle.
Gdy ta wartość zostanie przepisana lub odrzucona w środku strumienia, połączenie nie zawodzi, tylko przestaje posuwać się naprzód. Retransmisje rosną, okno się załamuje, a aplikacja nic nie zgłasza, bo nic nie zwróciło błędu. Ta cisza jest powodem, dla którego ludzie opisują objaw jako zawieszenie, a nie jako awarię.
Najpierw potwierdź wersję klienta poleceniem ssh -V. Każda wersja od 7.8 wzwyż ma to zachowanie domyślnie.
Trzy polecenia, które oddzielają to od MTU i DNS
Dwie podobne przyczyny warto wykluczyć, zanim edytujesz jakikolwiek plik konfiguracyjny. Awaria MTU przepuszcza małe wymiany i zastyga przy pierwszym dużym pakiecie, podczas gdy awaria nazw nigdy nie tworzy sesji.
ssh -o IPQoS=none -v [email protected]
ssh -G [email protected] | grep -i ipqos
sudo tcpdump -ni any -vv "tcp port 22"
Pierwsze polecenie powtarza nieudaną operację z wyłączonym oznaczeniem, a jego udane wykonanie to najsilniejszy pojedynczy dowód, jaki jest. Drugie wypisuje konfigurację, którą klient naprawdę zastosuje do tego celu, co wychwytuje nieaktualny wpis w pliku, o którym zapomniałeś. Trzecie pokazuje bajt TOS w obu kierunkach, gdy transfer stoi, a ciekawy wzorzec to wartość na zepsutej trasie i brak jej na działającej.
Nagranie zrób na laptopie, a nie na serwerze, bo nadawca ustawia wartość i każdy kierunek może ją zmienić. Porównaj trasę działającą i zawodną tym samym nagraniem, a różnica pojawi się bez zgadywania.
Umieść wyjątek w jednym pliku, jednym hoście naraz
Wyjątek należy umieścić obok hosta, którego dotyczy, z komentarzem mówiącym, dlaczego istnieje.
Host gitlab.example.internal
IPQoS none
# direct route rewrites the marking; the tunnel route passes it
Zakres liczy się bardziej niż sama wartość. Wpis z symbolem wieloznacznym wyłącza zachowanie wszędzie, wyrzuca podpowiedź, która pomaga w dobrze zachowujących się sieciach, i nie zostawia nikogo, kto mógłby powiedzieć, kiedy się pojawił. Wpis dla jednego hosta jest czytelny, odwracalny i po naprawie sieci trywialnie łatwy do usunięcia. Użyj pliku użytkownika do osobistego obejścia, a pliku zarządzanego, gdy cała flota potrzebuje tego samego wyjątku.
Wyraźnie powiedz, czego wyjątek nie obejmuje. Dotyczy SSH, więc zdalne repozytorium HTTPS, lustro pakietów i przeglądarka stoją poza nim, a awaria któregokolwiek z nich wymaga własnego dowodu. W łańcuchu przez bastion każde przeskoczenie korzysta z konfiguracji klienta, a przeskoczenie, które się zawiesza, to to, które warto ograniczyć.
Zamknij pętlę z właścicielem sieci
Przekaż znalezisko jako cztery fakty: wersja klienta, przetestowana trasa, używany klient VPN i który kierunek niósł oznaczenie. Te cztery wystarczą właścicielowi sieci, by odtworzyć traktowanie i zdecydować, czy jest zamierzone.
Jeśli wyjątek nie leczy zawieszenia, usuń go. Obejście, które przetrwa nieudany eksperyment, staje się folklorem, a następna osoba spędza godzinę, dowodząc, że nic nie robi. Jeśli leczy zawieszenie, ścieżka nadal jest zła dla każdego innego narzędzia, które ją przecina, a naprawa należy do tego, kto obsługuje urządzenie pośredniczące.
Zmiana u klienta to obejście z datą ważności. Zapisz tę datę w komentarzu.