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.

Прашајте го резолверот на тунелот директно пред да промените било што друго. Првите две наредби покажуваат кои DNS сервери Android ги поврзал со активната мрежа и дали 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, DNS сервери со addDnsServer, и може да го ограничи целиот тунел на една фамилија адреси со allowFamily. Градителот што повика allowFamily(AF_INET) и потоа додаде IPv6 рута му кажа на системот две противречни работи, а системот го задржува ограничувањето на фамилијата. Рута што покрива fd00:61::/64 заедно со адреса на интерфејс во друг префикс не успева од слична причина: адресата постои, но не е on-link за таа рута.

Читајте ја декларацијата наместо да му верувате на прекинувачот во апликацијата. dumpsys netd ги печати адресите и рутите поврзани со интерфејсот tun, а LinkProperties по мрежа во dumpsys connectivity ја покажува 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 ги покажува кешираните резултати. Решавање што враќа само A записи за име што има AAAA кај вашиот сопствен резолвер директно укажува на оваа фаза.

Чекор 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 доаѓа од резолверот што ја држи зоната, прочитајте ја состојбата на VpnService и netd за интерфејсот tun, снимете трага net-export за да видите дали Chromium го отфрли кандидатот, потоа тестирајте го патот таму и назад со ip -6 route get. Поправете го слојот што навистина потфрли и оставете ја политиката за разделување на мир. Ако приватните имиња бараат различни одговори од јавните, за тоа и служи split tunneling.

Забележете го build-от на телефонот, верзијата на прелистувачот и резолверот што го прашавте. Тие три факти го претвораат "IPv6 is broken" во нешто што следната личност може да го репродуцира.

Поврзани статии