Та Тохиргоо дахь 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, хоёр дахь нь таны үүсгэж чадахгүй профайл юм. Тэр өгүүлбэрийг зөв болгох нь ямар ч дахин бүтээцээс хямд.

Холбоотой нийтлэлүүд