Ogaanshaha VPN ee Android: sababta tun0 iyo ping ay marin-habowshay
Magaca interface waa caado; ping wuxuu caddeeyaa in hal host la gaari karo. Weydii NetworkCapabilities waxa shabakaddu sheegto, ka dib uga jawaab callbacks-ka.
Hubinta ay inta badan apps-ka Android isticmaalaan si ay u ogaadaan VPN waa magac interface, waligana ma ahayn hubin VPN. Waxay soo sheegtaa in interface uu jiro oo leh xargaha uu horumariyuhu filayay, taas oo hal aalad ka micno OpenVPN iyo mid kale ka micno wax aan gebi ahaanba xiriir la lahayn. ping waa isla nooca caddaynta: waxay caddeynaysaa in hal meel oo loo socdo jawaab bixisay, ma aha in tunnel-ku baakadda qaaday. Waxa platformadu dhab ahaan soo bandhigto waa urur shabakado ah iyo gaadiidka mid kastaa sheegto, taasna waa su'aal kale oo jawaab kale leh.
Halyeey: haddii tun0 jiro, VPN waa shaqeynayaa
Apps-ka VPN ee Android waa hirgelinta VpnService oo nidaamka siiya sharraxa faylka tun. Magaca interface-ka wuxuu ka yimaadaa kii abuuray: OpenVPN wuxuu badanaa soo saaraa tun0, PPTP iyo L2TP waxay soo saaraan ppp0, WireGuard wuxuu interface-kiisa u magacaabaa tunnel-ka, tunnel IPsec-na waxaa laga yaabaa inuusan gebi ahaanba magac caadi ah soo bandhigin. Sidaas darteed akhrinta /proc/net/dev ama tirinidda walxaha NetworkInterface waxay raadinaysaa caado, ma aha xaqiiqo.
Laba jihada khaladka ah way nool yihiin. Aaladdu waxay yeelan kartaa tun0 tunnel maxalli ah oo aan wax xiriir ah la lahayn VPN-ga isticmaalaha, tunnel WireGuard si buuxda caafimaad qaba-na wuxuu noqon karaa mid aan la arkin hubin keliya xargaha tun0 yaqaan. Natiijooyinka qalad ah ee togan iyo kuwa qalad ah ee taban ee isla shaqeynaya waxay ka dhigaan mid aan faa'iido lahayn sida baaritaan, sababtoo ah tikit taageero oo sheegaya «VPN lama helin» lagama kalsoonaan karo jihada kasta.
Helitaankuna sidoo kale way cidhiidhi noqotay. Noocyada cusub ee Android waxay xaddidaan waxa app caadi ah ka akhriyi karo /proc, sidaas darteed hubin ku saleysan magac oo ka shaqeysay Android 8 waxay ku soo celin kartaa liis madhan aalad dambe iyada oo aan wax isbeddel kood ah lahayn. Marka hubintu si aamusan ugu guuldareysato dhinaca furan, app-ku wuxuu soo gabagabeynayaa in aan VPN ku jirin qalabka tunnel-ku ku fiican yahay.
Halyeey: ping guuleystay macnaheedu waa tunnel-ku wuxuu qaadayaa taraafikada
ping loo diro host gudaha wuu guuleystaa mar kasta oo jid loo maro host-kaas. Tunnellada qaybsan, host-ku wuxuu noqon karaa mid laga gaari karo Wi-Fi inta tunnel-ku shaqeynayo oo uu sameynayo wax kale gebi ahaanba. VPN app kasta, app-ka ping sameynaya waxaa laga yaabaa in laga reebay tunnel-ka, sidaas darteed dhawaaqa ICMP wuxuu ka baxaa dibaddiisa oo soo noqdaa, taas oo caddeynaysaa lidka waxa hubintu u malaynayso.
ICMP iyo TCP sidoo kale si gooni ah ayaa loo shaandheeyaa. Tunnel ogolaada codsiyada dhawaaqa laakiin tuuraya dekedda TCP ee adeeg u baahan yahay wuxuu gudbi doonaa imtixaanka ping oo ku guuldareystaa app-ka, taasna waa qaanuun firewall dhinaca kale ah ma aha sifo aaladda. Akhrinta kaliya ee daacad ah ee ping guuleystay waa in meeshan loo socdo ay ka jawaabtay borotokoolkan waqtigan.
Waxa platformadu dhab ahaan soo sheegto
Laga bilaabo API 21, ConnectivityManager.getAllNetworks() waxay soo celisaa shabakad kasta oo nidaamku yaqaan, getNetworkCapabilities(network)-na waxay soo sheegtaa waxa shabakaddaas sheegto. Shabakad VPN waxay qaaddaa TRANSPORT_VPN. Dhex-marista dhammaan shabakadaha waxay ka jawaabtaa hal su'aal: ma jiraa VPN firfircoon aaladdan hadda?
Su'aasha labaad, oo cidhiidhi ah, waxay u baahan tahay wicid kale. getActiveNetwork() waxay soo celisaa shabakadda taraafikada app-ku hadda isticmaali lahaa, hubinta isla awooddaasna waxay ka jawaabtaa: taraafikadayda ma marayaa VPN? Labaduba way is khilaafi karaan, khilaafkaasna waa macluumaad. VPN shaqeynaya laakiin aan ahayn kan hadda jira waxay tilmaamaysaa jihaynta app kasta ama habaynta tunnel qaybsan, ma aha tunnel maqan.
Network active = cm.getActiveNetwork();
NetworkCapabilities caps = cm.getNetworkCapabilities(active);
boolean viaVpn = caps != null
&& caps.hasTransport(NetworkCapabilities.TRANSPORT_VPN);
Ilaali labada wicid. Awooduhu waxay noqon karaan null shabakad ku lumay inta u dhaxaysa liisidda iyo weydiinta, shabakadda firfircoonna waxay noqon kartaa null inta wareejinta. NET_CAPABILITY_NOT_VPN waxay faa'iido u leedahay jihada kale, si loo xaqiijiyo in shabakad si hubaal ah aanay tunnel ahayn halkii ay kaliya ka maqnayd calanka gaadiidka VPN.
NetworkInfo wuxuu ahaa isla halyeeyga API la socda
ConnectivityManager.TYPE_VPN oo NetworkInfo la socda waa jiilka labaad ee hubintan, waxaana loo duugoobay sabab. Noocyada casriga ah shayga loo soo celiyo VPN wuxuu noqon karaa null inta tunnel-ku xiran yahay, sidaas darteed koodka null u qaata «VPN ma jiro» si aamusan ayuu u soo sheegaa natiijo taban oo qalad ah aaladaha jawaabtu ugu muhiimsan tahay.
Waxyaabaha la socda ee badanaa la socda sidoo kale ma wanaagsana. CONNECTIVITY_CHANGE waxay leedahay taariikh diiwaan gashan oo ku saabsan seegidda kala-guurka VPN, oo ay ku jiraan noocyo uu kici jiray kaliya marka VPN xirmo ama go'o halkii uu ka kici lahaa isbeddel kasta oo shabakadeed. Dhageyste ku dhisan waxay soo saartaa doorsoome xaaladeed oo ka fogaada aragtida platformada ilaa isku-xirka buuxa ee xiga.
Uga jawaab callbacks-ka halkii aad baaritaan samayn lahayd
Diiwaangeli NetworkRequest oo u baahan TRANSPORT_VPN oo ka saaraya NET_CAPABILITY_NOT_VPN, ka dib wac registerNetworkCallback codsigaas. Markaas onAvailable iyo onLost waxay kuu sheegayaan goorta sheegashadu isbeddelo, taasna waa dhacdada aad dhab ahaan danaynayso. Ka saar diiwaangelinta callback-ka marka qaybtu joogsato, haddii kale app-ku wuxuu hayaa tixraac shaashad dhintay oo callback-ku wuu sii socdaa.
NetworkRequest req = new NetworkRequest.Builder()
.addTransportType(NetworkCapabilities.TRANSPORT_VPN)
.removeCapability(NetworkCapabilities.NET_CAPABILITY_NOT_VPN)
.build();
cm.registerNetworkCallback(req, callback);
Tani waxay u baahan tahay ACCESS_NETWORK_STATE, oo ah ogolaansho caadi ah: root ma jiro, wada-hadalka ogolaanshaha isticmaalaha ma jiro, ogolaanshaha VPN ma jiro. Baaritaanka timer-ka ah waa beddelka dadku ku noqdaan, wuxuuna gubaa batteriga isagoo wali seegaya kala-guur ka gaaban inta u dhaxaysa, taasna waa kala-guurka isticmaaluhu soo sheegto.
Waxa jawaabtu weli aanay kuu sheegi karin
Midkoodna API-yadan ma soo sheego in tunnel-ku caafimaad qabo, server kee uu ku dhammaado, ama taraafikada app gaar ah uu gudaha ku jiro. Shabakad VPN waxay jiri kartaa iyada oo aan lahayn waddooyin la isticmaali karo, tunnel app kastana wuxuu ka reebi karaa app-ka su'aasha weydiinaya.
Sidaas darteed diiwaangeli waxa hubintu aragtay, ma aha oo kaliya boolean. Diiwaangeli aqoonsiga shabakadda, gaadiidka la sheegay iyo in shabakaddaas firfircoonayd. Warbixin sheegta «VPN lama helin» waa mid aan faa'iido lahayn, halka mid sheegta in shabakad sheegtay TRANSPORT_VPN laakiin getActiveNetwork() soo celisay Wi-Fi ay si toos ah u tilmaamayso jihaynta ama liiska ka-reebista, taasna waa sixid qof ku shaqeyn karo.