Android DNS-i düzgün oxuyun: şəbəkə üzrə, resolv.conf-da deyil
Android tətbiqiniz indicə oxuduğunuz resolv.conf vasitəsilə deyil, hər şəbəkə üçün resolver vasitəsilə həll edir. Əvvəlcə LinkProperties, socket bağlamaları və Private DNS-i yoxlayın.
Cihazda shell alırsınız, /etc/resolv.conf faylını oxuyursunuz və ya köhnə net.dns1 dəyərini qazıb çıxarırırsınız və bir ünvan alırsınız. Qarşınızdakı tətbiq tamamilə başqa bir şey vasitəsilə həll edir. Cari Android buraxılışında resolver şəbəkə üzrədir: sistem hər Network üçün siyasət saxlayır və onu sorğunu göndərən socket-ə tətbiq edir. Fayl və köhnə xassə qalıqlardır və heç biri sorğunuzun həqiqətən keçdiyi yolu təsvir etmir.
Bu boşluq split-tunnel və Private DNS tətbiqində görünür, burada eyni telefondakı iki tətbiq qanuni olaraq fərqli cavablar görə bilər. Bu təlimat səhv və ya olmayan həlldən başlayır və ona aid olan konfiqurasiyaya doğru geri gedir.
Resolver cihaza deyil, şəbəkəyə aiddir
Android 9 və sonrakı versiyalarda ad həlli socket-in bağlı olduğu Network-ə əsaslanan sistem resolveri vasitəsilə gedir. Hər şəbəkə öz LinkProperties daşıyır və bu xassələr yalnız həmin şəbəkə üçün DNS serverləri siyahısını, axtarış domenlərini və Private DNS vəziyyətini saxlayır. Bu modeldə fayldan oxuya biləcəyiniz vahid cihaz miqyaslı siyahıya uyğun gələn heç nə yoxdur.
VPN bölünməni aşkar edir. Tunel qalxdıqda VPN tətbiqi VPN-in öz şəbəkəsində qeydiyyata alınmış DNS serverləri təqdim edir, buna görə onun vasitəsilə yönləndirilən tətbiqlər həmin serverlərdə həll edir, kənarda qalan tətbiqlər isə altındakı şəbəkədən istifadə etməyə davam edir. Bir cihaz, iki cavab yolu, ziddiyyət yoxdur.
Snapşotu təsirlənmiş tətbiqin içindən oxuyun
Tətbiqin özündən soruşun. Context və adi android.permission.ACCESS_NETWORK_STATE icazəsi olan metod sistem xassələrinə toxunmadan snapşotu oxuya bilər:
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 prosesinizin defolt şəbəkəsidir, cihazdakı yeganə şəbəkə deyil və çağıranın istifadə edilə bilən defoltu yoxdursa null ola bilər. Bloklanmış defolt VPN bunun adi səbəbidir. isPrivateDnsActive həmin şəbəkədə sorğuların TLS vasitəsilə adlandırılmış resolverə getdiyini bildirir və bu, sadə UDP 53 yoxlamasının nə göstərəcəyini dəyişir. API səthi LinkProperties altında sənədləşdirilib və içindəki hər dəyər konfiqurasiyanın snapşotudur, müəyyən sorğunun müəyyən serverə çatdığının sübutu deyil.
Defolt şəbəkə işi görən şəbəkə olmadıqda
Snapşot yalnız defolt şəbəkə üçün cavab verir. Tətbiq öz prosesini və ya bir socketi başqa şəbəkəyə bağlaya bilər və sonra həll bu seçimi izləyir, diaqnostikanız isə hələ də defoltu bildirir. Öz DNS-over-HTTPS resolverini gətirən brauzer sistem siyahısına heç müraciət etmir, buna görə cavabları cihazın qalan hissəsi haqqında heç nə demir. İş profili tətbiqi öz siyasəti olan ayrı istifadəçi altında işləyir. Serverləri günahlandırmadan əvvəl bağlamanı yoxlayın.
VPN inteqrasiyası işin digər yarısıdır. dhcp-option DNS sətri OpenVPN profilində almaq və həmin ünvanı Android VPN şəbəkəsində qeyd etmək iki ayrı addımdır və serverə gedən çatışmayan marşrut səhv ünvan qədər səssizcə uğursuz olur. İnkişaf maşınından adb shell dumpsys connectivity build icazə verdikdə eyni əlaqə xassələrini şəbəkə üzrə çap edir və bu, kod yazmadan siyahını təsdiqləyir.
Konfiqurasiyanı etməyə icazəniz olan bir həll ilə müqayisə edin
Şəxsi ad məkanında həll olunmalı bir ad və bir ictimai ad seçin və hər iki nəticəni snapşotun yanına yazın: şəbəkə, konfiqurasiya edilmiş serverlər, Private DNS vəziyyəti və xətanın dəqiq mətni. Adlandırılmış serverə birbaşa sorğu həmin serverin sizə cavab verdiyini sübut edir; adi tətbiq həllinin onu seçdiyini sübut etmir. Keşdəki cavab təzə test deyil, buna görə keşi təmizləyin və ya bu gün heç kimin soruşmadığı bir ad istifadə edin.
Resolver yalnız müəyyən giriş şəbəkəsindən olan müştərilərə xidmət edirsə, VPN çıxışından sonra gördüyü şey nəticəni həll edə bilər və bu, onu idarə edən üçün siyasət məsələsidir, operatorların UDP 53-ü blokladığının sübutu deyil. Private DNS aktiv olan yerdə ixtisassız host adı dizayn üzrə rədd edilə bilər, halbuki eyni server ictimai adlara normal cavab verir. Xassələri oxumaq hansı rejimin qüvvədə olduğunu bildirir, beləliklə paket filtrləri haqqında təxmin etməyi dayandırırsınız.
Uyğunsuzluğa sahib olan təbəqəni düzəldin
Qlobal vəziyyəti redaktə etmək əvəzinə yuxarı doğru işləyin. Tətbiq səhv şəbəkəyə bağlanıbsa, bağlamanı düzəldin. Profil səhv DNS seçimi təqdim edirsə, profili düzəldin. Private DNS resolveri şəxsi zonanıza xidmət edə bilməyən şəbəkədə sərtdirsə, bu cihaz idarəetməsi qərarıdır, funksiyanı hər yerdə söndürmək üçün səbəb deyil.
İctimai resolverləri DHCP qarmağına və ya sistem xassəsinə sıxışdırmaq daim insidentlərə səbəb olan düzəlişdir: şəxsi adlar həll olunmağı dayandırır, dəyişiklik VPN sessiyasını yaşayır və cihazdakı növbəti şəxs sahibsiz köhnəlmiş ünvan tapır. Dəyişikliyi uyğunsuzluğa sahib olan VPN, tətbiq və ya idarəetmə təbəqəsi daxilində saxlayın, sonra server siyahısının həqiqətən dəyişdiyini təsdiqləmək üçün snapşotu yenidən oxuyun.
Sonda istədiyiniz bir şəbəkəyə, resolver siyahısına və Private DNS vəziyyətinə bağlı bir tətbiq sorğusudur. Bu zənciri göstərə bildiyiniz zaman fayldakı tanış ünvan artıq heç nəyin sübutu deyil.