VPN қосылғаннан кейін WSL2 DNS-ті жоғалтты ма? Екі себеп
Ескірген resolver файлы мен бәсекелес маршрут метрикасы WSL2 ішінде бірдей симптом береді. Екі жақты да жазып алыңыз, содан кейін шынымен бұзылғанын түзетіңіз.
Мекенжай бойынша ping дистрибутив ішінде жұмыс істейді, пакет орнату мен git жүктеулері жұмыс істемейді, ал ақау туннель көтерілгеннен кейін бірден пайда болды. Тек атауларды шешу тоқтады, бұл DNS-ке меңзейді, байланысқа емес. Пакеттерді қайта орнату — бұл жердегі ең танымал қате бірінші қадам. WSL2-де дәл осы симптомды тудыратын екі тәуелсіз жол бар және олар әртүрлі жөндеуді қажет етеді.
Неге дистрибутив өз resolver-ін ұстайды
Windows-тың DNS клиенті дистрибутив ішінде қолданылмайды. WSL2 іске қосылғанда өз resolver файлын құрады, ол Windows көмекші виртуалды машина үшін виртуалды коммутаторда жариялайтын stub мекенжайға сілтейді.
Бұл құрылым қарапайым желілік өзгерістерде тұрақты, өйткені ол бір рет жазылып, қайта қолданылады. Құрылым туннель клиенті көмекші виртуалды машина іске қосылғаннан кейін хосттың адаптерлер тізімін қайта жазғанда дұрыс болудан қалады.
Дистрибутив ішінде ешнәрсе өзгерісті бақыламайды, сондықтан файл енді жолда болмауы мүмкін мекенжайға сілтеуді жалғастырады. Келесі іздеу содан кейін күтеді, уақыты бітеді немесе ішкі аймақ туралы ешқашан естімеген серверден жауап алады. Ішінен resolver жай ғана жауап беруді тоқтатады, ал барлық атаулар бір уақытта сәтсіз аяқталады.
Алдымен екі жақтан дәлел жинаңыз
Кез келгенін өзгертуден бұрын дистрибутивтің не көретінін, содан кейін Windows-тың не көретінін жазып алыңыз. Дәл осы екі көрініс бірге ақау режимдерін ажыратады.
Дистрибутив ішінде resolver файлын, маршруттау кестесін және бір ішкі және бір жалпыға ортақ іздеуді шығарыңыз:
ip -4 route
cat /etc/resolv.conf
getent hosts intranet.corp.example
getent hosts example.comWindows-та әрбір адаптер бойынша DNS серверлерін және метрикаларымен IPv4 кестесін тізімдеңіз. VPN клиенті әдетте WSL2 ішкі желісі үшін маршрут орнатады, ал оның метрикасы бұл трафиктің туннельден шығатынын немесе жергілікті қалатынын шешеді.
Get-NetAdapter | Get-DnsClientServerAddress
route print -4
Маршрут метрикасы немесе ескірген файл
Бірінші ақау — ескірген файл. Resolver іске қосу кезіндегі адаптер күйіне арнап жазылған, ал туннель бұл күйді өзгертті. Оның stub мекенжайы енді қолжетімсіз болуы мүмкін немесе ішкі аймақ туралы ештеңе білмейтін серверді атайды.
Екіншісі — маршруттау мәселесі. VPN WSL2 ішкі желісін қамтитын маршрутты хосттың байланыс маршрутынан төмен метрикамен қосқанда, көмекші виртуалды машинаға адрестелген пакеттер туннельге кіреді. Сонда тек DNS емес, әрбір WSL2 қызметінің уақыты бітеді.
Ажырататын сынақ бір жолға түседі. Егер жалпыға ортақ resolver сияқты сандық мекенжай атаулар сәтсіз болған кезде әлі де ping-ке жауап берсе, жол бүтін және мәселе DNS-те. Бұл resolver өзгертуінің негізді болатын жағдайы, ал негізсіз жағдайы да анық болады. Егер сандық сынақ та сәтсіз болса, көмекші виртуалды машина маршрутын жоғалтқан және ешбір resolver файлы оны түзетпейді.
Маршруттау жағдайы үшін туннель адаптерінен автоматты метриканы алып тастап, оған WSL2 байланыс маршрутынан жоғары сан беріңіз:
Get-NetAdapter | Where-Object InterfaceDescription -Match VPN | Set-NetIPInterface -InterfaceMetric 5500
wsl.exe --shutdown
Өшіру маңызды. Метриканы өзгерту жұмыс істеп тұрған көмекші виртуалды машинаны қайта жазбайды, сондықтан өзгеріс көрінуі үшін дистрибутивті қайта құру керек.
Файлды әдейі өз қолыңызға алыңыз
Егер маршруттау дұрыс болса және тек ішкі атаулар сәтсіз болса, resolver кінәлі және генераторды тоқтата аласыз. Бұл техникалық қызмет шығыны бар әдейі өзгеріс, жеңіл қолданылатын айналма жол емес.
Дистрибутив ішінде генерацияны өшіретін желілік бөліммен /etc/wsl.conf жасаңыз, содан кейін resolver файлын өзіңіз жазыңыз, алдымен корпоративтік сервер, содан кейін жалпыға ортақ қосалқы:
[network]
generateResolvConf = falsesearch corp.example
nameserver 10.88.4.53
nameserver 9.9.9.9
Тәртіп маңызды. Жалпыға ортақ resolver ішкі атауға жауап бере алмайды, ал қосалқы тек интернет іздеулері үшін бар. Файл сіздікі болған соң, оны ешнәрсе қайта жасамайды, сондықтан көшкен корпоративтік resolver өзіңіз байқауыңыз керек үзіліске айналады.
Алдымен атауларды, содан кейін пакеттерді тексеріңіз
Жүйелік resolver арқылы бір ішкі және бір жалпыға ортақ атауды тексеріңіз, содан кейін сәтсіз болған операцияны қайталаңыз. Пакет менеджерлері кейде өз resolver-ін қолданады, сондықтан жұмыс істейтін getent бұзылған орнатумен қатар бола алады.
Қайта жазуды автоматтандырсаңыз, оны идемпотентті етіңіз: туннель болмаса, бос серверлер тізімін жазудың орнына бар файлды қалдырыңыз.
getent hosts intranet.corp.example
resolvectl status | head -20
getent hosts example.com
Дистрибутив ішінен жұмыс істейтін ішкі іздеу және жұмыс істейтін жалпыға ортақ іздеу — жазып алуға тұрарлық нәтиже. Хосттағы жасыл VPN белгішесі екеуін де дәлелдемейді.