Сіз Параметрлердегі VPN жолын түртесіз, біреу орнатқан профильді көресіз және оны қосатын шақыруды іздей бастайсыз. Мұндай шақыру жоқ. Қолданба VpnService арқылы өз туннелін аша алады, бірақ сол тізімдегі жазбалар платформаға және оларды жасаған клиентке тиесілі. Шекараның қай жерде екенін дәл білу сізді жасырын кластарды қуудан бір апта үнемдейді.

Параметрлер экраны көрсететіннен бастаңыз

VPN тізімі — жүйе немесе өндіруші клиенті орнатқан профильдердің тізілімі: PPTP, L2TP/IPsec, IKEv2 және OEM қолданбасы немесе MDM итеріп кіргізген жолдар. Әр жолда сервер мекенжайы, тіркелгі деректері және сіздің процесіңізден тыс өмір сүретін хаттама іске асырылымы бар. Пайдаланушы сол жерде Қосылуды түрткенде туннельді платформа клиенті көтереді, сіздің кодыңыз емес. Сондықтан жол қайта жүктеуден кейін де қалады және сондықтан қолданбаңызды жою оны ешқашан жоймайды.

Пайдаланушы жағынан тізім API бетіне ұқсайды, VPN қосу бір ниет қашықтықта болуы тиіс орын. Олай емес. Оған қатысатын жалғыз жария кіру нүктелері — навигация ниеттері, ал оған жазатынның бәрі платформаға немесе артықшылығы бар құрамдасқа тиесілі.

Практикалық салдар: егер қолдау мәтіні пайдаланушыларға профильді Параметрлерде қосуды айтса, сіздің қолданбаңыз бұл ағынның мүлдем бөлігі емес.

VpnService шын мәнінде не береді

VpnService және VpnService.Builder сіздің қолданбаңызға тиесілі бір туннельді сипаттайды. Сіз мекенжайлар, маршруттар, DNS серверлері және MTU қосасыз, трафикті addAllowedApplication() немесе addDisallowedApplication() арқылы шектейсіз, содан кейін establish() TUN интерфейсі үшін ParcelFileDescriptor қайтарады. Сол сәттен бастап қолданба IP пакеттерін оқып, жауаптар жазады, яғни хаттаманы іске асыру немесе кірістіру — сіздің ісіңіз: OpenVPN, WireGuard, өз тасымалыңыз.

Бұл реттілікте ештеңе PPTP, L2TP/IPsec немесе IKEv2 туралы айтпайды. Builder-де жүйенің L2TP клиентін пайдалан деген ажыратқыш жоқ, және платформаға әлдеқашан тиесілі профильді басқаруға мүмкіндік беретін кері шақыру жоқ. Бұл нақты шекара, және бұл рұқсаттардағы олқылық емес, дизайн шекарасы.

Сондықтан қолданба Android-та VPN клиенті бола алады. Тек телефонмен бірге келетін клиенттердің менеджері бола алмайды.

Келісім терезесі әшекей емес

Туннеліңіз басқа қолданбалардың трафигін ұстай алатындықтан, жүйе пайдаланушының оны анық мақұлдауын талап етеді. prepare() іске қосуыңыз керек Intent қайтарады, мақұлдау сіздің пакетіңізге байланысты, ал туннель қосулы тұрғанда күй жолағы тұрақты индикатор көрсетеді. Екінші VPN көтерілсе, біріншісі өшеді, себебі Android бір уақытта бір белсенді VPN жүргізеді.

Осы бір белсенді ережесі сынақ кезінде адамдарды шатастырады. Корпоративтік клиент қосылған кезде өз туннеліңізді көтеріп, кодыңыз бұзылды деп қорытынды жасайсыз, ал платформа жай ғана басқа клиенттен ауысқан. Мақұлдаулар кейін қайтарылуы мүмкін, және келісім әрекеті жоқ құрылғыларда prepare() null қайтаруы мүмкін, сондықтан establish() әлі де сәтсіздікті өңдеуі керек.

Жасырын API-лар және параметрлер ниеттері

Ескі жауаптар кірістірілген клиент пайдаланатын com.android.internal кластары мен AIDL интерфейстерін көрсетеді. Олар SDK-да жоқ, шығарылымдар арасында ескертусіз өзгереді, ал қолданба дүкендері бұл қатынасты тәуекел деп санайды. Құрылғыны root-тау да оларды тұрақты етпейді, өйткені root пен жасырын API-ға қатынас — өзара байланыссыз мәселелер.

Қолдауға ие навигация көмекшісі — Settings.ACTION_VPN_SETTINGS, оның мәні android.net.vpn.SETTINGS. Оны іске қоспас бұрын шешіңіз, өйткені кейбір OEM жинақтары бұл әрекетті жеткізбейді, ал шешу сәтсіз болса, жазбаша қадамдарға көшіңіз. Ол пайдаланушыны экранға апарады және ештеңе конфигурацияламайды.

Құрылғы иесі мен MDM жолдары — адамдар әдетте айтатын ерекшелік. DevicePolicyManager үнемі қосулы VPN пакетін тағайындай алады, ал басқарылатын конфигурациялар оларды қолдайтын клиент үшін параметрлерді алдын ала жүктей алады, бірақ бұл әлі де PPTP профилін жазатын жария SDK емес.

Шешімді пайдаланушы жағынан өткізіңіз

Егер өніміңіз трафик тасымалдауы керек болса, VpnService пен нақты хаттама стекін жоспарлаңыз және келісім ағыны мен бір VPN ережесіне уақыт бөліңіз. Егер мақсат — бар корпоративтік профильге қосылу болса, сіздің жұмысыңыз бағыттау: параметрлер экранына терең сілтеме, өрістерді құжаттау, ал туннельді платформа клиенті жасасын. Егер қолданбаға тек жеке соңғы нүктеге жету керек болса, оған өз туннелі мүлдем қажет емес.

Бұл шешімді код жазбас бұрын жазып қойыңыз, өйткені үш жолдың бірінші спринттен кейін ортақ түктері жоқ.

Бастамас бұрын соңғы тексеру: талап біздің қолданба қосылады дей ме, әлде құрылғы қосылады дей ме? Біріншісі — VpnService, екіншісі — сіз жасай алмайтын профиль. Сол сөйлемді дұрыс құру кез келген қайта құрудан арзан.

Қатысты мақалалар