Git у WSL2 спыняецца на VPN: MTU інтэрфейса ці шлях?
Git праходзіць аўтэнтыфікацыю і затым завісае ў WSL2? Параўнайце інтэрфейс Linux з адаптарам VPN у Windows, праверце адзін меншы лік і сплануйце яго тэрмін службы.
Клон праходзіць аўтэнтыфікацыю, з'яўляецца колькасць аб'ектаў, і потым некалькі хвілін нічога не рухаецца. Windows паказвае VPN як падключаны, імя хоста вырашаецца, а браўзер на той жа машыне без цяжкасцей адкрывае тую ж старонку рэпазіторыя. Такое спалучэнне паказвае на памер пакета, а не на ўліковыя даныя, і пытанне памеру трэба задаваць у двух месцах, бо ў WSL2 ёсць уласны інтэрфейс Linux з уласным MTU. Адзін лік належыць Windows-баку шляху, другі — дыстрыбутыву, і чытанне толькі адаптара VPN пакідае палову шляху недаследаванай.
Тры сігналы аддзяляюць праблему памеру ад іншага
Першы сігнал — форма: усталяванне злучэння і невялікі абмен удаюцца, затым масавая перадача спыняе прагрэс. Другі — сіметрыя: той жа рэпазіторый і той жа транспарт не ўдаюцца, тады як іншы хост на тым жа шляху працуе, або збой змяняецца з памерам карыснай нагрузкі, а не з часам сутак. Трэці — цішыня: ніякай памылкі аўтэнтыфікацыі, ніякай адмовы проксі, ніякага збою вырашэння імёнаў, толькі перадача, якая ніколі не завяршаецца.
Гэтыя тры разам апраўдваюць гіпотэзу памеру пакета. Збой DNS, састарэлы токен, адхілены ключ SSH і проксі, які адмаўляе CONNECT, кожны дае сваю памылку, і ні адзін з іх не выглядае як прыпынак пасля поспеху. Захаванне таго ж рэпазіторыя, транспарту і часу пры тэставанні — гэта тое, што робіць параўнанне сумленным.
Параўнайце абодва інтэрфейсы, перш чым вырашаць
Збярыце від Windows і від Linux у адной сесіі і трымайце адрас рэпазіторыя, а не здагадку пра тое, які інтэрфейс яго нясе. Каманда ніжэй спачатку вырашае прызначэнне, каб пошук маршруту апісваў сапраўдны сервер, да якога звяртаецца клон, а ён можа адрознівацца ад імя, паказанага браўзерам. Запускайце абедзве паловы побач, бо VPN можа змяніць метрыкі інтэрфейса паміж спробамі.
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"'
Запускайце палову Linux унутры дыстрыбутыва, а не ўстаўляйце вывад у абалонку Windows, бо імёны інтэрфейсаў і выбар маршруту маюць сэнс толькі там. Устаўка з абалонкі Windows паведамляе няправільныя лікі з вялікай упэўненасцю. Запішыце прыладу, абраны маршрут і MTU з кожнага боку, перш чым нешта змяняць.
Вырашыце, ці павінен лік быць меншы
Большы MTU інтэрфейса, чым шлях можа несці, не з'яўляецца аўтаматычна дэфектам, бо выяўленне MTU шляху існуе менавіта для гэтага. Рэжым збою з'яўляецца, калі выяўленне падаўлена: паведамленні ICMP фільтруюцца недзе на шляху, адпраўнік ніколі не даведваецца пра мяжу, і вялікія пакеты знікаюць, а малыя праходзяць. Гэта ўласцівасць шляху, а не ўласцівасць Git. Гэта таксама прычына, чаму маленькі файл можа прайсці на злучэнні, дзе вялікі ніколі не завяршаецца.
Калі доказы гэта падтрымліваюць, часовае змяненне на інтэрфейсе Linux — самы танны тэст. Выберыце значэнне ніжэй за прыдатны памер шляху, запішыце папярэдняе і трымайце ўсё астатняе нязменным, каб параўнанне мела сэнс. Калі перадача завяршаецца пры меншым значэнні, у вас дыягназ, а не выпадковасць.
ip -br link show dev eth0
sudo ip link set dev eth0 mtu 1380
ip -br link show dev eth0
Вырашыце, дзе павінна жыць налада
З тэсту вынікаюць тры варыянты, і звычайна мэтазгодны толькі адзін з іх. Калі меншае значэнне выпраўляе перадачу і значэнне сапраўды патрэбна для гэтай сеткі, наладзе патрэбен уладальнік жыццёвага цыклу: хук запуску ў дыстрыбутыве, канфігурацыя сеткі, якой кіруе платформа, або дакументаваная працэдура. Калі значэнне нічога не выпраўляе, вярніце яго і вярніцеся да пытанняў транспарту, проксі і аўтэнтыфікацыі.
Наяўнасць хука запуску залежыць ад версій Windows і WSL, якія выкарыстоўваюцца, і ад наладжанага рэжыму сеткі. Люстраванне сеткі Windows можа змяніць тое, як VPN узаемадзейнічае з дыстрыбутывам, такім чынам, што важней за карэкцыю MTU, таму вызначце рэжым, перш чым праектаваць абыходны шлях для яго. Значэнне, якое падыходзіць аднаму аператару або аднаму профілю VPN, не з'яўляецца прадвызначэннем для наступнага.
Чаго трэба пазбягаць — гэта спакуслівага размяшчэння: прывілеяваная сеткавая каманда ў файле запуску кожнай інтэрактыўнай абалонкі або sudo без пароля для ўсяго бінарніка ip, каб скрыпт мог выканаць адзін радок. Абодва ператвараюць дыягностыку ў пастаянную ўразлівасць і робяць зыходную праблему цяжэйшай для бачання пазней.
Праверце пасля чыстага запуску, затым адкаціце
Змяненне, якое трымаецца толькі да перазапуску дыстрыбутыва, не з'яўляецца выпраўленнем. Перазапусціце дыстрыбутыў, падключыце VPN зноў і паўтарыце першапачатковую аперацыю Git, а не замену накшталт ping або невялікага запыту HTTP. Затым пацвердзіце, што інтэрфейс нясе патрэбнае значэнне ў новай сесіі.
ip -br link show dev eth0
ip route get "$(getent ahostsv4 github.com | awk 'NR==1{print $1}')"
Трымайце запісанае зыходнае значэнне побач са змяненнем, каб эксперымент можна было чыста адмяніць, і адзначце, якое сямейства адрасоў тэставалася, бо вынік IPv4 нічога не кажа пра злучэнне IPv6 на тым жа хосце. Дакументацыя па сетках WSL апісвае рэжымы, якія вызначаюць, як павінна выглядаць выпраўленне; сам лік MTU — гэта лакальнае вымярэнне, а не рэкамендацыя.