Získáte shell na zařízení, přečtete /etc/resolv.conf nebo vyhrabete starou hodnotu net.dns1, a dostanete jednu adresu. Aplikace před vámi překládá přes něco úplně jiného. V aktuální verzi Androidu je resolver pro každou síť: systém drží zásadu pro každou Network a uplatňuje ji na socket, který požadavek odeslal. Soubor a stará vlastnost jsou pozůstatky a ani jedno z nich nepopisuje cestu, kterou váš dotaz skutečně prošel.

Tato mezera se ukáže při zavádění split-tunnelu a Private DNS, kde dvě aplikace na stejném telefonu mohou legitimně vidět různé odpovědi. Tento průvodce začíná u chybného nebo chybějícího překladu a jde zpět ke konfiguraci, které patří.

Resolver patří síti, ne zařízení

Překlad názvů na Androidu 9 a novějším prochází systémovým resolverem, který se řídí Network, ke které je socket připojen. Každá síť nese vlastní LinkProperties a tyto vlastnosti obsahují seznam serverů DNS, vyhledávací domény a stav Private DNS pouze pro tuto síť. Nic v tomto modelu neodpovídá jednomu seznamu pro celé zařízení, který byste mohli přečíst ze souboru.

VPN rozdělení zviditelní. Když tunel vstane, aplikace VPN dodá servery DNS registrované na vlastní síti VPN, takže aplikace směrované přes ni překládají přes tyto servery, zatímco vyloučené aplikace dál používají podkladovou síť. Jedno zařízení, dvě cesty odpovědi, žádný rozpor.

Přečtěte snímek zevnitř postižené aplikace

Zeptejte se samotné aplikace. Metoda, která má Context a běžné oprávnění android.permission.ACCESS_NETWORK_STATE, může snímek přečíst, aniž by se dotkla systémových vlastností:

val cm = getSystemService(ConnectivityManager::class.java) ?: return
val network = cm.activeNetwork
val links = network?.let { cm.getLinkProperties(it) }

val dnsServers = links?.dnsServers
val privateDnsActive = links?.isPrivateDnsActive
val privateDnsName = links?.privateDnsServerName

activeNetwork je výchozí síť vašeho procesu, ne jediná síť v zařízení, a může být null, když volající nemá použitelnou výchozí síť. Zablokovaná výchozí VPN je obvyklý důvod. isPrivateDnsActive vám řekne, zda dotazy v této síti jdou přes TLS k pojmenovanému resolveru, což mění, co vám ukáže prostá sonda UDP 53. Povrch API je zdokumentován pod LinkProperties a každá hodnota v něm je snímek konfigurace, nikoli důkaz, že konkrétní dotaz dorazil na konkrétní server.

Když výchozí síť není ta, která dělá práci

Snímek odpovídá jen za výchozí síť. Aplikace může proces nebo jediný socket připojit k jiné síti a překlad pak následuje tuto volbu, zatímco vaše diagnostika stále hlásí výchozí síť. Prohlížeč s vlastním resolverem DNS-over-HTTPS systémový seznam vůbec nekonzultuje, takže jeho odpovědi nic neříkají o zbytku zařízení. Aplikace pracovního profilu běží pod samostatným uživatelem s vlastní zásadou. Zkontrolujte vazbu, než obviníte servery.

Integrace VPN je druhá polovina. Přijmout řádek dhcp-option DNS v profilu OpenVPN a zaregistrovat tuto adresu v síti VPN Androidu jsou dva samostatné kroky a chybějící trasa k serveru selhává stejně tiše jako špatná adresa. Z vývojového stroje vypíše adb shell dumpsys connectivity stejné vlastnosti propojení pro každou síť, když to sestavení dovolí, což seznam potvrdí bez psaní kódu.

Porovnejte konfiguraci s jedním překladem, který smíte provést

Vyberte název, který se musí přeložit v soukromém jmenném prostoru, a jeden veřejný název, a zapište oba výsledky vedle snímku: síť, nakonfigurované servery, stav Private DNS a přesný text chyby. Přímý dotaz na pojmenovaný server dokazuje, že tento server vám odpovídá; nedokazuje, že ho zvolil běžný překlad aplikace. Odpověď z mezipaměti není čerstvý test, takže mezipaměť vyprázdněte nebo použijte název, na který se dnes nikdo neptal.

Pokud resolver obsluhuje jen klienty z určité přístupové sítě, může to, co vidí po odchodu z VPN, rozhodnout o výsledku, a to je otázka zásad pro toho, kdo ho provozuje, ne důkaz, že operátoři blokují UDP 53. Tam, kde je Private DNS aktivní, může být nekvalifikovaný název hostitele odmítnut záměrně, zatímco stejný server veřejné názvy normálně zodpovídá. Čtení vlastností vám řekne, který režim platí, takže přestanete hádat filtry paketů.

Opravte vrstvu, které neshoda patří

Postupujte nahoru místo úprav globálního stavu. Pokud je aplikace připojena ke špatné síti, opravte vazbu. Pokud profil dodává špatnou volbu DNS, opravte profil. Pokud je Private DNS striktní v síti, jejíž resolver nedokáže obsloužit vaši soukromou zónu, je to rozhodnutí správy zařízení, ne důvod funkci všude vypnout.

Protlačovat veřejné resolvery do háku DHCP nebo systémové vlastnosti je oprava, která neustále způsobuje incidenty: soukromé názvy přestanou překládat, změna přežije relaci VPN a další člověk na zařízení najde zastaralou adresu bez vlastníka. Držte změnu uvnitř VPN, aplikace nebo vrstvy správy, které neshoda patří, a potom snímek znovu přečtěte, abyste potvrdili, že se seznam serverů skutečně změnil.

Na konci chcete jediný požadavek aplikace svázaný s jednou sítí, seznamem resolverů a stavem Private DNS. Jakmile dokážete ten řetěz ukázat, známá adresa v souboru přestává být důkazem čehokoli.

Související články