Читајте Android DNS исправно: по мрежи, не у resolv.conf
Ваша Android апликација разрешава преко resolver-а за сваку мрежу, не преко resolv.conf датотеке коју сте управо прочитали. Прво проверите LinkProperties, повезивања socket-а и Private DNS.
Добијете љуску на уређају, прочитате /etc/resolv.conf или ископате стару вредност net.dns1, и добијете једну адресу. Апликација пред вама разрешава преко нечег сасвим другог. На актуелној верзији Android-а resolver је по мрежи: систем држи правило за сваки Network и примењује га на socket који је послао захтев. Датотека и стара особина су остаци и ниједно од њих не описује пут који је ваш упит заиста прешао.
Тај јаз се види током увођења split-tunnel-а и Private DNS, где две апликације на истом телефону могу легитимно видети различите одговоре. Овај водич почиње од погрешног или недостајућег разрешавања и иде уназад до конфигурације којој припада.
Resolver припада мрежи, не уређају
Разрешавање имена на Android-у 9 и новијем иде преко системског resolver-а који се ослања на Network за коју је socket везан. Свака мрежа носи своје LinkProperties, а те особине садрже листу DNS сервера, домене претраге и стање Private DNS само за ту мрежу. Ништа у том моделу не одговара једној листи за цео уређај коју бисте могли прочитати из датотеке.
VPN чини поделу очигледном. Када тунел устане, VPN апликација доставља DNS сервере регистроване на сопственој мрежи VPN-а, па апликације усмерене кроз њега разрешавају преко тих сервера, док искључене апликације настављају да користе доњу мрежу. Један уређај, два пута одговора, без противречности.
Прочитајте снимак из саме погођене апликације
Питајте саму апликацију. Метода која има Context и нормалну дозволу android.permission.ACCESS_NETWORK_STATE може прочитати снимак без дирања системских особина:
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?.privateDnsServerNameactiveNetwork је задана мрежа вашег процеса, не једина мрежа на уређају, и може бити null када позивалац нема употребљиву задану мрежу. Блокиран задани VPN је уобичајен разлог. isPrivateDnsActive вам каже да ли упити на тој мрежи иду преко TLS-а до именованог resolver-а, што мења оно што ће вам показати обична UDP 53 сонда. Површина API-ја је документована под LinkProperties, а свака вредност у њој је снимак конфигурације, не доказ да је одређени упит стигао до одређеног сервера.
Када задана мрежа није она која обавља посао
Снимак одговара само за задану мрежу. Апликација може везати свој процес или један socket за другу мрежу, и тада разрешавање следи тај избор док ваша дијагностика и даље пријављује задану мрежу. Прегледач који доноси сопствени DNS-over-HTTPS resolver уопште не консултује системску листу, па његови одговори не говоре ништа о остатку уређаја. Апликација радног профила ради под одвојеним корисником с властитим правилом. Проверите везивање пре него што окривите сервере.
VPN интеграција је друга половина. Примити линију dhcp-option DNS у OpenVPN профилу и регистровати ту адресу на Android VPN мрежи су два одвојена корака, а рута која недостаје до сервера пада једнако тихо као погрешна адреса. Са развојне машине adb shell dumpsys connectivity исписује исте особине везе по мрежи када build то дозволи, што потврђује листу без писања кода.
Упоредите конфигурацију с једним разрешавањем које смете извести
Одаберите име које се мора разрешити унутар приватног именског простора и једно јавно име, па запишите оба резултата поред снимка: мрежа, конфигурисани сервери, стање Private DNS и тачан текст грешке. Директан упит именованом серверу доказује да вам тај сервер одговара; не доказује да га је одабрало уобичајено разрешавање апликације. Одговор из кеша није свеж тест, зато испразните кеш или користите име о коме данас нико није питао.
Ако resolver служи само клијентима из одређене приступне мреже, оно што види након изласка из VPN-а може одлучити исход, а то је питање правила за онога ко га води, не доказ да оператери блокирају UDP 53. Где је Private DNS активан, неквалификовано име хоста може бити одбијено по дизајну док исти сервер нормално одговара јавним именима. Читање особина вам каже који режим важи, па престајете да нагађате филтере пакета.
Поправите слој коме припада несклад
Радите према горе уместо да мењате глобално стање. Ако је апликација везана за погрешну мрежу, поправите везивање. Ако профил доставља погрешну DNS опцију, поправите профил. Ако је Private DNS строг на мрежи чији resolver не може служити вашој приватној зони, то је одлука управљања уређајем, а не разлог да функцију посвуда искључите.
Утеривање јавних resolver-а у DHCP куку или системску особину је поправка која непрестано изазива инциденте: приватна имена престају да се разрешавају, промена надживи VPN сесију, а следећа особа на уређају нађе застарелу адресу без власника. Држите промену унутар VPN-а, апликације или слоја управљања коме припада несклад, па затим поново прочитајте снимак да потврдите да се листа сервера заиста променила.
На крају желите један захтев апликације везан за једну мрежу, листу resolver-а и стање Private DNS. Када можете показати тај ланац, позната адреса у датотеци престаје да буде доказ ичега.