Hakuna kitu katika VpnService kinachonasa trafiki chenyewe. Inaomba mfumo kiolesura cha tun, inakipa kiolesura hicho seti ya anwani na njia, na tangu wakati huo kerneli hunakili kila pakiti inayolingana na njia hizo kwenye kielekezi cha faili ambacho programu inaweza kusoma. Msimbo wa programu hauoni kamwe pakiti ambazo njia hazikuchagua, kwa hivyo wigo wa handaki ni swali la jedwali la uelekezaji kabla ya kuwa swali la upangaji programu. Ndiyo sababu utekelezaji huo huo wa huduma unaweza kumeza kila mtiririko kwenye simu moja na sehemu tu kwenye nyingine, na ndiyo sababu kuongeza njia wakati mwingine hurekebisha handaki iliyoonekana kuvunjika. Unachopata ni kile ulichotangaza, ukiondoa kila kitu ambacho mjenzi alikataa kimya kimya.

Njia huamua pakiti gani zinafika

Builder.addRoute(prefix, prefixLength) husakinisha kiambishi awali kwenye jedwali la uelekezaji la mtandao wa VPN. Mfumo huchukulia mtandao huo kama chaguo-msingi kwa programu zilizo ndani ya wigo, kwa hivyo maingizo yake huchunguzwa kabla ya njia chaguo-msingi ya mtandao halisi na kiambishi awali kinacholingana kinatosha kugeuza mtiririko. Ndiyo sababu njia ya 0.0.0.0/0 inachukua IPv4 yote, ikiwa ni pamoja na printa, lengo la cast na ukurasa wa utawala wa kipanga njia.

Wateja wanaotaka ufunikaji huo bila kufuta ingizo chaguo-msingi halisi hutumia badala yake jozi ya 0.0.0.0/1 na 128.0.0.0/1. Njia mbili mahususi zaidi hushinda njia chaguo-msingi, kwa pamoja hufunika nafasi yote ya anwani, na ingizo chaguo-msingi la simu yenyewe hubaki kwenye jedwali kwa soketi ambazo bado zimefungwa kwenye mtandao halisi.

Anwani na maingizo ya DNS hutoka kwa mjenzi yule yule na hujibu swali tofauti. addAddress hukipa kiolesura anwani yenye urefu wa kiambishi awali, na addDnsServer husakinisha kitatuzi ambacho programu zilizo ndani ya wigo zitakiuliza kupitia kiolesura. Familia zote mbili zinaweza kukaa kwenye kiolesura kimoja, kwa hivyo seti ya njia za IPv4 pekee kando ya anwani ya IPv6 ni usanidi ambao husomwa kwa usahihi na bado huvuja. Ikiwa unaelekeza familia ambayo kiolesura hakina anwani ndani yake, kerneli haina anwani ya chanzo kwa pakiti hizo na hazionekani kamwe kwenye kielekezi.

establish() hurudisha nini

establish() hurudisha ParcelFileDescriptor, au null wakati programu haijaidhinishwa. Null ni hali ya idhini na si hitilafu ya mtandao: VpnService.prepare() lazima iwe imerudisha null tayari, au mtumiaji lazima awe ameidhinisha mazungumzo ya mfumo kabla ya wito. Idhini inaweza kuondolewa wakati huduma inaendesha, na kiolesura hufungwa chini ya miguu yako bila mrejesho wowote kwenye kitanzi chako cha kusoma.

Kielekezi hakizuii isipokuwa useme vinginevyo, kwa hivyo usomaji hurudi mara moja bila data badala ya kusimamisha uzi. Kitanzi kilichoandikwa kwa soketi inayozuia huteketeza msingi mmoja, na kitanzi kinachochukulia usomaji tupu kuwa mbaya huvunja handaki katika sekunde isiyo na kazi. Builder.setBlocking(true) hubadilisha tabia hiyo, na gharama ni uzi unaosubiri ndani ya usomaji.

Hoja za njia na anwani huthibitishwa kama thamani za LinkAddress, na malengo ya multicast kama 224.0.0.0/4 hukataliwa moja kwa moja. Kiolesura cha tun cha nukta-hadi-nukta hakina kikoa cha matangazo pia, kwa hivyo ugunduzi wa multicast kupitia hicho unahitaji muundo tofauti badala ya njia nyingine. Orodha ya kukagua VpnService.Builder ndiyo, kabla ya kuhitimisha kuwa wito ulipuuzwa.

Wigo kwa kila programu hupunguza seti, si handaki

Kuanzia API 21 mjenzi hukubali addAllowedApplication na addDisallowedApplication, na orodha hizo mbili hukingamana ndani ya mjenzi mmoja. Orodha ya kuruhusu hufanya handaki liwepo kwa pakiti hizo wakati kila kitu kingine kinahifadhi mtandao halisi; orodha ya kuzuia hunasa kila kitu isipokuwa pakiti zilizotajwa, jambo ambalo mteja hutoa kama handaki lililogawanywa. Kabla ya API 21 hakuna utaratibu wowote wa jukwaa, na tabia kwa kila programu ilikuja kutoka kwa wateja wa wahusika wengine waliokuwa wakichuja kwa UID ndani ya kisambazaji chao wenyewe. Tofauti hii ni muhimu unapotafuta hitilafu, kwa sababu handaki la kwa kila programu lenye orodha ya kuruhusu ya pakiti moja karibu halitoi trafiki na hiyo ni tabia sahihi, si njia iliyovunjika.

Wigo uwe wowote, soketi ambayo programu yako hufungua kwa seva ya VPN haipaswi kupita ndani ya handaki ambalo inajenga. VpnService.protect(socket) hufunga soketi hiyo kwenye mtandao wa chini ili pakiti zake zipite kifaa cha tun. Ukiruka wito huo, makubaliano ya mkono humezwa na kiolesura ambacho kilipaswa kukiinua.

VpnService.setUnderlyingNetworks hufunga mduara kwa kuiambia mfumo ni mtandao gani halisi unaobeba handaki. Thamani hiyo huamua jinsi VPN inavyoripoti muunganisho kwa programu nyingine, na thamani ya null au iliyopitwa na wakati ni sababu ya kawaida ya handaki lililounganishwa ambalo sehemu nyingine ya simu huchukulia kama nje ya mtandao. Issasisha mtandao wa chini unapobadilika, si wakati wa kuanza tu.

Jumla za ukaguzi na MTU: ambapo njia sahihi bado inashindwa

Pindi pakiti zinapofika, maelezo mawili katika ngazi ya pakiti huamua kama kitu kinafanya kazi kutoka mwanzo hadi mwisho. La kwanza ni anwani ya chanzo: kwa anwani kadhaa za kiolesura kerneli inaweza kutuma pakiti zinazobeba ya kwanza, kwa hivyo kisambazaji kinachoandika upya vichwa lazima kirekebishe anwani na jumla ya ukaguzi inayoifunika.

La pili ni wigo wa jumla ya ukaguzi. Wakati programu inajenga pakiti za TCP au UDP yenyewe, jumla ya ukaguzi hufunika kichwa bandia kinachoshikilia anwani ya chanzo, anwani ya lengo, nambari ya itifaki na urefu wa usafirishaji, na kuacha yoyote kati ya hizo hutoa pakiti zinazofika na kutupwa. Kushindwa huko kunaonekana kama muda wa kupita baada ya jibu ambalo huja kamwe, na hilo huwarudisha wengi kwenye njia. setMtu huweka MTU ya kiolesura, na kila usomaji hurudisha pakiti moja kamili ya IP, kwa hivyo bafa iliyoandikwa kwa mtiririko wa baiti itagawanya uchanganuzi wako, si pakiti.

Mzunguko wa uthibitishaji unaotenganisha tabaka

Ili kupata pale wigo ulikosea, jaribu tabaka kwa mpangilio. Uliza kifaa ni njia gani mtandao wa VPN unashikilia kweli, kisha angalia kama mtiririko kwa anwani inayojulikana unaonekana kama usomaji kwenye kielekezi, kisha angalia kama pakiti ambayo kisambazaji chako hutuma imeundwa vizuri. Tatizo la njia halionyeshi kitu kwenye kielekezi, wakati tatizo la jumla ya ukaguzi linaonyesha pakiti inayofika na kutoweka.

Ikiwa hakuna kinachofika kwenye kielekezi, mtuhumiwa ni seti ya njia na si msomaji: thibitisha viambishi awali, thibitisha kuwa kuna anwani katika familia hiyo hiyo, na thibitisha kuwa programu iko ndani ya wigo ulioweka. Ikiwa pakiti zinafika kwenye kielekezi lakini hakuna kinachorudi, kagua protect() na thamani ya mtandao wa chini kabla ya kugusa njia tena. Ikiwa upande wa mbali unaripoti pakiti zilizoharibika, jumla ya ukaguzi na MTU ni sehemu za kuangalia. Uchunguzi mmoja kwa kila tabaka huokoa mchana wa kubahatisha.

Makala zinazohusiana