VPN on päällä, yksityinen verkkokäyttöliittymä vastaa IPv6:n yli kannettavalta, ja Android-puhelin avaa saman sivun edelleen IPv4:n yli tai kieltäytyy lataamasta sitä kokonaan. AAAA-tietue on olemassa. Tunneli ilmoittaa IPv6-osoitteen. Asiakkaassa ei näytä olevan mitään vialla. Tuloksen ratkaisee neljä erillistä päätöstä: mikä resolveri vastasi, mitä VpnService ilmoitti Androidille, mitä osoiteperhettä selain oli valmis kokeilemaan ja voiko paketti tehdä edestakaisen matkan. Käy ne läpi tässä järjestyksessä sen sijaan, että lisäisit oletusreitin ja toivoisit oireen siirtyvän.

Vaihe 1: todista, mikä resolveri vastasi AAAA-kyselyyn

Androidilla ei ole yhtä ainoaa DNS-polkua. VPN voi työntää DNS-palvelimen verkkoonsa, järjestelmä voi käyttää Private DNS:ää isäntänimille, jotka se katsoo kelvollisiksi, ja Chrome voi ajaa omaa salattua resolveriaan osoitteesta chrome://settings/security. Puhelimessa, jossa tunneli työntää 10.61.0.1:n mutta Private DNS osoittaa julkiseen tarjoajaan, yksityisen vyöhykkeesi nimeä ei ratkaise kone, joka omistaa vyöhykkeen. Selain saa vastauksen resolverilta, jolla ei ole toimivaltaa tuohon nimeen, ja pitää sitä puuttuvana, eikä virheteksti mainitse DNS:ää koskaan.

Kysy tunnelin resolverilta suoraan ennen kuin muutat mitään muuta. Kaksi ensimmäistä komentoa näyttävät, mitkä DNS-palvelimet Android liitti aktiiviseen verkkoon ja onko Private DNS automaattisessa vai tiukassa tilassa; kolmas ajetaan mistä tahansa tunnelin sisäisestä asiakkaasta, ei puhelimesta.

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

Vaihe 2: lue, mitä VpnService todella ilmoitti

Androidin puoli on eksplisiittinen, ei päätelty. VpnService.Builder lisää osoitteita addAddress:lla, reittejä addRoute:llä, DNS-palvelimia addDnsServer:llä ja voi rajoittaa koko tunnelin yhteen osoiteperheeseen allowFamily:lla. Rakentaja, joka kutsui allowFamily(AF_INET):ää ja lisäsi myöhemmin IPv6-reitin, on kertonut järjestelmälle kaksi ristiriitaista asiaa, ja perherajoitus on se, minkä järjestelmä pitää. Reitti, joka kattaa fd00:61::/64:n yhdessä toisen prefiksin liitäntäosoitteen kanssa, epäonnistuu samasta syystä: osoite on olemassa, mutta se ei ole on-link kyseiselle reitille.

Lue ilmoitus sen sijaan, että luottaisit sovelluksen kytkimeen. dumpsys netd tulostaa tun-liitäntään liitetyt osoitteet ja reitit, ja verkkokohtainen LinkProperties komennon dumpsys connectivity sisällä näyttää DNS-luettelon niiden perheiden vieressä, joita verkko väittää.

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"

Jos tun-liitännällä on IPv6-osoite mutta mikään reitti ei vastaa palvelun prefiksiä, IPv6-toimitus on jo rikki ennen kuin selain on mukana. Se on eri vika kuin selain, joka kieltäytyy yrittämästä, ja se vaatii eri korjauksen.

Vaihe 3: selain päättää, yrittääkö se IPv6:tta lainkaan

Chromium ei käytä jokaista saamaansa AAAA-tietuetta. Sen isäntäresolverissa on IPv6:n tavoitettavuustarkistuksia ja ehdokassuodatusta, jotka voivat pudottaa IPv6:n tai laskea sen prioriteettia, kun verkko arvioidaan kykenemättömäksi kantamaan sitä, ja resolverin lähdekoodi näyttää tuon tarkistuksen ympäröivine ehtoineen. Logiikka riippuu versiosta ja lipuista, ja juuri siksi kaksi puhelinta samassa tunnelissa voi käyttäytyä eri tavoin. Kun ehdokkaita on, Happy Eyeballs kilpailuttaa perheet yhteyksittäin, joten hitaasti vastaava IPv6-polku voi silti hävitä nopeasti vastaavalle IPv4:lle.

Tarkkaile päätöstä sen sijaan, että päättelet sen. chrome://net-export:n kautta tallennettu ja netlog-katselimessa toistettu istunto näyttää jokaisen ratkaisun ja valitun perheen; chrome://net-internals/#dns näyttää välimuistiin tallennetut tulokset. Ratkaisu, joka palauttaa vain A-tietueita nimelle, jolla on AAAA omassa resolverissasi, osoittaa suoraan tähän vaiheeseen.

Vaihe 4: varmista, että paketti voi tehdä edestakaisen matkan

Osoitteen valinta ei ole toimitusta. Android pitää verkkokohtaisia reititystaulukoita ja käytäntösääntöjä, jotka valitsevat taulun fwmarkin perusteella, joten päätaulukossa näkyvä reitti ei automaattisesti ole se reitti, jota socket käyttää. Sääntöjen lukeminen ja ytimen pyytäminen ratkaisemaan kohde lähdeosoitteelle erottavat nämä kaksi.

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

Juuri route get:n tuloste vastaa kysymykseen. Jos se nimeää tun0:n ja paketit kuolevat edelleen, siirry tunnelin MTU:hun ja yhdyskäytävän IPv6-edelleenlähetykseen sen sijaan, että palaisit puhelimeen.

Miksi ::/0:n lisääminen yleensä pahentaa tilannetta

::/0:n lisääminen muuttaa tunnelin vaatimuksen yhdestä prefiksistä jokaiseen IPv6-kohteeseen. Puhelimessa se voi tyydyttää tavoitettavuustarkistuksen, koska prefiksisi ulkopuolella oleva testiosoite näyttää nyt reititettävältä. Se ei luo IPv6-ylävirran kapasiteettia yhdyskäytävään, ja monilla kotiyhdyskäytävillä ei ole lainkaan toimivaa IPv6-ylävirtaa. Tuloksena on musta aukko julkiselle IPv6:lle: nimet, jotka ennen putosivat takaisin IPv4:lle, roikkuvat nyt, ja yksityinen sivu voi näyttää paremmalta vain siksi, että tarkistus mittaa jotain muuta.

Myös käytännön hinta on olemassa. Kun tunnelissa on ::/0, kaikki IPv6-liikenne lähtee VPN:n kautta, mukaan lukien liikenne, jota verkon omistaja ei koskaan suostunut kantamaan. Käsittele sitä käyttöönottopäätöksenä, jolla on nimetty omistaja, älä yöllä kello 1 tehtävänä debugausvaiheena.

Työjärjestys, joka lopettaa tämän

Varmista, että AAAA-vastaus tulee resolverilta, joka pitää vyöhykettä, lue VpnService- ja netd-tila tun-liitännälle, tallenna net-export-jälki nähdäksesi, pudottiko Chromium ehdokkaan, ja testaa sitten edestakainen matka komennolla ip -6 route get. Korjaa se kerros, joka todella petti, ja jätä jakokäytäntö rauhaan. Jos yksityiset nimet tarvitsevat eri vastauksia kuin julkiset, sitä varten split tunneling on.

Kirjaa puhelimen koontiversio, selaimen versio ja resolveri, jota kyselit. Nämä kolme tosiasiaa muuttavat lauseen "IPv6 is broken" sellaiseksi, että seuraava ihminen voi toistaa sen.

Aiheeseen liittyvät artikkelit