Git se ustavi v WSL2 prek VPN: MTU vmesnika ali pot?
Git se overi in nato obvisi v WSL2? Primerjajte Linuxov vmesnik z adaptaterjem VPN v Windows, preizkusite eno manjšo vrednost in načrtujte njeno življenjsko dobo.
Klon se overi, pojavi se število objektov, nato pa se nekaj minut nič ne premakne. Windows poroča, da je VPN povezan, ime gostitelja se razreši, brskalnik na istem računalniku pa brez težav pridobi isto stran shrambe. Ta kombinacija kaže na velikost paketa in ne na poverilnice, vprašanje velikosti pa je treba zastaviti na dveh mestih, ker ima WSL2 svoj Linuxov vmesnik z lastnim MTU. Eno število pripada strani Windows poti, drugo distribuciji, branje samo adaptaterja VPN pa pusti polovico poti nepreverjeno.
Trije signali ločijo težavo z velikostjo od drugega
Prvi signal je oblika: vzpostavitev povezave in majhna izmenjava uspeta, nato velik prenos preneha napredovati. Drugi je simetrija: ista shramba in isti transport odpovedujeta, medtem ko drug gostitelj na isti poti deluje, ali pa se napaka spreminja z velikostjo koristnega tovora in ne z uro dneva. Tretji je tišina: nobene napake preverjanja, nobene zavrnitve proxyja, nobene napake razreševanja imen, samo prenos, ki se nikoli ne konča.
Ti trije skupaj upravičijo hipotezo o velikosti paketa. Napaka DNS, potekel žeton, zavrnjen ključ SSH in proxy, ki zavrača CONNECT, vsak ustvari svojo napako, in nobena ni videti kot ustavitev po uspehu. Ohranjanje iste shrambe, transporta in časovnega okna med preizkušanjem naredi primerjavo pošteno.
Pred odločitvijo primerjajte oba vmesnika
Zberite pogled Windows in pogled Linux v isti seji ter se držite naslova shrambe namesto ugibanja, kateri vmesnik ga nosi. Spodnji ukaz najprej razreši cilj, da iskanje poti opiše dejanski strežnik, s katerim se povezuje klon, ki se lahko razlikuje od imena, ki ga je pokazal brskalnik. Zaženite obe polovici tesno skupaj, ker lahko VPN med poskusi spremeni meritve vmesnika.
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"'
Linuxovo polovico zaženite znotraj distribucije, namesto da izhod prilepite v lupino Windows, ker imata imena vmesnikov in izbira poti smisel samo tam. Prilepljen izhod iz lupine Windows poroča napačne številke z veliko gotovostjo. Zapišite napravo, izbrano pot in MTU z vsake strani, preden kar koli spremenite.
Odločite se, ali naj bo število manjše
Večji MTU vmesnika, kot ga pot zmore, ni samodejno napaka, ker odkrivanje MTU poti obstaja prav za to. Način napake se pojavi, ko je odkrivanje zatrto: sporočila ICMP se nekje na poti filtrirajo, pošiljatelj nikoli ne izve omejitve in veliki paketi izginejo, medtem ko majhni gredo skozi. To je lastnost poti, ne lastnost Gita. To je tudi razlog, da lahko majhna datoteka uspe na povezavi, kjer se velika nikoli ne konča.
Če dokazi to podpirajo, je začasna sprememba na Linuxovem vmesniku najcenejši preizkus. Izberite vrednost pod uporabno velikostjo poti, zapišite prejšnjo in vse ostalo držite nespremenjeno, da bo primerjava kaj pomenila. Če se prenos pri manjši vrednosti konča, imate diagnozo in ne naključje.
ip -br link show dev eth0
sudo ip link set dev eth0 mtu 1380
ip -br link show dev eth0
Odločite se, kje naj živi nastavitev
Iz preizkusa izhajajo tri možnosti, in običajno je primerna samo ena od njih. Če manjša vrednost popravi prenos in je vrednost za to omrežje resnično potrebna, nastavitev potrebuje lastnika življenjskega cikla: zagonsko kljuko v distribuciji, omrežno konfiguracijo, ki jo upravlja platforma, ali dokumentiran postopek. Če vrednost ne popravi ničesar, jo vrnite in se vrnite k vprašanjem transporta, proxyja in preverjanja.
Ali zagonska kljuka obstaja, je odvisno od uporabljenih različic Windows in WSL ter od nastavljenega omrežnega načina. Zrcaljenje omrežja Windows lahko spremeni, kako VPN deluje z distribucijo, na načine, ki so pomembnejši od prilagoditve MTU, zato način prepoznajte, preden zanj oblikujete obhodno rešitev. Vrednost, ki ustreza enemu operaterju ali enemu profilu VPN, ni privzeta za naslednjega.
Čemu se izogniti, je vabljiva postavitev: privilegiran omrežni ukaz v zagonski datoteki vsake interaktivne lupine ali sudo brez gesla za celotno binarno datoteko ip, da lahko skript zažene eno vrstico. Oboje spremeni diagnozo v trajno izpostavljenost in kasneje oteži videnje prvotne težave.
Preverite po čistem zagonu, nato povrnite
Sprememba, ki zdrži samo do ponovnega zagona distribucije, ni popravek. Ponovno zaženite distribucijo, znova povežite VPN in ponovite prvotno operacijo Git, ne nadomestila, kot je ping ali majhna zahteva HTTP. Nato potrdite, da vmesnik v novi seji nosi predvideno vrednost.
ip -br link show dev eth0
ip route get "$(getent ahostsv4 github.com | awk 'NR==1{print $1}')"
Zapisano prvotno vrednost hranite ob spremembi, da bo poskus mogoče čisto razveljaviti, in zabeležite, katera družina naslovov je bila preizkušena, ker rezultat IPv4 ne pove ničesar o povezavi IPv6 na istem gostitelju. Dokumentacija za omrežja WSL opisuje načine, ki določajo, kako naj bo popravek videti; sama številka MTU je lokalna meritev, ne priporočilo.