Git zawiesza się w WSL2 za VPN: MTU interfejsu czy ścieżka?
Git uwierzytelnia się, a potem wisi w WSL2? Porównaj interfejs Linux z adapterem VPN Windows, przetestuj jedną mniejszą wartość i zaplanuj jej życie.
Klon uwierzytelnia się, pojawia się liczba obiektów, a potem przez kilka minut nic się nie dzieje. Windows zgłasza, że VPN jest połączony, nazwa hosta się rozwiązuje, a przeglądarka na tej samej maszynie pobiera tę samą stronę repozytorium bez trudności. Ta kombinacja wskazuje na rozmiar pakietu, a nie na dane logowania, a pytanie o rozmiar trzeba zadać w dwóch miejscach, ponieważ WSL2 ma własny interfejs Linux z własnym MTU. Jedna liczba należy do strony Windows ścieżki, druga do dystrybucji, a czytanie tylko adaptera VPN pozostawia połowę ścieżki niezbadaną.
Trzy sygnały oddzielają problem rozmiaru od innych
Pierwszy sygnał to kształt: nawiązanie połączenia i mała wymiana kończą się sukcesem, potem masowy transfer przestaje postępować. Drugi to symetria: to samo repozytorium i ten sam transport zawodzą, podczas gdy inny host na tej samej ścieżce działa, albo awaria zmienia się z rozmiarem ładunku, a nie z porą dnia. Trzeci to cisza: żadnego błędu uwierzytelniania, żadnej odmowy proxy, żadnej awarii rozwiązywania nazw, tylko transfer, który nigdy się nie kończy.
Te trzy razem uzasadniają hipotezę rozmiaru pakietu. Awaria DNS, wygasły token, odrzucony klucz SSH i proxy odmawiające CONNECT każde dają własny błąd, a żaden nie wygląda jak zatrzymanie po sukcesie. Zachowanie tego samego repozytorium, transportu i okna czasowego podczas testu czyni porównanie uczciwym.
Porównaj oba interfejsy, zanim zdecydujesz
Zbierz widok Windows i widok Linux w tej samej sesji i trzymaj się adresu repozytorium zamiast zgadywać, który interfejs go niesie. Poniższe polecenie najpierw rozwiązuje cel, aby wyszukiwanie trasy opisywało rzeczywisty serwer, z którym łączy się klon, a może się on różnić od nazwy pokazanej przez przeglądarkę. Uruchom obie połowy blisko siebie, ponieważ VPN może zmieniać metryki interfejsu między próbami.
netsh interface ipv4 show subinterfaces
wsl -d Ubuntu -- bash -lc 'dest=$(getent ahostsv4 github.com | awk \'NR==1{print $1}\'); ip -br link show; ip route get "$dest"'
Uruchom połowę Linux wewnątrz dystrybucji, zamiast wklejać wynik do powłoki Windows, ponieważ nazwy interfejsów i wybór trasy mają sens tylko tam. Wklejenie z powłoki Windows podaje złe liczby z wielką pewnością. Zapisz urządzenie, wybraną trasę i MTU z każdej strony, zanim cokolwiek zmienisz.
Zdecyduj, czy liczba powinna być mniejsza
Większe MTU interfejsu niż ścieżka może unieść nie jest automatycznie usterką, ponieważ wykrywanie MTU ścieżki istnieje właśnie po to. Tryb awarii pojawia się, gdy wykrywanie jest tłumione: komunikaty ICMP są filtrowane gdzieś po drodze, nadawca nigdy nie poznaje limitu, a duże pakiety znikają, podczas gdy małe przechodzą. To właściwość ścieżki, a nie właściwość Gita. To także powód, dla którego mały plik może się udać na połączeniu, na którym duży nigdy się nie kończy.
Jeśli dowody to potwierdzają, tymczasowa zmiana na interfejsie Linux jest najtańszym testem. Wybierz wartość poniżej użytecznego rozmiaru ścieżki, zapisz poprzednią i utrzymuj wszystko inne bez zmian, aby porównanie coś znaczyło. Jeśli transfer kończy się przy mniejszej wartości, masz diagnozę, a nie zbieg okoliczności.
ip -br link show dev eth0
sudo ip link set dev eth0 mtu 1380
ip -br link show dev eth0
Zdecyduj, gdzie ma mieszkać ustawienie
Z testu wynikają trzy opcje, a zwykle tylko jedna jest odpowiednia. Jeśli mniejsza wartość naprawia transfer i wartość jest naprawdę potrzebna w tej sieci, ustawienie potrzebuje właściciela cyklu życia: haka startowego w dystrybucji, konfiguracji sieci zarządzanej przez platformę albo udokumentowanej procedury. Jeśli wartość niczego nie naprawia, cofnij ją i wróć do pytań o transport, proxy i uwierzytelnianie.
Czy hak startowy istnieje, zależy od używanych wersji Windows i WSL oraz od skonfigurowanego trybu sieci. Lustrzenie sieci Windows może zmienić sposób, w jaki VPN współdziała z dystrybucją, w sposób ważniejszy niż dostosowanie MTU, więc rozpoznaj tryb, zanim zaprojektujesz dla niego obejście. Wartość pasująca do jednego operatora lub jednego profilu VPN nie jest domyślną dla następnego.
Czego unikać, to kuszące umiejscowienie: uprzywilejowane polecenie sieciowe w pliku startowym każdej interaktywnej powłoki albo sudo bez hasła dla całego binarium ip, aby skrypt mógł wykonać jedną linię. Oba zamieniają diagnozę w trwałe narażenie i utrudniają późniejsze dostrzeżenie pierwotnego problemu.
Zweryfikuj po czystym starcie, a potem cofnij
Zmiana, która przetrwa tylko do restartu dystrybucji, nie jest naprawą. Zrestartuj dystrybucję, ponownie połącz VPN i powtórz pierwotną operację Git, a nie zamiennik taki jak ping czy małe żądanie HTTP. Potem potwierdź, że interfejs w nowej sesji niesie zamierzoną wartość.
ip -br link show dev eth0
ip route get "$(getent ahostsv4 github.com | awk 'NR==1{print $1}')"
Trzymaj zapisaną wartość pierwotną obok zmiany, aby eksperyment można było czysto cofnąć, i zanotuj, która rodzina adresów była testowana, ponieważ wynik IPv4 nic nie mówi o połączeniu IPv6 na tym samym hoście. Dokumentacja sieci WSL opisuje tryby, które decydują, jak powinna wyglądać naprawa; sama liczba MTU jest lokalnym pomiarem, nie zaleceniem.