VPN қосулы, жеке веб-интерфейс ноутбуктен IPv6 арқылы жауап береді, ал Android телефоны сол бетті әлі де IPv4 арқылы ашады немесе оны мүлдем жүктеуге қарсылық білдіреді. AAAA жазбасы бар. Туннель IPv6 мекенжайын хабарлайды. Клиентте ешнәрсе дұрыс емес көрінбейді. Нәтижені төрт бөлек шешім анықтайды: қай шешуші жауап берді, VpnService Android-ке нені жариялады, браузер қай мекенжайлар отбасын сынап көруге дайын болды және пакет барып-қайта ала ма. Әдепкі маршрут қосып, белгінің жылжуына үміттенудің орнына осы ретпен жұмыс істеңіз.

1-қадам: AAAA сұрауына қай шешуші жауап бергенін дәлелдеңіз

Android-те DNS-тің бір жолы жоқ. VPN өз желісі үшін DNS серверін итеруі мүмкін, жүйе жарамды деп санаған хост атаулары үшін Private DNS қолдануы мүмкін, ал Chrome chrome://settings/security мекенжайынан өзінің шифрланған шешушісін іске қоса алады. Туннель 10.61.0.1-ді итеретін, бірақ Private DNS жария провайдерге сілтейтін телефонда жеке аймағыңыздағы атауды сол аймаққа ие машина шешпейді. Браузер сол атауға өкілеттігі жоқ шешушіден жауап алып, оны жоқ деп қарайды, ал қате мәтінінде DNS ешқашан аталмайды.

Басқа нәрсені өзгертуден бұрын туннельдің шешушісінен тікелей сұраңыз. Алғашқы екі команда Android белсенді желіге қандай DNS серверлерін қосқанын және Private DNS автоматты немесе қатаң режимде екенін көрсетеді; үшіншісі телефоннан емес, туннель ішіндегі кез келген клиенттен іске қосылады.

adb shell dumpsys connectivity | grep -A3 "DnsAddresses"
adb shell settings get global private_dns_mode
nslookup -type=AAAA nas.lan 10.61.0.1

2-қадам: VpnService шын мәнінде нені жариялағанын оқыңыз

Android жағы болжамды емес, айқын. VpnService.Builder addAddress арқылы мекенжайларды, addRoute арқылы маршруттарды, addDnsServer арқылы DNS серверлерін қосады және allowFamily арқылы бүкіл туннельді бір мекенжайлар отбасымен шектей алады. allowFamily(AF_INET) шақырып, кейін IPv6 маршрутын қосқан құрушы жүйеге екі қарама-қайшы нәрсе айтты, ал жүйе отбасы шектеуін сақтайды. fd00:61::/64 қамтитын маршрут басқа префикстегі интерфейс мекенжайымен бірге сол себепті сәтсіз болады: мекенжай бар, бірақ ол сол маршрут үшін on-link емес.

Қолданбадағы ауыстырып-қосқышқа сенудің орнына декларацияны оқыңыз. dumpsys netd tun интерфейсіне қосылған мекенжайлар мен маршруттарды басып шығарады, ал dumpsys connectivity ішіндегі желі бойынша LinkProperties DNS тізімін желі мәлімдеген отбасылардың қасында көрсетеді.

adb shell ip -6 addr show tun0
adb shell ip -6 route show table all | grep tun0
adb shell dumpsys connectivity | grep -E "LinkAddresses|Routes"

Егер tun интерфейсінде IPv6 мекенжайы болса, бірақ қызмет префиксіне ешқандай маршрут сәйкес келмесе, браузер араласпай тұрып IPv6 жеткізу қазірдің өзінде бұзылған. Бұл сынап көруден бас тартатын браузерден өзгеше ақау және басқа түзетуді талап етеді.

3-қадам: IPv6-ны тіпті сынап көру-көппеуді браузер шешеді

Chromium алған әрбір AAAA жазбасын пайдаланбайды. Оның хост шешушісінде IPv6 қолжетімділігін тексеру және кандидаттарды сүзу бар, олар желі оны тасымалдауға қабілетсіз деп бағаланса, IPv6-ны тастай алады немесе басымдығын төмендетеді, ал шешушінің бастапқы коды сол тексеруді айналасындағы шарттармен бірге көрсетеді. Логика нұсқа мен жалаушаларға тәуелді, сондықтан бір туннельдегі екі телефон әртүрлі әрекет етуі мүмкін. Кандидаттар пайда болған соң Happy Eyeballs әр қосылым үшін отбасыларды жарыстырады, сондықтан баяу жауап беретін IPv6 жолы жылдам жауап беретін IPv4-ке ұтылуы мүмкін.

Шешімді болжамай, бақылаңыз. chrome://net-export арқылы жазылған және netlog қараушысында қайта ойнатылған сессия әрбір шешімді және таңдалған отбасын көрсетеді; chrome://net-internals/#dns кэштегі нәтижелерді көрсетеді. Өз шешушіңізде AAAA бар атау үшін тек A жазбаларын қайтаратын шешім дәл осы кезеңді нұсқайды.

4-қадам: пакеттің барып-қайта алатынын тексеріңіз

Мекенжайды таңдау — жеткізу емес. Android желі бойынша маршруттау кестелері мен саясат ережелерін ұстайды, олар кестені fwmark бойынша таңдайды, сондықтан негізгі кестеде көрінетін маршрут сокет қолданатын маршрут бола бермейді. Ережелерді оқу және ядродан бастау көзі мекенжайы үшін межелі орынды шешуді сұрау осы екеуін ажыратады.

adb shell ip -6 rule show
adb shell ip -6 route get fd00:61::20 from fd00:61::10

Сұраққа route get шығысы жауап береді. Егер ол tun0 деп көрсетсе, ал пакеттер әлі өліп жатса, телефонға қайтудың орнына туннель MTU-ына және шлюздің IPv6 қайта бағыттауына көшіңіз.

::/0 қосу неге әдетте жағдайды нашарлатады

::/0 қосу туннельдің талабын бір префикстен әрбір IPv6 межелі орынға өзгертеді. Телефонда бұл қолжетімділік тексерісін қанағаттандыруы мүмкін, өйткені префиксіңізден тыс сынақ мекенжайы енді маршрутталатын болып көрінеді. Бұл шлюзде IPv6-ның жоғары ағын сыйымдылығын жасамайды, ал көптеген үй шлюздерінде мүлдем жұмыс істейтін IPv6 жоғары арна жоқ. Нәтиже — жария IPv6 үшін қара құрдым: бұрын IPv4-ке құлайтын атаулар енді ілулі қалады, ал жеке бет тек тексеріс басқа нәрсені өлшейтіндіктен жақсырақ көрінуі мүмкін.

Саясат құны да бар. Туннельде ::/0 болса, барлық IPv6 трафигі VPN арқылы шығады, соның ішінде желі иесі тасымалдауға ешқашан келіспеген трафик. Мұны аталған иесі бар орналастыру шешімі ретінде қарастырыңыз, түнгі сағат 1-де қабылданатын жөндеу қадамы ретінде емес.

Мұны аяқтайтын жұмыс тәртібі

AAAA жауабы аймаққа ие шешушіден келетінін растаңыз, tun интерфейсі үшін VpnService және netd күйін оқыңыз, Chromium кандидатты тастады ма, соны көру үшін net-export ізін алыңыз, содан кейін ip -6 route get арқылы барып-қайтуды сынаңыз. Шынымен сәтсіз болған қабатты түзетіңіз және бөлу саясатына тиіспеңіз. Жеке атауларға жария атаулардан өзгеше жауап керек болса, split tunneling дәл соған арналған.

Телефонның build-ін, браузер нұсқасын және сіз сұраған шешушіні жазып алыңыз. Осы үш факт "IPv6 is broken" дегенді келесі адам қайталай алатын нәрсеге айналдырады.

Қатысты мақалалар