Il-verifika li ħafna mill-apps Android jużaw biex jiskopru VPN hija isem ta' interface, u qatt ma kienet verifika tal-VPN. Tirrapporta li jeżisti xi interface b'string li l-iżviluppatur kien qed jistenna, li fuq apparat wieħed ifisser OpenVPN u fuq ieħor ifisser xi ħaġa kompletament mhux relatata. Ping huwa l-istess tip ta' prova: jipprova li destinazzjoni waħda wieġbet, mhux li tunnel ġarr il-pakkett. Dak li l-pjattaforma fil-fatt tesponi huwa sett ta' networks u t-trasporti li kull wieħed jiddikjara, u dik hija domanda oħra b'tweġiba oħra.

Mitu: jekk jeżisti tun0, VPN hija attiva

L-apps tal-VPN għal Android huma implimentazzjonijiet ta' VpnService li jgħaddu lill-sistema deskrittur tal-fajl tun. L-isem tal-interface jiġi minn min ħoloqha: OpenVPN normalment jipproduċi tun0, PPTP u L2TP jipproduċu ppp0, WireGuard isemmi l-interface tiegħu għat-tunnel, u tunnel IPsec jista' ma jippreżentax isem konvenzjonali xejn. Għalhekk il-qari ta' /proc/net/dev jew l-enumerazzjoni ta' oġġetti NetworkInterface tfittex konvenzjoni, mhux fatt.

Iż-żewġ direzzjonijiet tal-iżball huma ħajjin. Apparat jista' jkollu tun0 għal tunnel lokali li m'għandux x'jaqsam mal-VPN tal-utent, u tunnel WireGuard perfettament f'saħħtu jista' jkun inviżibbli għal verifika li taf biss l-string tun0. Pożittivi foloz u negattivi foloz fl-istess funzjoni jagħmluha mhux użabbli bħala dijanjosi, għax biljett ta' appoġġ li jgħid «l-ebda VPN ma nstab» ma jistax jiġi fdat fl-ebda direzzjoni.

L-aċċess ukoll iddejjaq. Il-verżjonijiet aktar ġodda ta' Android jillimitaw x'jista' jaqra app ordinarja minn /proc, għalhekk verifika bbażata fuq l-isem li ħadmet fuq Android 8 tista' tirritorna lista vojta fuq apparat aktar tard mingħajr ebda bidla fil-kodiċi. Meta l-verifika tonqos bil-kwiet lejn in-naħa miftuħa, l-app tikkonkludi li m'hemmx VPN fuq ħardwer fejn it-tunnel huwa sew.

Mitu: ping b'suċċess ifisser li t-tunnel qed iġorr traffiku

Ping lejn host intern jirnexxi kull meta teżisti rotta lejn dak il-host. B'tunnel maqsum, il-host jista' jkun aċċessibbli permezz tal-Wi-Fi waqt li t-tunnel huwa attiv u qed jagħmel xi ħaġa kompletament oħra. B'VPN għal kull app, l-app li tagħmel il-ping tista' tkun eskluża mit-tunnel, għalhekk l-eko ICMP joħroġ barra minnu u jerġa' lura, li jipprova l-oppost ta' dak li tassumi l-verifika.

ICMP u TCP huma wkoll iffiltrati separatament. Tunnel li jippermetti talbiet ta' eko iżda jwarrab il-port TCP li servizz jeħtieġ se jgħaddi t-test tal-ping u jonqos fl-app, u dik hija regola tal-firewall fuq in-naħa l-oħra, mhux proprjetà tal-apparat. L-unika qari onest ta' ping b'suċċess huwa li din id-destinazzjoni wieġbet dan il-protokoll f'dan il-mument.

X'jirrapporta fil-fatt il-pjattaforma

Mill-API 21 'l quddiem, ConnectivityManager.getAllNetworks() tirritorna kull network li s-sistema taf bih, u getNetworkCapabilities(network) tirrapporta x'jiddikjara dak in-network. Network tal-VPN iġorr TRANSPORT_VPN. Iċ-ċirkulazzjoni fuq in-networks kollha twieġeb domanda waħda: xi VPN hija bħalissa attiva fuq dan l-apparat?

It-tieni domanda, iktar dejqa teħtieġ sejħa oħra. getActiveNetwork() tirritorna n-network li t-traffiku tal-app juża bħalissa, u l-verifika tal-istess kapaċità fuqu twieġeb: it-traffiku tiegħi jgħaddi minn VPN? It-tnejn jistgħu ma jaqblux, u dan in-nuqqas ta' qbil huwa informattiv. VPN li hija attiva iżda mhux kurrenti tindika routing għal kull app jew konfigurazzjoni ta' tunnel maqsum, mhux tunnel nieqes.

Network active = cm.getActiveNetwork();
NetworkCapabilities caps = cm.getNetworkCapabilities(active);
boolean viaVpn = caps != null
    && caps.hasTransport(NetworkCapabilities.TRANSPORT_VPN);

Ipproteġi ż-żewġ sejħiet. Il-kapaċitajiet jistgħu jkunu null għal network li sparixxa bejn l-elendar u l-mistoqsija, u n-network attiv jista' jkun null waqt trasferiment. NET_CAPABILITY_NOT_VPN hija utli fid-direzzjoni l-oħra, biex tikkonferma li network żgur mhuwiex tunnel minflok ma jonqoslu biss il-bandiera tat-trasport tal-VPN.

NetworkInfo kien l-istess mitu b'API

ConnectivityManager.TYPE_VPN ma' NetworkInfo hija t-tieni ġenerazzjoni ta' din il-verifika, u hija skaduta għal raġuni. Fil-verżjonijiet moderni l-oġġett irritornat għal VPN jista' jkun null waqt li t-tunnel huwa konness, għalhekk il-kodiċi li jittratta null bħala «l-ebda VPN» jirrapporta bil-kwiet negattiv falz fuq l-apparati fejn it-tweġiba hija l-aktar importanti.

Ix-xandira li normalment takkumpanjaha mhijiex aħjar. CONNECTIVITY_CHANGE għandha storja dokumentata li taqbeż tranżizzjonijiet tal-VPN, inkluż builds fejn kienet tiskatta biss meta VPN tikkonnettja jew tiskonnettja minflok f'kull bidla tan-network. Xandara mibnija fuqha tipproduċi varjabbli tal-istat li jitbiegħed mill-veduta tal-pjattaforma sal-konnessjoni mill-ġdid sħiħa li jmiss.

Irreaġixxi għall-callbacks minflok ma tistħarreġ

Irreġistra NetworkRequest li tirrikjedi TRANSPORT_VPN u tneħħi NET_CAPABILITY_NOT_VPN, imbagħad sejjaħ registerNetworkCallback b'dik it-talba. Imbagħad onAvailable u onLost jgħidulek meta tinbidel id-dikjarazzjoni, u dak huwa l-avveniment li verament jinteressak. Iddereġistra l-callback meta l-komponent jieqaf, inkella l-app iżżomm referenza għal skrin mejjet u l-callback jibqa' jiskatta.

NetworkRequest req = new NetworkRequest.Builder()
    .addTransportType(NetworkCapabilities.TRANSPORT_VPN)
    .removeCapability(NetworkCapabilities.NET_CAPABILITY_NOT_VPN)
    .build();
cm.registerNetworkCallback(req, callback);

Dan jeħtieġ ACCESS_NETWORK_STATE, li hija permess normali: l-ebda root, l-ebda dialog ta' kunsens tal-utent, l-ebda permess tal-VPN. L-istħarriġ b'timer hija l-alternattiva li n-nies jaqgħu lura għaliha, u taħraq il-batterija filwaqt li xorta taqbeż tranżizzjoni iqsar mill-intervall, u dik hija eżatt it-tranżizzjoni li jirrapporta utent.

X'għadha ma tistax tgħidlek it-tweġiba

L-ebda waħda minn dawn l-API ma tirrapporta jekk it-tunnel huwiex f'saħħtu, fuq liema server jintemm, jew jekk it-traffiku ta' app partikolari huwiex ġewwa fih. Network tal-VPN jista' jeżisti mingħajr rotot użabbli, u tunnel għal kull app jista' jeskludi l-app li qed tagħmel id-domanda.

Għalhekk irreġistra dak li rat il-verifika, mhux biss il-boolean. Irreġistra l-identifikatur tan-network, it-trasporti ddikjarati u jekk dak in-network kienx attiv. Rapport li jgħid «l-ebda VPN ma nstab» huwa inużabbli, filwaqt li wieħed li jgħid li network iddikjara TRANSPORT_VPN iżda getActiveNetwork() irritornat Wi-Fi jindika direttament lejn ir-routing jew lejn lista ta' esklużjoni, u dik hija korrezzjoni li xi ħadd jista' jaħdem fuqha.

Artikli relatati