Sababta Android VpnService uu qabto qayb ka mid ah traafiga oo aan dhammaan ahayn
Wadooyinka, gelitaannada DNS iyo baaxadda app kastaa waxay go'aansadaan kee baakadaha gaaraya aaladda tun, sababta aaladaha maxalliga ah u lumaan iyo waxa dhisaha diiday.
Waxba ku jira VpnService ma qabto traafiga kelidiis. Waxay nidaamka ka codsataa interface tun, waxay interface-kaas siisaa tiro cinwaanno iyo wadooyin, iyo daqiiqadaas ka dib kernel-ku wuxuu koobiyaa baakad kasta oo u dhigma wadooyinkaas gelin fayl oo app-ku akhriyi karo. Koodhka app-ku weligiis ma arko baakadaha aan wadooyinku dooran, sidaas darteed baaxadda tunnel-ku waa su'aal miis marrin ka hor inta aanay noqon su'aal barnaamij. Taasi waa sababta isla hirgelinta adeegga ay ku liqin karto qulqul kasta hal telefoon oo ay ku qaadan karto qayb kale, iyo taasi waa sababta ku darista waddo ay mararka qaarkood hagaajiso tunnel u muuqday mid jaban. Waxa aad heshaa waa waxa aad ku dhawaaqday, laga jaray wax kasta oo dhisaha si aamusnaan ah u diiday.
Wadooyinku waxay go'aansadaan kee baakadaha yimaadaan
Builder.addRoute(prefix, prefixLength) waxay ku rakibtaa prefix miiska marrinta shabakadda VPN. Nidaamku wuxuu u qaataa shabakadaas mid caadi ah app-yada baaxadda ku jira, sidaas darteed gelitaannadeeda waxaa la eegaa ka hor waddada caadiga ah ee shabakadda jirka, prefix u dhiganna wuu ku filan yahay in qulqulka leexiyo. Sidaas darteed waddo loogu talagalay 0.0.0.0/0 waxay qaadataa IPv4 dhammaan, oo ay ku jiraan daabacaha, bartilmaameedka cast iyo bogga maamulka router-ka.
Macmiillaha raba daboolkaas iyagoon tirtirin gelitaanka caadiga ah ee jirka waxay beddelkeeda isticmaalaan lammaanaha 0.0.0.0/1 iyo 128.0.0.0/1. Laba waddo oo gaar ah ayaa ka adkaata waddo caadi ah, si wadajir ah waxay daboolaan dhammaan booska cinwaanka, gelitaanka caadiga ah ee telefoonka laftiisuna wuxuu ku sii jiraa miiska soketada weli ku xidhan shabakadda jirka.
Cinwaannada iyo gelitaannada DNS waxay ka yimaadaan isla dhisaha oo waxay ka jawaabaan su'aal kale. addAddress waxay interface-ka siisaa cinwaan leh dherer prefix, addDnsServer waxay rakibtaa xalliyaha app-yada baaxadda ku jira ay interface-ka ku waydiin doonaan. Labada qoysba waxay fadhiisan karaan hal interface, sidaas darteed qayb waddooyin IPv4 kaliya oo ag taal cinwaan IPv6 waa habayn si sax ah loo akhriyo oo haddana daadanaya. Haddii aad marrin qoys aan interface-ku cinwaan ku lahayn, kernel-ku ma laha cinwaan isha baakadahaas oo weligood kama soo muuqdaan gelinka.
Waxa establish() soo celiso
establish() wuxuu soo celiyaa ParcelFileDescriptor, ama null marka app-ku aan la fasixin. null waa xaalad ogolaansho oo aan ahayn khalad shabakadeed: VpnService.prepare() waa inuu horey null soo celiyey, ama isticmaalaha waa inuu ka hor codsiga ansixiyey wada-hadalka nidaamka. Ogolaanshaha waa laga noqon karaa inta adeeggu socdo, interface-kuna wuxuu kaa xirmaa cagahaaga hoostooda isagoon lahayn wax yeeritaan dib u noqosho ah oo galo wareegaaga akhriska.
Gelinku ma xannibo ilaa aad si kale tidhaahdo, sidaas darteed akhrisku isla markiiba soo noqdaa isagoon xog lahayn halkii uu thread-ka hakiyo. Wareeg loo qoray soket xanniba wuxuu gubtaa hal core, wareegna u qaata akhris madhan mid dilaa wuxuu jeexjeexaa tunnel-ka hal ilbiriqsi oo shaqo la'aan ah. Builder.setBlocking(true) wuxuu beddelaa dhaqankaas, qiimahuna waa thread ku sugaya gudaha akhriska.
Doodaha waddada iyo cinwaanka waxaa loo ansixiyaa sidii qiyamka LinkAddress, bartilmaameedyada multicast sida 224.0.0.0/4 si toos ah ayaa loo diidaa. Interface tun dhan ka dhan ma laha domain baahin sidoo kale, sidaas darteed helista multicast iyada oo loo marayo waxay u baahan tahay naqshad kale halkii waddo kale. Liiska la hubinayo VpnService.Builder ayaa ah, ka hor inta aadan go'aan ka gaarin in yeerid la iska indhatiray.
Baaxadda app kastaa waxay cidhiidhisaa qaybta, ma aha tunnel-ka
Laga bilaabo API 21 dhisahu wuxuu aqbalaa addAllowedApplication iyo addDisallowedApplication, labada liisna way iska reebaan hal dhiso gudihiis. Liiska fasaxa wuxuu tunnel-ka u noqdaa mid jira baakadahaas halka wax kasta oo kale uu hayo shabakadda jirka; liiska mamnuuca wuxuu qabtaa wax kasta oo aan ahayn baakadaha la magacaabay, taas oo macmiilku u soo bandhigo tunnel kala go'an. Ka hor API 21 ma jiro hab nidaam oo habboon, dhaqanka app kastaana wuxuu ka yimid macmiillo dhinac saddexaad ah oo ku shaandheeya UID gudaha gudbiyehooda. Farqigaani waa muhiim marka la khalad-baadhayo, sababtoo ah tunnel app kasta oo leh liis fasax hal baakad ah almost ma soo saaro traafig oo taasi waa dhaqan sax ah, ma aha waddo jaban.
Baaxad kasta ha noqotee, soketka app-kaagu u furo server-ka VPN waa inuusan marinin tunnel-ka uu dhisayo. VpnService.protect(socket) wuxuu soketkaas ku xidhaa shabakadda hoose si baakadihiisu u gudbaan aaladda tun. Haddii aad seegto yeeridda, gacan-qabsiga waxaa liqaa interface-kii ay ahayd inuu kaco.
VpnService.setUnderlyingNetworks wuxuu xidhaa wareegga isagoo nidaamka u sheegaya shabakadda jirka ee qaadda tunnel-ka. Qiimaas wuxuu go'aamiyaa sida VPN-ku u soo sheego isku-xirka app-yada kale, qiimo null ama duugoobayna waa sabab caadi ah tunnel isku-xiran oo telefoonka intiisa kale u arko mid offline ah. Cusboonaysii marka shabakadda hoose ay isbeddesho, ma aha oo kaliya bilowga.
Isku-darka hubinta iyo MTU: halka waddo sax ah ay haddana ku guuldareysto
Marka baakadahu yimaadaan, laba faahfaahin heerka baakadka ayaa go'aamiya in wax u shaqeeyo min dhinac ilaa dhinac. Midka koowaad waa cinwaanka isha: cinwaanno interface oo badan awgood kernel-ku wuxuu diri karaa baakado qaada kan koowaad, sidaas darteed gudbiye dib u qoraaya madaxyada waa inuu hagaajiyaa cinwaanka iyo isku-darka hubinta ee daboolaya.
Midka labaad waa baaxadda isku-darka hubinta. Marka app-ku isagu dhiso baakadaha TCP ama UDP, isku-darka hubintu wuxuu daboolaa madax been abuur ah oo hayo cinwaanka isha, cinwaanka bartilmaameedka, lambarka borotokoolka iyo dhererka gudbinta, mid kasta oo ka mid ah ka tagistuna waxay siinaysaa baakado yimaada oo la tuuro. Guuldareystaas waxay u egtahay waqti-dhaaf ka dib jawaab aan waligeed iman, taas oo dadka badankood u celisa wadooyinka. setMtu wuxuu go'aamiyaa MTU-ga interface-ka, akhris kastana wuxuu soo celiyaa si sax ah hal baakad IP oo buuxa, sidaas darteed buffer loo qoray qulqul byte ah wuxuu kala jajabin doonaa falanqayntaada, ma aha baakadka.
Wareeg xaqiijin oo kala sooca lakabyada
Si aad u ogaato halka baaxaddu qaldantay, tijaabi lakabyada si kala-horiya ah. Weydii aaladda wadooyinka ay shabakadda VPN dhab ahaan haysato, ka dib hubi in qulqulka cinwaan la yaqaan uu u muuqdo akhris gelinka, ka dib hubi in baakadka uu gudbiyahaagu diro uu si fiican u qaabaysan yahay. Dhibaato waddo ma muujiso wax gelinka, halka dhibaato isku-darka hubintu ay muujiso baakad yimaada oo lumo.
Haddii wax gelinka aan gaarin, tuhmadu waa qaybta wadooyinka ee ma aha akhriyaha: xaqiiji prefix-yada, xaqiiji in cinwaan ku jiro isla qoyska, oo xaqiiji in app-ku ku jiro baaxadda aad dejisay. Haddii baakadahu gaaraan gelinka laakiin wax soo noqon, ka hor inta aadan mar kale taaban waddo hubi protect() iyo qiimaha shabakadda hoose. Haddii dhinaca fog soo sheego baakado qalloocan, isku-darka hubinta iyo MTU waa meelaha la eegayo. Hal baaritaan lakab kasta wuxuu keydiyaa galab qiyaas ah.