Noto‘g‘ri taxmin — VpnService ilovasi tizim kalitini aylantiradi va shundan keyin telefon himoyalangan bo‘ladi, degan fikr. Aslida sodir bo‘ladigan narsa torroq: ilova rozilik so‘raydi, interfeys quradi, fayl deskriptori orqali paketlarni o‘qiydi va yozadi, to‘xtaganda esa interfeysni qaytaradi. Bir vaqtda faqat bitta shunday tunnel tirik bo‘lishi mumkin va tizim uni so‘ramasdan olib qo‘yishi mumkin. Odamlar protokolga to‘naydigan chalkash xatti-harakatning katta qismi ana shu egalik modelidan kelib chiqadi.

Har bir hayot sikli o‘tishini chekka holat emas, dizaynning bir qismi deb qarang.

Afsona: ilova telefon VPN’ini yoqadi

Oqim VpnService.prepare() bilan boshlanadi, u foydalanuvchi qabul qilishi shart bo‘lgan Intent qaytaradi, va establish() bilan davom etadi, u keyinchalik ham ilova nazorat qilmaydigan sabablarga ko‘ra muvaffaqiyatsiz bo‘lishi mumkin. Ikkinchi tunnel o‘rnatilsa, birinchi interfeys o‘chiriladi va tizim bildirishnomasi almashtiriladi. Bu ketma-ketlikning hech bir joyida ilova butun qurilma kalitiga ega emas; unga berilgan deskriptor va unga tushadigan paketlarga ega. Hatto doimiy bildirishnoma ham ilova dizayniga emas, tizimga tegishli.

Interfeys tortib olinmaydi, beriladi, shuning uchun boshqa mijoz istalgan vaqtda joyni egallashi mumkin. Ilova buni qaytarish qiymati orqali emas, qayta chaqiruv orqali biladi.

Ilovani majburan to‘xtatish bildirishnomalar panelida ko‘rinishining sababi ham shu: tizim nima berganini xabar qiladi, ilova nima ko‘rsatishni tanlaganini emas.

Afsona: rozilik bir marta beriladi

Tizim tunnelni boshqa mijozga topshirganda, bazaviy sinf onBind() dan qaytaradigan binder ustiga bekor qilish tranzaksiyasini yuboradi. O‘sha binderni o‘zinikiga almashtirgan ilova bekor qilish tranzaksiyasini o‘zi uzatishi kerak, aks holda VpnService.onRevoke() hech qachon ishga tushmaydi va xizmat endi mavjud bo‘lmagan deskriptorga yozishda davom etadi. Rozilikni foydalanuvchi ham qaytarib olishi mumkin, tizim esa qayta ishga tushirish yoki doim yoniq qayta ulanish vaqtida xizmatni to‘xtatishi mumkin.

Bu bilan shug‘ullanish log satri emas, aniq ish: deskriptorni o‘qishni to‘xtating, uni yoping, ulangan bayrog‘ini tozalang va foydalanuvchiga qaysi holatda ekanini ayting. Keyin ilova qayta o‘rnatishi, yana so‘rashi yoki kutishi kerakligini hal qiling, chunki doim yoniq konfiguratsiyada tizim xizmatni o‘zi qaytarishi mumkin.

Bekor qilishni holat emas, istisno deb biladigan ilova har bir yozgan paketi tashlab yuborilayotganda ham ulangan deb xabar beradi, va bu maxfiylik vositasi uchun mumkin bo‘lgan eng yomon nosozlik rejimi.

Afsona: interfeys trafikni siz uchun filtrlaydi

Keladigan narsa — xom IP. Ushlash yoki filtrlash IP, TCP, UDP va IPv6 sarlavhalarini tahlil qilish, oqimlarni kuzatish va javoblarni deskriptorga qayta yozish demakdir, bu esa ushlash ilovasini tizim imkoniyati emas, kichik tarmoq stekiga aylantiradi. protect() ilovaning o‘z transport soketi o‘zini ushlamasdan o‘z tunnelidan o‘tishi uchun mavjud va tunnel ko‘tarilgandan keyin yaratilgan har bir soketda tekshirishga arziydigan mantiqiy qiymat qaytaradi.

Quruvchining ruxsat etilgan va taqiqlangan ilovalar ro‘yxatlari kimning trafigi interfeysga kirishini belgilaydi. Ular interfeys olib yuradigan IP paketlardan tashqari yuklamaga kirish bermaydi va hech bir API boshqa mijozning tunnelini oshkor qilmaydi yoki tizimning VPN profillarini ro‘yxatlaydi. Tarmoq imkoniyatlari tarmoq VPN transporti ekanini aytishi mumkin, lekin tunnel kimniki ekanini emas.

Shuning uchun boshqa ilovalar haqidagi holat savollari qarama-qarshi javoblar oladi: ma’lumot sizning jarayoningizga oshkor qilinmagan.

Hayot sikli aslida nimani talab qiladi

O‘zingiz boshqaradigan holatlarni kuzatib boring: tayyor, o‘rnatilgan, bekor qilingan, to‘xtatilgan. Qayta ulanish — bu buzish, so‘ngra o‘rnatish bo‘lishi kerak, deskriptor va transport soketiga bitta egasi bilan, chunki o‘rnatish uchun raqobatlashadigan ikki komponent yagona bo‘sh joy uchun kurashadi. Zamonaviy Android’da fon ishga tushirishlari cheklangan, shuning uchun yuklanishdagi eshittirish kafolat emas; API darajasi ruxsat bergan joyda bildirishnomasi bilan oldingi plan xizmatidan foydalaning.

Faqat yakuniy holatni emas, o‘tishni ham logga yozing va holat mashinasini har bir yo‘lni sinash mumkin bo‘ladigan darajada kichik tuting. Sinovda yeta olmaydigan holat — logisiz dalada uchraydigan holat.

Hayot siklini qurilmada sinab ko‘ring

Emulyatorlar ulanishni soxtalashtirishi mumkin, lekin rozilik va bekor qilish yo‘lini ishonchli tarzda emas, shuning uchun bularni joyni o‘g‘irlash uchun ikkinchi VPN mijozi o‘rnatilgan haqiqiy qurilmada ishga tushiring.

adb shell dumpsys connectivity | grep -i -A3 vpn
adb shell dumpsys activity services | grep -i -A2 vpnservice
adb logcat -s VpnService:V AndroidRuntime:E
adb shell am force-stop com.example.vpnapp

Tunnelni ishga tushiring, bildirishnoma va interfeysni tasdiqlang, so‘ngra ikkinchi mijozni ulang va bekor qilish qayta chaqiruvi ishlayotganini hamda holat tozalanishini kuzating. Ilovani majburan to‘xtatib, hali ham tirik deskriptor haqida biror narsa xabar berayotganini tekshiring.

Ketma-ketlikni doim yoniq qayta ishga tushirishdan keyin takrorlang, chunki bu yo‘l foydalanuvchi boshlagan ulanishdan farq qiladi. Siz yashil belgini emas, ilova endi o‘ziga tegishli bo‘lmagan deskriptordan foydalanishni to‘xtatgani haqidagi dalilni qidiryapsiz.

O'xshash maqolalar