Git zamrzne vo WSL2 cez VPN: MTU rozhrania alebo cesta?
Git sa overí a potom visí vo WSL2? Porovnajte linuxové rozhranie s adaptérom VPN vo Windows, otestujte jednu menšiu hodnotu a naplánujte jej životnosť.
Klon sa overí, objaví sa počet objektov a potom sa niekoľko minút nič nehýbe. Windows hlási VPN ako pripojenú, názov hostiteľa sa preloží a prehliadač na tom istom počítači bez problémov načíta tú istú stránku úložiska. Táto kombinácia ukazuje na veľkosť paketov, nie na prihlasovacie údaje, a otázku veľkosti treba položiť na dvoch miestach, pretože WSL2 má vlastné linuxové rozhranie s vlastným MTU. Jedno číslo patrí windowsovej strane cesty, druhé distribúcii, a čítanie iba adaptéra VPN necháva polovicu cesty nepreskúmanú.
Tri signály oddeľujú problém veľkosti od iného
Prvý signál je tvar: nadviazanie spojenia a malá výmena uspejú, potom veľký prenos prestane postupovať. Druhý je symetria: rovnaké úložisko a rovnaký transport zlyhajú, kým iný hostiteľ na tej istej ceste funguje, alebo sa zlyhanie mení s veľkosťou užitočného zaťaženia, nie s dennou dobou. Tretí je ticho: žiadna chyba overenia, žiadne odmietnutie proxy, žiadne zlyhanie prekladu názvov, len prenos, ktorý sa nikdy neskončí.
Tieto tri spolu opodstatňujú hypotézu veľkosti paketov. Zlyhanie DNS, prepadnutý token, odmietnutý kľúč SSH a proxy, ktorá odmieta CONNECT, každé vytvára vlastnú chybu a žiadne nevyzerá ako zaseknutie po úspechu. Zachovanie rovnakého úložiska, transportu a časového okna počas testovania robí porovnanie poctivým.
Pred rozhodnutím porovnajte obe rozhrania
Zhromaždite windowsový a linuxový pohľad v tej istej relácii a držte sa adresy úložiska namiesto hádania, ktoré rozhranie ju nesie. Príkaz nižšie najprv preloží cieľ, aby vyhľadanie trasy opísalo skutočný server, s ktorým sa klon spája, a ten sa môže líšiť od názvu, ktorý ukázal prehliadač. Spustite obe polovice blízko seba, pretože VPN môže medzi pokusmi zmeniť metriky rozhrania.
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"'
Spustite linuxovú polovicu vnútri distribúcie namiesto vkladania výstupu do windowsového shellu, pretože názvy rozhraní a voľba trasy majú zmysel len tam. Vloženie z windowsového shellu hlási nesprávne čísla s veľkou istotou. Zaznamenajte zariadenie, zvolenú trasu a MTU z každej strany, skôr než čokoľvek zmeníte.
Rozhodnite, či má byť číslo menšie
Väčšie MTU rozhrania, než cesta unesie, nie je automaticky závada, pretože zisťovanie MTU cesty existuje práve preto. Režim zlyhania sa objaví, keď je zisťovanie potlačené: správy ICMP sa niekde na ceste filtrujú, odosielateľ sa limit nikdy nedozvie a veľké pakety miznú, kým malé prechádzajú. To je vlastnosť cesty, nie vlastnosť Gitu. Je to aj dôvod, prečo malý súbor môže uspieť na spojení, kde veľký nikdy neskončí.
Ak to dôkazy podporujú, dočasná zmena na linuxovom rozhraní je najlacnejší test. Zvoľte hodnotu pod použiteľnou veľkosťou cesty, zaznamenajte predchádzajúcu a všetko ostatné držte konštantné, aby porovnanie niečo znamenalo. Ak sa prenos pri menšej hodnote dokončí, máte diagnózu, nie náhodu.
ip -br link show dev eth0
sudo ip link set dev eth0 mtu 1380
ip -br link show dev eth0
Rozhodnite, kde má nastavenie žiť
Z testu vyplývajú tri možnosti a zvyčajne je vhodná len jedna z nich. Ak menšia hodnota opraví prenos a hodnota je pre túto sieť skutočne potrebná, nastavenie potrebuje vlastníka životného cyklu: spúšťací háčik v distribúcii, sieťovú konfiguráciu spravovanú platformou alebo zdokumentovaný postup. Ak hodnota nič neopraví, vráťte ju a vráťte sa k otázkam transportu, proxy a overovania.
Či spúšťací háčik existuje, závisí od používaných verzií Windows a WSL a od nakonfigurovaného sieťového režimu. Zrkadlenie siete Windows môže zmeniť, ako VPN interaguje s distribúciou, spôsobmi, ktoré sú dôležitejšie než úprava MTU, preto režim identifikujte skôr, než preň navrhnete obchádzkové riešenie. Hodnota, ktorá vyhovuje jednému operátorovi alebo jednému profilu VPN, nie je predvolená pre ďalší.
Čomu sa vyhnúť, je lákavé umiestnenie: privilegovaný sieťový príkaz v spúšťacom súbore každého interaktívneho shellu, alebo sudo bez hesla pre celý binárny súbor ip, aby skript mohol spustiť jeden riadok. Oboje mení diagnostiku na trvalé vystavenie a sťažuje neskoršie videnie pôvodného problému.
Overte po čistom štarte a potom zmeňte späť
Zmena, ktorá vydrží len do reštartu distribúcie, nie je oprava. Reštartujte distribúciu, znova pripojte VPN a zopakujte pôvodnú operáciu Gitu, nie náhradu ako ping alebo malú požiadavku HTTP. Potom potvrďte, že rozhranie v novej relácii nesie zamýšľanú hodnotu.
ip -br link show dev eth0
ip route get "$(getent ahostsv4 github.com | awk 'NR==1{print $1}')"
Zaznamenanú pôvodnú hodnotu držte vedľa zmeny, aby sa experiment dal čisto vrátiť, a poznamenajte, ktorá rodina adries bola testovaná, pretože výsledok IPv4 nič nehovorí o spojení IPv6 na tom istom hostiteľovi. Dokumentácia k sieťam WSL opisuje režimy, ktoré určujú, ako má oprava vyzerať; samotné číslo MTU je miestne meranie, nie odporúčanie.