Android tətbiqiniz niyə sistem VPN profili əlavə edə bilmir
VpnService tətbiqinizə məxsus tunel qurur; telefonun PPTP, L2TP və ya IPsec qeydlərini əlavə edə və ya redaktə edə bilməz. Sərhədi izləyin və düzgün yolu seçin.
Ayarlarda VPN sətrinə toxunursunuz, başqasının quraşdırdığı profili görürsünüz və onu əlavə edən çağırışı axtarmağa başlayırsınız. Belə çağırış yoxdur. Tətbiq VpnService vasitəsilə öz tunelini aça bilər, lakin o siyahıdakı qeydlər platformaya və onları yaradan müştəriyə aiddir. Xəttin harada yerləşdiyini dəqiq bilmək sizi gizli sinifləri təqib etməkdən bir həftə xilas edir.
Ayarlar ekranının göstərdiyindən başlayın
VPN siyahısı sistemin və ya satıcı müştərisinin quraşdırdığı profillərin reyestridir: PPTP, L2TP/IPsec, IKEv2 və OEM tətbiqinin və ya MDM-in itələdiyi sətirlər. Hər sətir server ünvanı, etimad məlumatları və sizin prosesinizdən kənarda yaşayan protokol tətbiqi daşıyır. İstifadəçi orada Qoşul düyməsinə toxunduqda tuneli sizin kodunuz deyil, platforma müştərisi qaldırır. Sətrin yenidən başlatmadan sonra da qalmasının və tətbiqinizi sildikdə heç vaxt silinməməsinin səbəbi budur.
İstifadəçi tərəfindən siyahı API səthi kimi görünür, VPN əlavə etməyin bir niyyət uzaqlıqda olmalı olduğu yer kimi. Belə deyil. Ona toxunan yeganə ictimai giriş nöqtələri naviqasiya niyyətləridir və ona yazan hər şey platformaya və ya imtiyazlı komponentə aiddir.
Praktik nəticə: dəstək sənədi istifadəçilərə profili Ayarlarda əlavə etməyi deyirsə, tətbiqiniz o axının ümumiyyətlə bir hissəsi deyil.
VpnService sizə əslində nə verir
VpnService və VpnService.Builder tətbiqinizə məxsus bir tuneli təsvir edir. Ünvanlar, marşrutlar, DNS serverləri və MTU əlavə edirsiniz, trafiki addAllowedApplication() və ya addDisallowedApplication() ilə əhatələyirsiniz, sonra establish() TUN interfeysi üçün ParcelFileDescriptor qaytarır. Bu andan tətbiq IP paketlərini oxuyur və cavabları yazır, yəni protokolu tətbiq etmək və ya daxil etmək sizin işinizdir: OpenVPN, WireGuard, fərdi transport.
Bu ardıcıllıqda heç nə PPTP, L2TP/IPsec və ya IKEv2 danışmır. Builder-də sistemin L2TP müştərisindən istifadə et deyən açar yoxdur və platformanın artıq sahib olduğu profili idarə etməyə imkan verən geri çağırış da yoxdur. Əsl sərhəd budur və bu, icazə boşluğu deyil, dizayn sərhədidir.
Yəni tətbiq Android-də tamamilə VPN müştərisi ola bilər. Sadəcə telefonla gələn müştərilər üçün menecer ola bilməz.
Razılıq dialoqu bəzək deyil
Tuneliniz digər tətbiqlərin trafikini tuta bildiyi üçün sistem istifadəçinin bunu açıq şəkildə təsdiqləməsini tələb edir. prepare() işə salmalı olduğunuz Intent qaytarır, təsdiq paketinizə bağlıdır və tunel açıq olduqda status panelində daimi göstərici görünür. İkinci VPN qalxdıqda birincisi deaktiv olur, çünki Android bir anda yalnız bir aktiv VPN işlədir.
Tək-aktiv qaydası test zamanı insanları çaşdırır. Korporativ müştəri qoşulmuş halda öz tunelinizi qaldırır və kodunuzun xarab olduğu qənaətinə gəlirsiniz, halbuki platforma sadəcə digər müştəridən uzaqlaşıb. Təsdiqlər sonradan ləğv edilə bilər və razılıq fəaliyyəti olmayan cihazlarda prepare() null qaytara bilər, ona görə establish() hələ də uğursuzluğu idarə etməlidir.
Gizli API-lər və ayarlar niyyətləri
Köhnə cavablar daxili müştərinin istifadə etdiyi com.android.internal siniflərinə və AIDL interfeyslərinə işarə edir. Onlar SDK-da deyil, buraxılışlar arasında xəbərdarlıq olmadan dəyişir və tətbiq mağazaları bu girişi risk sayır. Cihazı root etmək də onları sabit etmir, çünki root və gizli API girişi bir-biri ilə əlaqəsiz problemlərdir.
Dəstəklənən naviqasiya köməkçisi Settings.ACTION_VPN_SETTINGS-dir və dəyəri android.net.vpn.SETTINGS-dir. İşə salmazdan əvvəl onu həll edin, çünki bəzi OEM buraxılışları o fəaliyyəti göndərmir; həll uğursuz olarsa yazılı addımlara keçin. O, istifadəçini ekrana aparır və heç nə konfiqurasiya etmir.
Cihaz sahibi və MDM yolları insanların adətən nəzərdə tutduğu istisnadır. DevicePolicyManager həmişə-açıq VPN paketi təyin edə bilər və idarə olunan konfiqurasiyalar onları dəstəkləyən müştəri üçün parametrləri əvvəlcədən yükləyə bilər, lakin bu hələ ictimai SDK-nın PPTP profili yazması deyil.
Qərarı istifadəçi tərəfindən addımlayın
Məhsulunuz trafik daşımalıdırsa, VpnService və real protokol yığını planlaşdırın, razılıq axını və tək-VPN qaydası üçün vaxt ayırın. Məqsəd mövcud korporativ profilə qoşulmaqdırsa, işiniz təlimatdır: parametrlər ekranına dərin keçid verin, sahələri sənədləşdirin və tuneli platforma müştərisi qursun. Tətbiq yalnız şəxsi son nöqtəyə çatmalıdırsa, ona öz tuneli ümumiyyətlə lazım deyil.
Bu qərarı koddan əvvəl yazın, çünki üç yol birinci sprintdən sonra demək olar ki, heç bir ortaq cəhətə malik deyil.
Başlamazdan əvvəl son yoxlama: tələb bizim tətbiqimizin qoşulduğunu, yoxsa cihazın qoşulduğunu deyir? Birincisi VpnService-dir, ikincisi yarada bilmədiyiniz profildir. O cümləni düzgün qurmaq istənilən yenidən qurmadan ucuzdur.