Erba' suppożizzjonijiet dwar Android VpnService darba ħadulni ħafna minn ġimgħa, u l-ebda waħda ma kienet dwar il-protokoll tan-netwerk. L-app qalet konnessa, l-ikona taċ-ċavetta qagħdet fil-bar tal-istat, u t-traffiku xorta ħareġ mir-rotta normali. Jien komplejt nassumi li t-tunnel kien tiegħi sakemm inwaqqafu, li r-rotot li żidt kienu r-rotot li nġib, u li sejħa lil stopSelf kienet se tnizzel l-interface miegħu. Is-servizz kien qed iġib ruħu eżattament kif iddokumentat. Il-parti miksura kienet il-mudell mentali tiegħi.

Mitu 1: it-tunnel jibqa' wieqaf sakemm twaqqfu

Android iżomm interface VPN waħda kull darba. Waħħal oħra u l-pjattaforma ma tqegħdha fil-kju: tiddiżattiva tiegħek u ssejjaħ onRevoke() fuq is-servizz tiegħek. Jekk il-kodiċi tiegħek iġib kollox lura biss meta titbaxxa buttuna, teħid ta' kontroll iħalli warajh deskrittur u ħajt tal-qari, u l-bidu li jmiss jiret it-tnejn.

Ir-referenza tal-VpnService tgħid b'mod ċar li prepare() jirritorna null meta l-app diġà għandha l-kunsens, u Intent meta l-utent għad irid japprova. Dan il-kunsens jasal biss jekk twassal l-intenzjoni permezz ta' startActivityForResult(). Aqbeż il-konsenja u establish() jirritorna null, li jinqara bħala falliment sieket u mhux bħala problema ta' permess.

Always-on VPN iżid sid li int ma tikkontrollax. Is-sistema tista' ġġib it-tunnel lura wara boot jew wara crash, u tippreċedi app VPN li l-utent beda bl-idejn. Ibni onRevoke() biex jagħlaq l-istess riżorsi li jagħlaq l-għeluq normali tiegħek, u ttrattah bħala t-triq ewlenija tal-waqfien u mhux bħala każ rari. L-utenti jaqilbu l-applikazzjonijiet VPN; il-kodiċi tiegħek irid jissaportiha.

Mitu 2: addRoute jaqbad eżattament dak li elenkajt

Ir-rotot jiddeċiedu liema pakketti jaslu għand id-deskrittur tiegħek, u żball fil-firxa joħloq il-każ li jġennen fejn parti mit-traffiku tgħaddi mit-tunnel u parti le. addRoute("0.0.0.0", 0) jieħu l-IPv4 kollu, li jfisser li kull pakkett issa jasal għandek u jrid jiġi mgħoddi jew mitfugħ. /32 għal host wieħed wieħed kważi ma jieħu xejn, u kull ħaġa oħra tġib ruħha bħallikieku l-VPN tiegħek qatt ma ġie installat.

Il-familji jingħaddu b'mod separat. Rotta tal-IPv4 biss tħalli l-IPv6 fuq in-netwerk ta' taħt, għalhekk host b'żewġ stacks xorta jista' jsolvi u jikkonnettja barra mit-tunnel waqt li jidher perfettament konness ġewwa fih.

Id-DNS isegwi l-istess loġika. Is-servers miżjuda b'addDnsServer() imorru għall-applikazzjonijiet li jużaw is-solver tat-tunnel, filwaqt li app b'endpoint DNS encryptat tagħha jew Private DNS imqiegħed fuq isem host tinjorahom għal kollox. Meta l-ismijiet jonqsu għal app waħda u jaħdmu għal oħra, iċċekkja t-triq tas-solver qabel ma tmiss rotta waħda.

Mitu 3: ir-regoli kull app huma swiċċ li tista' ddawwar kull naħa

addDisallowedApplication() u addAllowedApplication() huma żewġ modi, mhux żewġ filtri. Il-builder jaċċetta mudell wieħed għal kull tunnel, għalhekk app li trid kollox ħlief tliet pakketti tuża l-lista pprojbita u tħalli l-lista permessa vojta. It-tnejn jeskludu lil xulxin, u n-nies jiskopru dan waqt ir-runtime wara li l-iskrin tas-settings diġà offra ż-żewġ toggles.

Il-viżibilità tal-pakketti tgiddem ukoll. Fuq Android 11 u wara tista' ssemmi biss pakketti li tara, għalhekk lista ta' esklużjoni mibnija minn query li l-app tiegħek mhix permessa tagħmel se taqbeż l-entries fis-skiet. Qabbel il-lista ma' dak li l-package manager fil-fatt jirritorna qabel ma tafdaha.

Il-profiles tax-xogħol jerġgħu jaqsmu l-udjenza. Tunnel mibdi fil-profil ikopri dak il-profil u l-applikazzjonijiet tiegħu, filwaqt li n-naħa personali żżomm il-konnettività tagħha. Dik hija deċiżjoni ta' firxa li tittieħed darba, u għandha tkun fl-interface u mhux f'ticket ta' appoġġ.

Mitu 4: stopSelf itemm it-tunnel

Le. L-interface tgħix fid-deskrittur li jirritorna establish(), u l-oġġett tas-servizz jista' jmut waqt li dak id-deskrittur jibqa' miftuħ. Agħlaq l-ewwel il-ParcelFileDescriptor, ħalli r-referenza, ingħaqad mal-ħjut tal-qari u tal-kitba jew interrompihom, imbagħad sejjaħ stopForeground(true) u stopSelf() f'dik l-ordni.

Deskrittur minsija huwa r-raġuni tas-soltu li servizz jidher li jgħix aktar mit-talba tiegħu stess biex jieqaf, u jispjega rotta skaduta li tgħix aktar mill-app li żiditha.

L-iżball oppost huwa daqstant komuni: tagħlaq id-deskrittur waqt li ħajt tal-qari jkun f'nofs il-qari, u mbagħad tħalli dak il-ħajt jimmaniġġja eċċezzjoni li ħadd ma kiteb għaliha. Żomm is-sekwenza tal-għeluq f'post wieħed u ħalli kemm l-azzjoni tal-utent kif ukoll onRevoke() isejħu fiha.

X'għandek tiċċekkja meta t-tunnel jidher mejjet

Ipproteġi s-sokits ta' ħajja twila b'protect() qabel ma jogħla t-tunnel. Mingħajrha, it-trasport tat-tunnel innifsu jiġi rrojtat lura fit-tunnel u l-konnessjoni toqgħod f'waqfa b'mod li jidher eżattament bħal ħsara tas-server. Ipprova kontra indirizz li jeżisti biss wara n-netwerk remot, mhux kontra sit pubbliku li jwieġeb mill-cache jew mit-triq ta' taħt.

Irreġistra r-riżultat ta' establish(), ir-rotot, il-pakketti esklużi u r-raġuni tal-għeluq. Dawk l-erba' linji jifirdu problema ta' kunsens minn problema ta' firxa u minn problema ta' ċiklu tal-ħajja mingħajr ma taqbad il-pakketti.

Artikli relatati