VpnService protect() tàbí yíyọ app kúrò: èwo ni ó tún ọ̀nà ṣe
Dáàbò bo socket tí ó gbé tunnel, tàbí yọ gbogbo app kúrò: àwọn ipò mẹ́ta tí ó pinnu ipari tí Android VPN rẹ nílò.
Ọ̀nà méjì ló wà láti mú àwọn packet tunnel fúnra rẹ̀ dúró síta kúrò nínú tunnel: dáàbò bo socket gbígbé, tàbí yọ gbogbo app kúrò nínú VPN. Wọ́n ń yanjú àwọn ìṣòro tí ó yàtọ̀, àti yíyan èyí tí ó gbòòrò nítorí pé ó rọrùn láti so ni ọ̀nà tí àwọn app fi ń pàdánù àǹfààní sí nẹ́tíwọ́kì àdúgbò àti DNS pínpín láìṣe àkíyèsí. Bẹ̀rẹ̀ pẹ̀lú ohun tí ó gbọdọ̀ wà síta kúrò nínú tunnel, lẹ́yìn náà yan ipari tí ó kéré jùlọ tí ó ń ṣe é.
Ohun tí protect() ń yọ kúrò nínú tunnel
VpnService.protect() jẹ́ ìpè fún socket kọ̀ọ̀kan. Ìwọ ń fún un ní socket tàbí descriptor tí ó gbé tunnel, Android sì ń fi àmì sí socket yẹn kí ìjáde rẹ̀ lè lo nẹ́tíwọ́kì tí ó wà nísàlẹ̀ dípò interface VPN. Gbogbo ohun mìíràn tí app bá ránṣẹ́ ṣì ń tẹ̀lé ọ̀nà VPN déédéé.
Ipari tóóró yẹn ni èrò náà. Socket tí a dáàbò bo kò yí bí HTTP client rẹ ṣe ń yanjú orúkọ padà, interface tí àwọn ìpè ìtúpalẹ̀ rẹ ń lò, tàbí ohun tí ó ṣẹlẹ̀ sí ìsopọ̀ kejì tí a ṣí lẹ́yìn náà.
Àwọn ipò mẹ́ta tí ó pinnu ipari
Ipò kìíní ni bóyá gbígbé tunnel nìkan ló gbọdọ̀ jáde. Bí ìjáde mìíràn ti app gbọdọ̀ ṣì gba VPN kọjá, dáàbò socket ni ipari tí ó tọ́. Ipò kejì ni bóyá ìwọ ni ó ń darí ṣíṣe socket. Ilé-ìkàwé tí ó ṣí socket tirẹ̀ ní jìnjin inú kò fún ọ ní ààyè láti pe protect() àyàfi bí ó bá ṣí hook kan tàbí gba socket tí a ti kọ́. Ipò kẹta ni bóyá app gbọdọ̀ dé nẹ́tíwọ́kì àdúgbò tàbí portal ìdánilẹ́kọ̀ọ́ ní tààrà, èyí tí ó jẹ́ ìbéèrè yàtọ̀ sí mímú tunnel wà láàyè.
Yíyọ app kúrò pẹ̀lú addDisallowedApplication() jẹ́ irinṣẹ́ tí kò gbóná. Ó ń yọ gbogbo ìsopọ̀ tí app ń ṣe kúrò nínú VPN, pẹ̀lú àwọn tí o fẹ́ ṣàyẹ̀wò, àti lórí àwọn ẹ̀rọ kan ó tún ń yí bí ìwádìí àdúgbò ṣe ń ṣiṣẹ́ padà.
Àṣàyàn kẹta ni láti so gbígbé mọ́ nẹ́tíwọ́kì tí a yàn pẹ̀lú bindProcessToNetwork() tàbí ọwọ́ nẹ́tíwọ́kì ní ìpele socket. Èyí wúlò nígbà tí ẹ̀rọ bá ní Wi-Fi àti cellular lẹ́ẹ̀kan náà tí o sì fẹ́ kí tunnel gba ọ̀nà òkè pàtó kan.
Pè é nígbà tí a ń ṣẹ̀dá gbígbé
Pe protect() nínú bulọ́ọ̀kì kan náà tí ó ń ṣẹ̀dá gbígbé, ṣáájú connect() tàbí send(). Bí ìpè bá padà false, pa socket mọ́ kí ètò kùnà; bí o bá tẹ̀síwájú ìwọ yóò wà pẹ̀lú gbígbé tí àwọn packet rẹ̀ lè tún wọ inú interface rẹ fúnra rẹ.
Ìrísí rẹ̀ kéré tó láti máa wà ní ibi kan:
DatagramSocket transport = new DatagramSocket();
if (!protect(transport)) {
transport.close();
throw new IOException("transport not protected");
}
transport.connect(serverAddress);Àwọn àlàyé mẹ́ta ń jáni níbí. Kìíní, iye boolean ni àmì kan ṣoṣo tí o ń rí, nítorí náà ṣe àkọsílẹ̀ ìkùnà pẹ̀lú ìtumọ̀ tí ó tó láti ìyàtọ̀ àṣẹ́ tí a fagilé kúrò nínú ìpè tí a kọ̀. Kejì, protect() ń bo socket, kì í ṣe nọ́mbà descriptor: bí o bá pa socket mọ́ tí o sì tún lo odidi náà fún socket mìíràn lẹ́yìn náà, socket tuntun kò ní ààbò. Kẹta, nígbà tí ilé-ìkàwé abínibí bá ṣí gbígbé, dáàbò bo descriptor kí kóòdù abínibí tó sopọ̀, bí bẹ́ẹ̀ kọ́ ọ̀nà lè ti yàn tẹ́lẹ̀. Ìtọ́kasí VpnService ni ibi láti fi ìdí àwọn ìrùwé tí ìpele API àfojúsùn rẹ ń pèsè gan-an múlẹ̀.
Dán ọ̀nà tí a dínà wò, kì í ṣe ọ̀nà tí ó dára nìkan
Ṣàyẹ̀wò pẹ̀lú tunnel ní ṣíṣí, nítorí ìyẹn ni ipò kan ṣoṣo tí ọ̀nà méjèèjì lè yàtọ̀. Rán ìbéèrè kan nípasẹ̀ gbígbé tí a dáàbò bo àti ọ̀kan láti ọ̀nà kóòdù tí kò tíì pe protect() rí, lẹ́yìn náà fi ohun tí ìpẹ̀kun jìnnà rí wé: ìsopọ̀ tí a dáàbò bo gbọdọ̀ dé pẹ̀lú nẹ́tíwọ́kì nísàlẹ̀ gẹ́gẹ́ bí orísun, nígbà tí èyí tí kò ní ààbò ń fi àdírẹ́sì tunnel fúnra rẹ̀ hàn tí ó sì ń gbé àwọn olùka byte tunnel. Lórí ẹ̀rọ, ss tàbí netstat ń fi ìpín kan náà hàn kí ohunkóhun tó kúrò nínú rédíò.
Dán ìfagilé wò lọ́tọ̀, nítorí ìyípadà àṣẹ́ ń wó interface lulẹ̀ láìfi ọwọ́ kàn kóòdù socket rẹ. Fagilé àṣẹ́ VPN tàbí dá iṣẹ́ dúró, tún gbígbé kọ́, kí o sì ṣàyẹ̀wò pé protect() ṣì ń padà true àti pé gbígbé tún sopọ̀ nígbà tí a bá fún àṣẹ́ lẹ́ẹ̀kan sí.
Bí ìbéèrè tí a dáàbò bo bá ṣì tẹ̀lé tunnel, ó ṣeé ṣe kí ìpè ààbò ń ṣẹlẹ̀ lẹ́yìn tí a ti tọ́ socket sí ọ̀nà. Gbé e síwájú kí o sì tún dán wò.
Jẹ́ kí ìpinnu wà ní àkọsílẹ̀ lẹ́gbẹ̀ẹ́ ètò gbígbé: àwọn socket tí a dáàbò bo, ìjáde app tí a yọ kúrò, àti ohun tí app ń ṣe nígbà tí ààbò bá kùnà. Ìlà yẹn ni ó ń dá àtúnṣe tí ó ń bọ̀ dúró láti mú yíyọ kúrò gbòòrò sí gbogbo app nítorí pé ìdánwò kan ṣoṣo ń kùnà. Ó tún fún ẹni tí ó kàn ní ọ̀nà láti ṣàyẹ̀wò èrò láìtún manifest kọ́ ní ẹ̀yìn.