Kwa nini handaki lako la Android VpnService linaacha kuelekeza trafiki
Imani nne kuhusu VpnService zinazovunjika katika uzalishaji: handaki moja kwa wakati, wigo wa njia, orodha kwa kila programu na mpangilio wa kuzima, pamoja na ukaguzi kwa kila moja.
Dhana nne kuhusu Android VpnService ziligharimu sehemu kubwa ya wiki mara moja, na hakuna moja iliyohusu itifaki ya mtandao. Programu ilisema imeunganishwa, aikoni ya ufunguo ilikaa kwenye upau wa hali, na trafiki ilikuwa ikitoka kwa njia ya kawaida. Niliendelea kudhani handaki ni langu hadi niisimamishe, kwamba njia nilizoongeza ndizo njia ninazopata, na kwamba kuita stopSelf kutashusha kiolesura pamoja nayo. Huduma ilikuwa ikifanya kama ilivyoandikwa. Sehemu iliyovunjika ilikuwa mfano wangu wa akili.
Uzushi 1: handaki hubaki juu hadi uiache
Android hushikilia kiolesura kimoja cha VPN kwa wakati. Weka cha pili na jukwaa haliweki kwenye foleni: huzima chako na kuita onRevoke() kwenye huduma yako. Ikiwa msimbo wako hubomoa kila kitu tu kwa kubonyeza kitufe, unyakuzi huacha deskripta na uzi wa kusoma, na uanzishaji unaofuata hurithi zote mbili.
Rejeleo la VpnService linasema wazi kwamba prepare() hurudisha null wakati programu tayari ina ridhaa, na Intent wakati mtumiaji bado anapaswa kuidhinisha. Ridhaa hiyo hufika tu ikiwa utawasilisha nia kupitia startActivityForResult(). Ruka uwasilishaji na establish() hurudisha null, ambayo husomwa kama kushindwa kimyakimya badala ya tatizo la ruhusa.
Always-on VPN huongeza mmiliki usiyemdhibiti. Mfumo unaweza kurudisha handaki baada ya kuwaka au baada ya kuanguka, na hupita mbele ya programu ya VPN ambayo mtumiaji aliianzisha kwa mkono. Jenga onRevoke() ili kifunge rasilimali zile zile ambazo kuzima kwako kwa kawaida hufunga, na uichukulie kama njia kuu ya kusimamisha badala ya kesi ya pembeni. Watumiaji hubadilisha programu za VPN; msimbo wako lazima ustahimili hilo.
Uzushi 2: addRoute hukamata hasa uliyoorodhesha
Njia huamua ni pakiti gani zinazofika kwenye deskripta yako, na hitilafu ya wigo huzalisha hali ya kukasirisha ambapo sehemu ya trafiki hupita kwenye handaki na sehemu haipiti. addRoute("0.0.0.0", 0) huchukua IPv4 yote, kumaanisha kila pakiti sasa inakufikia na lazima isambazwe au itupwe. /32 kwa mwenyeji mmoja haichukui karibu chochote, na kila kitu kingine hujiendesha kana kwamba VPN yako haikuwekwa kamwe.
Familia huhesabiwa kivyake. Njia ya IPv4 pekee huacha IPv6 kwenye mtandao wa msingi, kwa hivyo mwenyeji wa rafu mbili bado anaweza kutatua na kuunganisha nje ya handaki huku akionekana ameunganishwa kikamilifu ndani.
DNS hufuata mantiki hiyo hiyo. Seva zilizoongezwa kwa addDnsServer() huenda kwa programu zinazotumia kitatuzi cha handaki, wakati programu yenye kituo chake cha DNS kilichosimbwa au Private DNS iliyowekwa kwenye jina la mwenyeji huzipuuza kabisa. Wakati majina hushindwa kwa programu moja na kufanya kazi kwa nyingine, angalia njia ya kitatuzi kabla ya kugusa njia moja.
Uzushi 3: sheria kwa kila programu ni swichi unayoweza kuigeuza upande wowote
addDisallowedApplication() na addAllowedApplication() ni hali mbili, si vichujio viwili. Mjenzi hukubali modeli moja kwa kila handaki, kwa hivyo programu inayotaka kila kitu isipokuwa pakiti tatu hutumia orodha iliyokatazwa na kuacha orodha iliyoruhusiwa tupu. Mbili hizo hukingana, na watu hugundua hilo wakati wa utekelezaji baada ya skrini ya mipangilio kuwa imetoa swichi zote mbili.
Uonekano wa pakiti pia huuma. Kuanzia Android 11 unaweza kutaja pakiti tu unazoziona, kwa hivyo orodha ya kutenga iliyojengwa kutoka swali ambalo programu yako hairuhusiwi kulitekeleza itakosa maingizo kimya kimya. Linganisha orodha na kile msimamizi wa pakiti anachorudisha kwa kweli kabla ya kuiamini.
Profaili za kazi hugawanya hadhira tena. Handaki lililoanzishwa ndani ya profaili hufunika profaili hiyo na programu zake, wakati upande wa kibinafsi unabaki na muunganisho wake. Hiyo ni uamuzi wa wigo uliofanywa mara moja, na mahali pake ni kwenye kiolesura si kwenye tiketi ya msaada.
Uzushi 4: stopSelf humaliza handaki
Hapana. Kiolesura huishi kwenye deskripta ambayo establish() hurudisha, na kitu cha huduma kinaweza kufa wakati deskripta hiyo inabaki wazi. Funga ParcelFileDescriptor kwanza, acha rejeleo, unganisha au katiza nyuzi za kusoma na kuandika, kisha ita stopForeground(true) na stopSelf() kwa mpangilio huo.
Deskripta iliyosahaulika ndiyo sababu ya kawaida ya huduma kuonekana imenusurika ombi lake la kusimama, na inaeleza njia ya zamani inayoishi muda mrefu kuliko programu iliyoiongeza.
Hitilafu ya kinyume ni ya kawaida vile vile: kufunga deskripta wakati uzi wa kusoma uko katikati ya kusoma, kisha kuuacha uzi huo kushughulikia hitilafu ambayo hakuna aliyeandika msimbo wake. Weka mpangilio wa kuzima mahali pamoja na uache kitendo cha mtumiaji na onRevoke() vyote viite humo.
Nini cha kukagua wakati handaki linaonekana limekufa
Linda soketi za muda mrefu kwa protect() kabla handaki halijapanda. Bila hiyo, usafirishaji wa handaki lenyewe huelekezwa tena ndani ya handaki na muunganisho hukwama kwa namna inayofanana kabisa na hitilafu ya seva. Jaribu dhidi ya anwani inayopatikana tu nyuma ya mtandao wa mbali, si tovuti ya umma inayojibu kutoka kache au kutoka njia ya msingi.
Andika matokeo ya establish(), njia, pakiti zilizotengwa na sababu ya kuzima. Mistari hiyo minne hutenganisha tatizo la ridhaa na tatizo la wigo na tatizo la mzunguko wa maisha bila kunasa pakiti.