A VPN está activa, a interface web privada responde por IPv6 desde un portátil, e o teléfono Android segue abrindo a mesma páxina por IPv4 ou négase a cargala. O rexistro AAAA existe. O túnel informa dun enderezo IPv6. Nada no cliente parece estar mal. Catro decisións separadas determinan o resultado: que resolvedor respondeu, que declarou VpnService a Android, que familia de enderezos estaba disposto a probar o navegador e se un paquete pode completar a viaxe de ida e volta. Abórdaas nesa orde en lugar de engadir unha ruta por defecto e esperar que o síntoma se mova.

Paso 1: demostra que resolvedor respondeu á consulta AAAA

Android non ten unha única ruta DNS. Unha VPN pode empurrar un servidor DNS para a súa rede, o sistema pode usar Private DNS para os nomes de host que considera cualificados, e Chrome pode executar o seu propio resolvedor cifrado desde chrome://settings/security. Nun teléfono onde o túnel empurra 10.61.0.1 pero Private DNS apunta a un provedor público, o nome dentro da túa zona privada non o resolve a máquina que posúe a zona. O navegador obtén unha resposta dun resolvedor sen autoridade sobre ese nome e trátaa como ausente, e o texto do erro nunca menciona DNS.

Pregunta directamente ao resolvedor do túnel antes de cambiar calquera outra cousa. Os dous primeiros comandos mostran que servidores DNS asociou Android á rede activa e se Private DNS está en modo automático ou estrito; o terceiro execútase desde calquera cliente dentro do túnel, non desde o teléfono.

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

Paso 2: le que declarou realmente VpnService

O lado de Android é explícito e non inferido. Un VpnService.Builder engade enderezos con addAddress, rutas con addRoute, servidores DNS con addDnsServer, e pode restrinxir todo o túnel a unha soa familia de enderezos con allowFamily. Un construtor que chamou a allowFamily(AF_INET) e despois engadiu unha ruta IPv6 díxolle ao sistema dúas cousas contraditorias, e a restrición de familia é o que conserva o sistema. Unha ruta que cobre fd00:61::/64 combinada cun enderezo de interface noutro prefixo falla por unha razón similar: o enderezo existe, pero non está on-link para esa ruta.

Le a declaración en lugar de confiar no interruptor da aplicación. dumpsys netd imprime os enderezos e rutas asociados á interface tun, e o LinkProperties por rede dentro de dumpsys connectivity mostra a lista DNS xunto ás familias que a rede declara.

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"

Se a interface tun ten un enderezo IPv6 pero ningunha ruta coincide co prefixo do servizo, a entrega de IPv6 xa está rota antes de que interveña un navegador. É un fallo distinto ao dun navegador que se nega a probar, e necesita unha corrección distinta.

Paso 3: o navegador decide se probar IPv6

Chromium non utiliza todos os rexistros AAAA que recibe. O seu resolvedor de hosts leva comprobacións de alcanzabilidade de IPv6 e filtrado de candidatos que poden descartar ou baixar a prioridade de IPv6 cando se xulga que a rede non pode transportalo, e o código fonte do resolvedor mostra esa sonda xunto coas condicións que a rodean. A lóxica depende da versión e dos indicadores, e é exactamente por iso que dous teléfonos no mesmo túnel poden comportarse de forma distinta. Unha vez que existen candidatos, Happy Eyeballs fai competir as familias por cada conexión, así que unha ruta IPv6 que responde lentamente aínda pode perder fronte a IPv4 que responde rápido.

Observa a decisión en lugar de inferila. Unha sesión gravada con chrome://net-export e reproducida no visor de netlog mostra cada resolución e a familia escollida; chrome://net-internals/#dns mostra os resultados na caché. Unha resolución que devolve só rexistros A para un nome que ten AAAA no teu propio resolvedor apunta directamente a esta etapa.

Paso 4: verifica que un paquete pode completar a viaxe de ida e volta

A selección de enderezo non é entrega. Android mantén táboas de encamiñamento e regras de política por rede que escollen unha táboa por fwmark, así que unha ruta visible na táboa principal non é automaticamente a ruta que usa un socket. Ler as regras e pedirlle ao núcleo que resolva un destino para un enderezo de orixe separa as dúas cousas.

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

A saída de route get é a que responde á pregunta. Se nomea tun0 e os paquetes seguen morrendo, pasa á MTU do túnel e ao reenvío IPv6 da pasarela en lugar de volver ao teléfono.

Por que engadir ::/0 adoita empeoralo

Engadir ::/0 cambia a pretensión do túnel dun prefixo a todos os destinos IPv6. No teléfono iso pode satisfacer unha sonda de alcanzabilidade, porque un enderezo de proba fóra do teu prefixo agora parece encamiñable. Non crea capacidade IPv6 ascendente na pasarela, e moitas pasarelas domésticas non teñen ningunha ligazón ascendente IPv6 que funcione. O resultado é un burato negro para IPv6 público: nomes que antes caían a IPv4 agora penduran, e a páxina privada pode parecer mellor só porque a sonda mide outra cousa.

Tamén hai un custo de política. Con ::/0 no túnel, todo o tráfico IPv6 sae pola VPN, incluído o tráfico que o propietario da rede nunca aceptou transportar. Trátao como unha decisión de despregamento cun propietario nomeado, non como un paso de depuración que tomas á 1 da madrugada.

A orde de traballo que remata con isto

Confirma que a resposta AAAA vén do resolvedor que posúe a zona, le o estado de VpnService e netd para a interface tun, captura un rastro net-export para ver se Chromium descartou o candidato, e despois proba a viaxe de ida e volta con ip -6 route get. Corrixe a capa que realmente fallou e deixa a política de división tranquila. Se os nomes privados precisan respostas distintas das públicas, para iso existe o split tunneling.

Anota a compilación do teléfono, a versión do navegador e o resolvedor que consultaches. Eses tres feitos converten "IPv6 is broken" en algo que a seguinte persoa pode reproducir.

Artigos relacionados