Sababta tunnel-kaaga Android VpnService uu u joojiyo marin-hagidda taraafikada
Afar aaminaad oo ku saabsan VpnService oo ku burbura wax-soo-saarka: hal tunnel mar, baaxadda dariiqyada, liisaska app kasta iyo nidaamka xidhitaanka, iyo hubin mid kasta.
Afar mala-awaal oo ku saabsan Android VpnService ayaa mar iiga qaatay inta badan usbuuc, midkoodna ma ahayn borotokoolka shabakadda. App-ku wuxuu sheegay in la xidhiidhay, calaamadda furaha waxay fadhiisatay bar-taagan, taraafikaduna wali waxay ka baxaysay dariiqa caadiga ah. Waxaan sii qaatay in tunnel-ku kayga yahay ilaa aan joojiyo, in dariiqyada aan ku daro ay yihiin dariiqyada aan helo, iyo in wicitaanka stopSelf uu la sii dego interface-ka. Adeeggu wuxuu u dhaqmay si sax ah sidii loo diiwaangeliyay. Qaybta jabtay waxay ahayd moodelkayga maskaxda.
Khallad 1: tunnel-ku wuu sii socdaa ilaa aad joojiso
Android waxay haysataa hal interface VPN mar. Dhis mid labaad oo platform-du ma dhigto saf: waxay damisaa kaaga oo waxay onRevoke() ku wacdaa adeeggaaga. Haddii koodhkaagu kaliya ku dumiyo riixista badhan, qabashadu waxay ka tagtaa descriptor iyo dunta akhriska, bilowga xigana wuu dhaxlaa labadaba.
Tixraaca VpnService wuxuu si cad u sheegaa in prepare() uu soo celiyo null marka app-ku hore u haysto ogolaansho, iyo Intent marka isticmaalaha ay tahay inuu wali ansixiyo. Ogolaanshahaas waxa uun yimaada haddii aad u gudbiso ujeeddada iyada oo loo marayo startActivityForResult(). Ka bood gudbinta oo establish() wuxuu soo celinayaa null, taas oo loo akhriyo sidii guuldarro aamusan halkii ay ka ahaan lahayd mushkilad ogolaansho.
Always-on VPN waxay ku darsataa mulkiile aadan kontorolin. Nidaamku wuu soo celin karaa tunnel-ka ka dib boot ama ka dib shil, wuxuuna ka hor maraa app VPN oo isticmaalaha gacantiisa ku bilaabay. U dhis onRevoke() si uu u xidho isla kheyraadka xidhitaankaaga caadiga ah, oo ula dhaqan sidii dariiqa joojinta koowaad ee aan ahayn xaalad gees. Isticmaalayaashu way beddelaan app-yada VPN; koodhkaagu waa inuu taas u adkaystaa.
Khallad 2: addRoute wuxuu qabtaa waxa aad taxday si sax ah
Dariiqyadu waxay go'aamiyaan baakadaha gaadha descriptor-kaaga, khalad baaxaduna wuxuu abuuraa xaaladda xanaaqa leh ee qayb taraafikada ay tunnel-ka marto qaybna aanay marin. addRoute("0.0.0.0", 0) wuxuu qaataa IPv4 oo dhan, taas oo macnaheedu yahay baakad kastu hadda wuu kuu yimaadaa waana in la sii diraa ama la tuuraa. /32 hal host keliya waxba kama qaato, wixii kalena waxay u dhaqmaan sidii iyada oo VPN-kaaga aan weligii la rakibin.
Qoysaska si gooni ah ayaa loo tiriyaa. Dariiqa IPv4 kaliya wuxuu IPv6 kaga tagaa shabakadda hoose, sidaas darteed host laba-stack ah wali wuu xallin karaa oo ku xidhmi karaa tunnel-ka dibaddiisa isagoo gudaha u eg si buuxda u xidhan.
DNS waxay raacdaa isla caqli. Serverrada lagu daray addDnsServer() waxay u tagaan app-yada isticmaala xalliyaha tunnel-ka, halka app leh DNS dhammaadkeeda sir ah ama Private DNS lagu dhigay magac host ay gabi ahaan iska indhatirto. Marka magacyadu ku guuldareystaan hal app oo ay u shaqeeyaan mid kale, hubi jidka xalliyaha ka hor inta aadan taaban hal dariiqo.
Khallad 3: xeerarka app kastu waa shidmeer labada dhinacba loo rogi karo
addDisallowedApplication() iyo addAllowedApplication() waa laba hab, ma aha laba shaandhayn. Dhisuhu wuxuu aqbalaa hal moodel tunnel kasta, sidaas darteed app doonaya wax walba marka laga reebo saddex baakad wuxuu isticmaalaa liiska mamnuucan oo wuxuu ka tagaa liiska la ogolaaday madhan. Labaduba way iska reebaan, dadkuna waxay taas ogaadaan waqtiga socodka ka dib markii shaashadda dejinta ay hore u soo bandhigtay labada shidmeer.
Muuqashada baakadaha sidoo kale way qaniinaysaa. Android 11 iyo wixii ka dambeeya waxaad magac dhigi kartaa kaliya baakadaha aad aragto, sidaas darteed liiska ka reebidda ee laga dhisay weydiin aan app-kaaga loo ogolayn inuu maamulo ayaa si aamusan u seegi doona gelitaannada. Isbarbardhig liiska waxa maamulaha baakadaha uu dhab ahaan soo celiyo ka hor inta aadan aaminin.
Borofaylalka shaqadu waxay mar kale kala qaybiyaan dhagaystayaasha. Tunnel lagu bilaabay borofaylka wuxuu daboolaa borofaylkaas iyo app-yadiisa, halka dhinaca shakhsiga ahi uu haysto xidhiidhkiisa. Taasi waa go'aan baaxadeed oo hal mar la qaatay, oo meeshiisu waa interface-ka ee ma aha tikit taageero.
Khallad 4: stopSelf wuxuu dhammeeyaa tunnel-ka
Maya. Interface-ku wuxuu ku nool yahay descriptor-ka uu establish() soo celiyo, shayga adeegguna wuu dhiman karaa inta descriptor-kaasu furan yahay. Marka hore xidh ParcelFileDescriptor, sii daa tixraaca, ku biir ama jooji dunta akhriska iyo qorista, ka dibna wac stopForeground(true) iyo stopSelf() isla nidaamkaas.
Descriptor la illoobay ayaa ah sababta caadiga ah ee adeeggu ugu ekaado mid ka badbaaday codsigii joojinta ee u gaar ah, wuxuuna sharraxaa dariiqo duugoobay oo ka noolaada dheeraadka app-kii ku daray.
Khaladka lidka ku ah sidoo kale waa caadi: xidhista descriptor-ka inta dunta akhrisku ku jirto badhtamaha akhriska, ka dibna duntaas loo daayo inay wax ka qabato laga-tagid aan cidna u qorin koodh. Ku hay nidaamka xidhitaanka hal meel oo u oggolow falka isticmaalaha iyo onRevoke() inay wacaan.
Waxa la hubiyo marka tunnel-ku u eg yahay mid dhintay
Ka ilaali socket-yada cimri dheer protect() ka hor inta tunnel-ku kor u kacdo. Iyada la'aan, gaadiidka tunnel-ka laftiisu dib ayaa loo jiheeyaa tunnel-ka dhexdiisa xidhiidhkuna wuu istaagaa si u eg si sax ah cilad server. Ku tijaabi cinwaan kaliya ka jira gadaasha shabakadda fog, ee ma aha bog dadweyne oo ka jawaaba kaydka ama dariiqa hoose.
Diiwaangeli natiijada establish(), dariiqyada, baakadaha la reebay iyo sababta xidhitaanka. Afartaas sadar waxay kala soocaan mushkiladda ogolaanshaha iyo mushkiladda baaxadda iyo mushkiladda wareegga nolosha iyada oo aan baakad la qaban.