Il-protezzjoni tas-VpnService tfalli meta VPN ieħor diġà attiv
Android iħalli interfaċċa VPN waħda għal kull utent. Wettaq il-verifiki prepare, establish, protect u tal-pussess f’ordni, imbagħad agħżel revoka jew esklużjoni skont l-app.
L-app tiegħek issejjaħ VpnService.prepare, tieħu null, tibni tunnel, u d-deskrittur jidher validu, iżda xejn ma jasal għas-server. Jew prepare jirritorna Intent, l-utent japprovah, u establish xorta jfalli. Iż-żewġ riżultati normalment ifissru l-istess ħaġa: app oħra diġà għandha l-interfaċċa VPN għal dan l-utent, u s-sejħiet protect tiegħek qed jimmarkaw sokits li t-tunnel tiegħek ma jistax juża. Għaddi mill-verifiki hawn taħt f’ordni u waqqaf fl-ewwel waħda li tfalli, għax pass aktar tard ma jistax isewwi wieħed qabel.
Iċċekkja l-post tal-VPN qabel ma tmiss protect
Android jagħti lil kull utent eżattament interfaċċa VPN attiva waħda. Din hija regola tal-pjattaforma, mhux permess li l-app tiegħek tista’ titlob, għalhekk żewġ klijenti li t-tnejn iridu jkunu t-tunnel ma jistgħux jeżistu flimkien.
VPN dejjem attiv imwaqqaf għal app oħra huwa l-iktar każ diffiċli, għax is-sistema żżomm dik l-app konnessa u tirrifjuta teħid ta’ poter. Filtru tat-traffiku bħal AdGuard, klijent korporattiv jew VPN tal-konsumatur jistgħu jżommu l-post waqt li l-utent nesa li huwa installat. Itlob lill-utent jiftaħ is-Settings u jaqra d-dħul elenkat taħt VPN; l-isem hemmhekk huwa s-sid li qed tikkompeti miegħu. Sakemm dak id-dħul ma jiġix skonnettjat jew it-twaqqif dejjem attiv ma jitħassarx, il-VpnService tiegħek ma jistax isir l-interfaċċa.
Pass 1: aqra x’jirritorna prepare
VpnService.prepare iwieġeb mistoqsija waħda: tista’ din l-app issir il-VPN? Jirritorna null meta l-kunsens diġà jeżisti, u Intent meta l-utent għad irid japprovah, li trid tniedi b’startActivityForResult. Ittratta r-ritorn null bħala permess biex tkompli, mhux bħala prova li establish se jirnexxi.
Intent intent = VpnService.prepare(context);
if (intent != null) {
startActivityForResult(intent, REQUEST_VPN);
}Jekk il-mogħdija tal-Intent terga’ lura u l-utent irrifjuta, prepare se jibqa’ jirritorna Intent fl-attentat li jmiss. Irreġistra l-kodiċi tar-riżultat minflok ma terġa’ tipprova f’linja, għax kunsens miċħud hija deċiżjoni tal-utent, mhux żball temporanju.
Pass 2: ikkonferma li l-interfaċċa tappartjeni lill-app tiegħek
Wara establish, il-ParcelFileDescriptor li tirċievi hija l-prova tal-pussess tiegħek, u jiswa li tiċċekkjaha qabel kull xogħol fuq is-sokits. Deskrittur li huwa null jew diġà magħluq ifisser li l-interfaċċa qatt ma nħolqot, anki jekk ma deher l-ebda eċċezzjoni. Qabbel l-isem tal-interfaċċa mill-builder ma’ dak li s-sistema tirrapporta għall-VPN attiv, billi tuża dumpsys fuq tagħmir tat-test. Jekk huma differenti, it-tunnel li bnejt mhuwiex it-tunnel li qed iġorr it-traffiku.
adb shell dumpsys connectivityL-istess nuqqas ta’ qbil jispjega ikona konnessa b’traffiku mejjet. Is-sistema turi t-tunnel tal-app l-oħra, filwaqt li l-kodiċi tiegħek iżomm deskrittur għal interfaċċa li mhuwiex proprjetarju tagħha.
Pass 3: sejjaħ protect qabel connect
Ladarba l-interfaċċa teżisti, is-sokits li tiftaħ l-app tiegħek jiġu diretti fit-tunnel b’mod awtomatiku. It-trasport ta’ barra ma jistax isegwi dik ir-regola inkella l-pakkett inkapsulat jerga’ lura fl-interfaċċa, għalhekk VpnService protect jimmarka sokit biex jaqbeż il-VPN u juża n-netwerk ta’ taħt. Is-sejħa tirritorna boolean, u li tinjorah hija t-triq li biha tispiċċa b’sokit li jidher f’saħħtu u ma jġorr xejn.
Sejjaħ protect qabel connect jew bind, qatt wara. Il-protezzjoni trid tkun f’postha qabel ma s-sokit jiġi konness jew marbut, għax sokit konness diġà għażel ir-rotta tiegħu u protect aktar tard ma jċaqlaqx b’mod affidabbli. Jekk protect jirritorna false, waqqaf u erġa’ ċċekkja l-pussess: jfalli meta l-interfaċċa ma tappartjenix lill-app tiegħek, li huwa eżattament l-istat li jħalli VPN ieħor. Ritorn false huwa sinjal li tmur lura għall-Pass 1, mhux li terġa’ tipprova l-istess sokit.
DatagramSocket socket = new DatagramSocket();
if (!vpnService.protect(socket)) {
return;
}
socket.connect(serverAddress, serverPort);Pass 4: orbot proċess meta sokit ikun skomdu
Xi trasporti mhumiex sokit wieħed: librerija tista’ tiftaħ diversi, jew forsi trid li kull konnessjoni fi proċess awżiljarju tuża l-istess ħruġ. ConnectivityManager.bindProcessToNetwork jorbot il-proċess ma’ netwerk magħżul, u s-setProcessDefaultNetwork eqdem għamel l-istess xogħol qabel ma ntuża iktar. Itlob il-konnessjoni ta’ taħt b’NET_CAPABILITY_NOT_VPN biex l-irbit jagħżel in-netwerk taħt it-tunnel tiegħek u mhux it-tunnel innifsu.
NetworkRequest request = new NetworkRequest.Builder()
.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
.addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_VPN)
.build();L-irbit ta’ proċess mhuwiex it-tieni VPN. Jagħżel ħruġ għal dak il-proċess, li huwa utli għat-trasport tiegħek u inutli biex tmexxi żewġ tunnels fl-istess ħin.
Sewwi t-tagħmir tal-utent, mhux il-mogħdija tal-kodiċi
M’hemm l-ebda API li tħalli żewġ applikazzjonijiet jaqsmu l-post tal-VPN, għalhekk is-sewqan jappartjeni lill-istat tat-tagħmir. Offri lill-utent żewġ mogħdijiet konkreti: skonnettja jew ħassar id-dejjem attiv għall-app l-oħra biex il-prepare tiegħek jista’ jieħu f’idejh, jew iftaħ it-twaqqif skont l-app ta’ dik l-app u eskludi l-app tiegħek mit-tunnel tagħha. L-esklużjoni żżomm il-filtru għaddej għal kollox ieħor u tħalli lill-app tiegħek tuża l-konnessjoni ordinarja, li spiss hija r-riżultat li l-utent verament irid.
Ikteb iż-żewġ mogħdijiet fid-dokumentazzjoni tal-appoġġ tiegħek, għax l-utenti rari jafu liema app għandha l-VPN. Itlobhom jibagħtu l-isem tal-VPN attiv mis-Settings u r-riżultati ta’ prepare, establish u protect mil-logs tiegħek, u fi ftit minuti tista’ tgħid liema pass falla. Imbagħad ivverifika b’traffiku reali: tfittxija ta’ isem, konnessjoni TCP u talba waħda mit-tunnel, mhux biss ikona konnessa. Deskrittur validu u indikatur aħdar jippruvaw il-pussess fl-aħjar każ, qatt li t-trasport baqa’ ħaj wara r-regoli tal-indirizzar.
Jekk l-erba’ verifiki kollha jgħaddu u t-traffiku xorta jmut, il-pussess mhuwiex iktar problema tiegħek. Mur għall-indirizzar u l-aċċessibbiltà tas-server, u ttestja l-istess kredenzjali minn tagħmir mingħajr app VPN installata.