Àwọn ìrònú mẹ́rin nípa Android VpnService gba ọ̀sẹ̀ kan lọ́wọ́ mi ní ẹ̀ẹ̀kan, kò sì sí ọ̀kan nínú wọn tí ó ní í ṣe pẹ̀lú ìlànà nẹ́tíwọ́kì. App náà sọ pé ó ti so mọ́, àmì kọ́kọ́rọ́ jókòó nínú ọ̀pá ipò, ṣùgbọ́n ìrìnàjò ṣì ń jáde nípasẹ̀ ipa dédé. Mo ń rò nígbà gbogbo pé ọ̀nà náà jẹ́ tèmi títí tí mo fi dá a, pé àwọn ipa tí mo fi kún ni àwọn ipa tí mo ń gbà, àti pé pípè stopSelf yóò sọ interface náà kalẹ̀ pẹ̀lú rẹ̀. Iṣẹ́ náà ń hùwà gẹ́gẹ́ bí a ti kọ ọ́ sílẹ̀ gan-an. Apá tí ó já ni àwòrán inú mi.

Àròsọ 1: ọ̀nà náà dúró títí tí ìwọ yóò fi dá a

Android ń di interface VPN kan mú ní ẹ̀ẹ̀kan. Ṣètò èkejì, pẹpẹ kì yóò fi í sínu ìlà: yóò pa tìrẹ ṣẹ́ kùn yóò sì pe onRevoke() lórí iṣẹ́ rẹ. Bí kóòdù rẹ bá ń wó gbogbo nǹkan nígbà tí a bá tẹ bọ́tìnnì nìkan, ìgbàmúlò yóò fi descriptor kan àti ìlà kíkà sílẹ̀, ìgbà tí ó tẹ̀lé yóò sì jogún méjèèjì.

Ìtọ́kasí VpnService sọ kedere pé prepare() yóò dá null padà nígbà tí app ti ní àṣẹ, àti Intent nígbà tí olùlò ṣì ní láti fọwọ́ sí i. Àṣẹ yẹn kì yóò dé bí kì í ṣe pé o fi èrò náà ránṣẹ́ nípasẹ̀ startActivityForResult(). Bí o bá fò ó kọjá, establish() yóò dá null padà, èyí tí a kà gẹ́gẹ́ bí ìkùnà ìdákẹ́jẹ́ kì í ṣe ìṣòro àṣẹ.

Always-on VPN ń fi olówó kan kún tí ìwọ kò ní àkóso rẹ̀. Ẹ̀rọ le mú ọ̀nà náà padà lẹ́yìn ìmúra tàbí lẹ́yìn ìforígbá, ó sì ń kọjá app VPN tí olùlò fi ọwọ́ ti ní. Kọ onRevoke() kí ó lè ti àwọn ohun àmúṣọrọ̀ kan náà bí i ti ìdádúró dédé rẹ, kí o sì kà á sí ipa ìdádúró àkọ́kọ́ kì í ṣe ọ̀ràn etí. Àwọn olùlò ń pààrọ̀ app VPN; kóòdù rẹ gbọ́dọ̀ farada ìyẹn.

Àròsọ 2: addRoute ń mú gan-an ohun tí o ṣe àkósílẹ̀

Àwọn ipa ni ó ń pinnu àwọn pákẹ́tì tí ó dé descriptor rẹ, àṣìṣe ìwọ̀n sì ń dá ipò tí ń bínú sílẹ̀ níbi tí apá kan ìrìnàjò ń gba inú ọ̀nà àti apá kan kò gbà. addRoute("0.0.0.0", 0) ń gba gbogbo IPv4, èyí tí ó túmọ̀ sí pé pákẹ́tì kọ̀ọ̀kan ń dé ọ̀dọ̀ rẹ báyìí, a sì gbọ́dọ̀ gbé e lọ tàbí kí a sọ ọ́ nù. /32 fún olùgbà kan ṣoṣo kò gba nǹkan kan, gbogbo rẹ̀ yókù sì ń hùwà bí ẹni pé a kò fi VPN rẹ sórí rẹ̀ rí.

Àwọn ìdílé ni a ń kà lọ́tọ̀. Ipa IPv4 nìkan ń fi IPv6 sílẹ̀ lórí nẹ́tíwọ́kì ìsàlẹ̀, nítorí náà olùgbà onípele méjì ṣì lè yanjú orúkọ kí ó sì so mọ́ ní òde ọ̀nà náà bí ó tilẹ̀ ń dàbí ẹni tí ó so mọ́ pátápátá ní inú.

DNS ń tẹ̀lé ìlànà kan náà. Àwọn sẹ́bà tí a fi addDnsServer() kún ń lọ sí àwọn app tí ó ń lo olùyanjú ọ̀nà náà, nígbà tí app tí ó ní DNS ìparí tí a fi ààlà pa tàbí Private DNS tí a gbé kalẹ̀ lórí orúkọ olùgbà yóò fojú kéré wọn pátápátá. Nígbà tí orúkọ bá já fún app kan tí ó sì ṣiṣẹ́ fún òmíràn, yẹ̀wò ipa olùyanjú kí o tó fi ọwọ́ kan ipa kan pàápàá.

Àròsọ 3: àwọn òfin fún app kọ̀ọ̀kan jẹ́ swíìṣì tí o lè yí sí ẹ̀gbẹ́ méjèèjì

addDisallowedApplication() àti addAllowedApplication() jẹ́ ipò méjì, kì í ṣe àyọ̀ méjì. Olùkọ́ ń gba àwòrán kan fún ọ̀nà kọ̀ọ̀kan, nítorí náà app tí ó fẹ́ gbogbo nǹkan àyàfi pákẹ́tì mẹ́ta yóò lo àkọsílẹ̀ ẹ̀wọ̀n yóò sì fi àkọsílẹ̀ ààyè sílẹ̀ lófo. Àwọn méjèèjì ń yọ ara wọn kúrò, àwọn ènìyàn sì ń ṣàwárí ìyẹn ní àkókò ṣíṣe lẹ́yìn tí ojú-ìwé ètò ti fi swíìṣì méjèèjì hàn.

Ìríran pákẹ́tì náà ń jáni. Láti Android 11, o lè dárúkọ àwọn pákẹ́tì tí o rí nìkan, nítorí náà àkọsílẹ̀ àyọkúrò tí a kọ́ láti ìbéèrè tí a kò gbà fún app rẹ láyè láti ṣe yóò pàdánù àwọn ìwọlé ní ìdákẹ́jẹ́. Fi àkọsílẹ̀ náà wé ohun tí olùṣàkóso pákẹ́tì ń dá padà gan-an kí o tó gbẹ́kẹ̀lé e.

Àwọn profáìlì iṣẹ́ ń pín àwọn olùwòye lẹ́ẹ̀kan sí. Ọ̀nà tí a bẹ̀rẹ̀ nínú profáìlì yóò bo profáìlì yẹn àti àwọn app rẹ̀, nígbà tí ẹ̀gbẹ́ ti ara ẹni yóò pa ìsopọ̀ tirẹ̀ mọ́. Ìpinnu ìwọ̀n ni ìyẹn tí a ṣe lẹ́ẹ̀kan, ibi tí ó sì yẹ kí ó wà ni interface kì í ṣe tíkẹ́ẹ̀tì ìtìlẹ́yìn.

Àròsọ 4: stopSelf ń parí ọ̀nà náà

Bẹ́ẹ̀ kọ́. Interface ń gbé inú descriptor tí establish() ń dá padà, ohun iṣẹ́ náà sì lè kú nígbà tí descriptor yẹn ṣì ṣí. Kọ́kọ́ pa ParcelFileDescriptor, ju ìtọ́kasí náà sílẹ̀, darapọ̀ mọ́ ìlà kíkà àti kíkọ tàbí dá wọn dúró, lẹ́yìn náà pe stopForeground(true) àti stopSelf() ní ìtòlẹ́sẹẹsẹ yẹn.

Descriptor tí a gbàgbé ni ìdí dédé tí iṣẹ́ fi dàbí ẹni tí ó yege ìbéèrè ìdádúró tirẹ̀, ó sì ń ṣàlàyé ipa àtijọ́ tí ó ń gbé pẹ́ ju app tí ó fi í kún lọ.

Àṣìṣe òdìkejì náà wọ́pọ̀ bákan náà: pípa descriptor nígbà tí ìlà kíkà wà ní àárín kíkà, lẹ́yìn náà fi ìlà yẹn sílẹ̀ láti kojú àìtọ́jú tí ẹnikẹ́ni kò kọ kóòdù fún. Pa ìtòlẹ́sẹẹsẹ ìdádúró mọ́ sí ibi kan, kí iṣe olùlò àti onRevoke() méjèèjì lè pè síbẹ̀.

Kí ni a yẹ kí ó yẹ̀wò nígbà tí ọ̀nà náà bá dàbí ẹni tí ó kú

Da àwọn socket tí ó ń gbé pẹ́ mọ́ pẹ̀lú protect() kí ọ̀nà náà tó gòkè. Láìsí rẹ̀, ìgbékalẹ̀ ọ̀nà náà fúnra rẹ̀ ni a ó tún darí sínú ọ̀nà náà, ìsopọ̀ yóò sì dúró lọ́nà tí ó dàbí àṣìṣe sẹ́bà gan-an. Dán wò lórí àdírẹ́sì tí ó wà lẹ́yìn nẹ́tíwọ́kì jíjìnnà nìkan, kì í ṣe ojú-ìwé gbangba tí ó ń dáhùn láti cache tàbí láti ipa ìsàlẹ̀.

Ṣàkọsílẹ̀ àbájáde establish(), àwọn ipa, àwọn pákẹ́tì tí a yọkúrò àti ìdí ìdádúró. Àwọn ìlà mẹ́rin yẹn ń ya ìṣòro àṣẹ sọ́tọ̀ kúrò nínú ìṣòro ìwọ̀n àti ìṣòro ìgbà ayé láìsí gbígba pákẹ́tì.

Àwọn àpilẹ̀kọ tó jọra