Aplikace pro Android převádí jména mimo VPN: kontrolní seznam pro svázání
Android může převádět jména přes výchozí síť, i když je VPN aktivní. Svažte proces se sítí VPN a ověřte, který překladač aplikace skutečně použila.
Aplikace pro Android nedokáže přeložit interní jméno, zatímco vlastní prohlížeč VPN klienta se k němu dostane, a stejný build funguje na jiném telefonu. Proměnná není URL. Proměnná je, kterou síť smí proces aplikace použít pro překlad, a Android nezaručuje, že aktivní VPN je ta, kterou používají vaše sockety. Projděte tyto kontroly popořadě a zastavte se, když se snímek překladače neshoduje s vaším předpokladem.
Krok 1: Dokažte, ve které síti aplikace je
Čtěte vlastní pohled aplikace, ne stavový řádek. Z ConnectivityManager získejte aktivní síť, její LinkProperties , seznam DNS serverů a nastavení privátního DNS. Pokud seznam obsahuje překladač VPN, má aplikace cestu k němu; pokud obsahuje překladač Wi-Fi, tunel není výchozí sítí pro tento proces.
Ikona VPN říká jen, že tunel existuje. Neříká, že k němu byl proces aplikace svázán, a Android nevede překlad jmen vždy sítí, která vypadá aktivně. Lokální VPN aplikace, které předávají na jiné zařízení, sítě Wi-Fi bez internetu a buildy výrobců mohou způsobit, že se aplikace ptá výchozího překladače místo serverů tunelu.
Krok 2: Vyžádejte přenos VPN a svažte proces
Když aplikace musí použít překladač tunelu, vyžádejte síť s přenosem VPN a svažte proces v callbacku, aby kód nehádal, kdy se síť objeví:
val request = NetworkRequest.Builder()
.addTransportType(NetworkCapabilities.TRANSPORT_VPN)
.build()
connectivityManager.requestNetwork(request, object : NetworkCallback() {
override fun onAvailable(network: Network) {
val bound = connectivityManager.bindProcessToNetwork(network)
Log.i(TAG, "bound to VPN network: " + bound)
}
})Volání mění výchozí síť pro celý proces, takže každý socket vytvořený potom ji používá. Již existující sockety si zachovají síť, ve které vznikly, a proto fond spojení otevřený před svázáním může dál překládat starou cestou. Návratová hodnota je boolean a výsledek false znamená, že ke svázání nedošlo; zkuste to znovu po krátké prodlevě a zaznamenejte oba pokusy.
Krok 3: Omezit svázání na to, co ho potřebuje
Svázání pro celý proces je hrubé. Telemetrie, kontroly aktualizací a SDK třetích stran se také přesunou do tunelu, a pokud tunel nemá internet, začnou selhávat. Pro jediný požadavek použijte továrnu socketů dané sítě a pro vše ostatní zachovejte výchozí nastavení zařízení. Vyberte vědomě jeden model: úzké svázání pro každé spojení, nebo svázání procesu s výslovným odvázáním, když VPN zmizí.
Dvě funkce překladače mohou svázání porazit bez jakékoli chyby. Privátní DNS v přísném režimu posílá dotazy na pojmenovaný server DoT místo překladače sítě a aplikace s vlastním klientem DNS-over-HTTPS systémový překladač úplně obchází. Zkontrolujte obojí, než usoudíte, že svázání selhalo. Dotaz, který nikdy nedorazí na DNS server VPN, se neobjeví v žádném logu na straně tunelu.
Krok 4: Nevěřit omezení CONNECTED
Příznak NetworkType.CONNECTED ve WorkManageru znamená, že síť je připojena, a přenos VPN ho splňuje i tehdy, když podkladové Wi-Fi nebo mobilní spojení zmizelo. Úloha běží, každý požadavek selže a politika opakování z toho udělá bouři, která vypadá jako chyba plánování. Tunel je síť; omezení nikdy nebylo kontrolou internetu.
Zkontrolujte schopnost, kterou práce skutečně potřebuje, například ověřený přístup k internetu, a udržujte omezenou politiku opakování s odstupem. Pokud práce potřebuje interní jméno, přeložte to jméno ve zvolené síti před vykonáním práce a selhejte rychle s jasnou chybou místo opakování požadavku, který nemůže uspět.
Krok 5: Zaznamenejte důkazy a znovu otestujte rozsah
Zaznamenejte typy přenosu zvolené sítě, DNS servery z LinkProperties , zda svázání vrátilo true, a přesné selhání prvního požadavku. Potom spusťte interní a veřejné jméno pod stejným svázáním. Tato dvojice ukáže, zda aplikace použila překladač tunelu, nebo tiše spadla na výchozí nastavení zařízení, a to je rozdíl, který uživatel zažívá.
Opakujte na nejstarší verzi Androidu, kterou podporujete, a na jedné aktuální verzi. Chování překladače, které dělá výchozí cestu správnou, je přesně tam, kde se zařízení a verze liší, a build, který projde jen na nejnovějším testovacím zařízení, není pro rozsah, který dodáváte, ověřený. adb shell dumpsys connectivityje rychlý způsob, jak potvrdit, které sítě a schopnosti zařízení hlásí, když reprodukujete selhání.