Tunnel maqsum f'Android VpnService: x'inhu li tista' tittermina tassew
VpnService jgħaddi biss il-pakketti li l-builder iqiegħed fid-deskrittur tiegħu. Iċċekkja l-prefissi, l-awtentikazzjoni tal-proxy, id-DNS u l-listi tal-apps qabel ma tagħti l-ħtija lit-tunnel maqsum.
It-tunnel maqsum f'app VpnService jinqasam f'xi postijiet speċifiċi, u t-tiswija hija differenti għal kull wieħed. Il-klijent juri biss destinazzjoni waħda li tfalli, għalhekk l-ewwel xogħol huwa li tiskopri liema fruntiera qed tolqot: ir-rotot li rċieva l-builder, il-proxy li ma tistax tawtentikaha, ir-resolver li biss ħabbart, jew il-lista tal-apps li l-pjattaforma tapplika għal kull utent. Għalhekk inżomm verifika f'erba' passi. Taħdem fl-ordni t'hawn taħt u tieqaf fl-ewwel falliment.
Ikkonferma x'informa l-builder lill-pjattaforma
VpnService.Builder hija lista ta' dikjarazzjonijiet. establish() tirritorna ParcelFileDescriptor għal interface virtwali, u l-pjattaforma tibgħat biss it-traffiku li jaqbel mal-prefissi ta' addAddress u addRoute f'dak id-deskrittur; addDnsServer tgħid lill-klijenti liema resolver għandhom jistaqsu. Destinazzjoni barra mill-prefissi kollha li żidt qatt ma tasal għall-app tiegħek, tkun xi tkun il-wegħda tal-interface. Dan il-fatt wieħed jispjega ħafna mir-rapporti dwar tunnel maqsum miksur qabel ma jinbidel il-kodiċi.
Irreġistra l-listi tal-indirizzi, rotot u DNS li ġabret il-builder tiegħek, imbagħad qabbelhom mad-destinazzjonijiet li jfallu. /32 nieqes għal host ta' ġestjoni huwa ħafna aktar komuni minn tunnel miksur. Jekk il-lista hija tajba, kompli; jekk hija ħażina, il-bqija tal-lista hija xogħol fix-xejn.
excludeRoute teżisti biss mill-API 33
L-esklużjoni bbażata fuq id-destinazzjoni hija t-talba li l-aktar spiss issir ħajta ta' appoġġ. builder.excludeRoute(IpPrefix) waslet fl-API 33; qabel dan, l-unika approssimazzjoni appoġġata hija li żżid rotot għal kull ħaġa ħlief il-prefiss eskluż, li jfisser li trid tikkalkula l-prefissi komplementari int stess. Iż-żewġ sejħiet mhumiex immaġini mera: waħda tnaqqas mis-sett ta' rotot tal-interface, l-oħra tibni s-sett minn żero, u apparat eqdem se jitfa' jew jinjora bil-kwiet sejħa li ma jafx biha. Ixxejjen skont Build.VERSION.SDK_INT u ttestja ż-żewġ toroq fuq ħardwer reali.
Meta tikkalkula komplementi, oqgħod attent għall-allinjament tal-prefissi. Esklużjoni /24 ġewwa rotta /16 tirrikjedi l-prefissi li jkopru li tassew jiddeskrivu l-bqija, mhux /8 wieħed iffurmat ħażin. Irreġistra l-lista finali u vverifika li l-host eskluż għadu jiġi riżolt permezz ta' triq barra t-tunnel.
Il-kredenzjali tal-proxy ma jistgħux jiġu espressi
setHttpProxy(ProxyInfo) iddawwar l-interface lejn proxy HTTP jew SOCKS, u URL PAC tista' tagħżel bejniethom għal kull destinazzjoni. La ProxyInfo u lanqas il-format PAC ma jġorru isem tal-utent u password, għalhekk proxy li jirrikjedi awtentikazzjoni jibqa' barra mill-API tal-pjattaforma. L-apps li jeħtiġuha normalment jinkorporaw stack tal-ispazju tal-utent, tun2socks jew magna simili, u jwieġbu huma stess għall-isfida 407.
Dan l-għażla għandha konsegwenzi. Stack tal-ispazju tal-utent jara biss it-traffiku li ddawwar lejh, għalhekk irid jgħix fi ħdan l-istess fruntiera tad-deskrittur, u jiret l-istess rekwiżit protect() għas-socket uplink tiegħu stess. Ħalli barra protect() u t-tunnel jaqbad it-trasport tiegħu stess, li jidher bħala handshake li jieqaf wara l-ewwel pakkett. Ittestja kontra proxy li titlob kredenzjali, għax proxy miftuħa tgħaddi fit-triq tal-pjattaforma u ma tipprova xejn.
Il-listi għal kull app u d-DNS huma wkoll dikjarazzjonijiet
Il-Builder għandu kemm addAllowedApplication kif ukoll addDisallowedApplication, u huma jeskludu lil xulxin: is-sejħa tat-tnejn tarmi eċċezzjoni. Fi kwalunkwe każ il-lista tiġi applikata għal kull utent waqt it-twaqqif tal-interface, għalhekk app tal-profil tax-xogħol hija rregolata mit-tunnel tal-profil tax-xogħol u mhux tiegħek. Dak li l-ebda API ma jagħti huwa kontroll fuq id-deċiżjoni ta' app oħra: ma tistax tkeċċi pakkett fit-tunnel tiegħek minn barra, u ma tistax tagħlaq jew tikkonfigura mill-ġdid VPN li diġà hija attiva.
Id-DNS isegwi l-istess mudell. addDnsServer tħabbar indirizz ta' resolver; ma tħallix lill-app tiegħek twieġeb mistoqsijiet. Jekk trid issolvi ismijiet int stess, ħaddem resolver u dawwar l-indirizz tiegħu fit-tunnel. L-apps li jużaw DoT jew DoH lejn isem ta' host fiss jistgħu jaqbżu l-indirizz li ħabbart, għalhekk ittratta s-soluzzjoni tal-ismijiet bħala l-aħjar sforz sakemm ma tinterċettax ukoll it-triq tal-mistoqsija.
Manifest, always-on u t-test tal-erba' passi
L-eliġibilità tiġi dikjarata fil-manifest: BIND_VPN_SERVICE, il-filter tal-intent android.net.VpnService u servizz foreground jekk it-tunnel irid jibqa' ħaj fl-isfond. Always-on VPN tirrikjedi wkoll onRevoke nadif, għax is-sistema ssejħilha meta l-utent ibiddel is-settings jew app oħra tieħu l-kontroll.
Mexxi l-verifiki fl-ordni u ieqaf fl-ewwel falliment. L-ewwel, neħħi l-listi tal-indirizzi, rotot u DNS li ngħataw lill-builder. It-tieni, ikkonferma li establish() irritornat deskrittur u li s-socket tat-trasport hija protetta. It-tielet, itlob destinazzjoni waħda ġewwa prefiss inkluż u oħra ġewwa prefiss eskluż. Ir-raba', iċċekkja liema resolver wieġeb tassew billi tistaqsi isem ta' host li jista' jissolva biss ir-resolver tiegħek.
Handshake komplut ma jipprova l-ebda pass sussegwenti. Kull verifika tiżola saff wieħed, għalhekk suċċess fit-tieni pass ma jgħid xejn dwar ir-raba'.
Ir-referenza ta' VpnService.Builder telenka l-wiċċ kollu tal-builder. Kull ma għandek bżonn lil hinn minnu huwa API ieħor, app oħra jew l-istack tal-ispazju tal-utent tiegħek, u dik hija deċiżjoni tad-disinn, mhux bug tat-tunnel maqsum.