Àtòjọ ìyọ̀nda Android VpnService: kí ni ó fà á tí àwọn ojú-ìwé tí a gbà kí ó ṣe ń dúró
Àtòjọ ìyọ̀nda rẹ ṣeé ṣe kí ó tọ́. Àwọn ojú-ìwé ń dúró nítorí ìdáhùn DNS, tábìlì ọ̀nà, socket olùyẹ́nà tàbí MTU. Èyí ni ìtẹ̀léntẹ̀lẹ̀ fún àyẹ̀wò.
O fi ẹ̀ka-ìpín kan kún àtòjọ ìyọ̀nda, ìbéèrè náà dé app rẹ, olùfiwé náà ń dá ìyọ̀nda padà, ṣùgbọ́n ojú-ìwé náà kò gbé kalẹ̀ rí. Ní àkókò yẹn ọ̀pọ̀ ènìyàn bẹ̀rẹ̀ sí kọ olùfiwé náà lẹ́ẹ̀kan sí i àti fi àwọn ìfiwéra wildcard kún un. Nínú ìrírí mi olùfiwé náà máa ń tọ́ ní gbogbo ìgbà, àti pé àṣìṣe náà wà ní ìpele kan nísàlẹ̀: nínú ìdáhùn DNS tí o ṣẹ̀dá, nínú ọ̀nà tí o fi sí, tàbí nínú socket tí o lò láti fi ìbéèrè náà ránṣẹ́. Àtòjọ náà ni apá rírọrùn; ọ̀nà packet náà ni ibi tí àwọn àtòjọ ìyọ̀nda ti ń já.
Olùfiwé náà kì í ṣe ẹlẹ́ṣẹ̀ ní gbogbo ìgbà
Ohun àkọ́kọ́ tí a gbọdọ̀ yà sọ́tọ̀ ni dídènà àti bíbàjẹ́. Orúkọ tí a dènà gbọdọ̀ kùnà ní kíákíá àti ní àfihàn, nítorí pé aṣàwákiri gba ìdáhùn pé orúkọ náà kò sí, ó sì dúró. Orúkọ tí ó bàjẹ́ ń dúró, ó tún gbìyànjú lórí IPv6, ó lọ sí ọ̀nà gbígbé mìíràn, ó sì fi àmì yíyí sílẹ̀ fún ọ. Tí o bá rí àmì yíyí, àtòjọ ìyọ̀nda rẹ ṣeé ṣe kí ó ń dá ohun kan padà tí ẹrọ kò lè ṣe nǹkan kan sí.
Àkọsílẹ̀ A òfo ni àṣìṣe àtẹ̀yìnwá. Pípèsè NOERROR pẹ̀lú òdo ìdáhùn dàbí ìdáhùn tí ó wúlò, nítorí náà olùyẹ́nà stub gbà á, aṣàwákiri tún gbìyànjú, ó gbìyànjú AAAA, ó gbìyànjú olùyẹ́nà mìíràn, ó sì juwọ́ sílẹ̀ ní ọ̀pọ̀ àkókò lẹ́yìn. Kóòdù ìdáhùn 3, ìyẹn NXDOMAIN, pẹ̀lú apá ìbéèrè tí a tún kọ àti ID ìdúnàádúrà tí a dà, máa ń parí ìjíròrò náà lẹ́sẹ̀kẹsẹ̀. Lo ó fún gbogbo orúkọ tí o mọ̀ọ́mọ̀ kọ̀.
IPv6 pẹ̀lú tọ́ sí ìpinnu kan náà dípò ìpilẹ̀. Tí o bá dá NXDOMAIN fún A tí o sì jẹ́ kí AAAA kọjá, ẹrọ náà lè dé orúkọ tí a dènà lórí IPv6, àyọkà náà sì ń tú. Àwọn ìmúṣẹ kan ń dá ìdáhùn sí àwọn ìbéèrè AAAA tí a dènà pẹ̀lú àdírẹ́sì loopback kí ìsopọ̀ lè kùnà lẹ́sẹ̀kẹsẹ̀ dípò kí ó lọ sí ọ̀nà mìíràn. Yan ìlànà kan, fi í sí orí àwọn irú àkọsílẹ̀ méjèèjì, kí o sì ṣàkọsílẹ̀ méjèèjì.
Ọ̀nà tí ó bá gbogbo nǹkan mú ni ó ni gbogbo nǹkan
Àpẹẹrẹ tí ó dá lórí DNS nìkan kì í fi addRoute("0.0.0.0", 0) kún un rí, nítorí náà àwọn ìbéèrè nìkan ni ó ń wọnú ibi-ìsopọ̀ TUN, gbogbo nǹkan mìíràn sì ń lo nẹ́tíwọ́kì tí ó wà nísàlẹ̀. Ìyẹn ni ìrísí àìléwu, ó sì tún ṣàlàyé ìdí tí àwọn àtòjọ ìyọ̀nda kan fi dàbí pé wọ́n ń ṣiṣẹ́ lórí Wi-Fi tí wọ́n sì ń kùnà lórí nẹ́tíwọ́kì alágbèéká.
Ní àkókò tí ọ̀nà àpilẹ̀ bá wà, gbogbo ṣíṣàn ni tìrẹ. Packet TCP tí ó dé ibi-ìsopọ̀ tí a kò gbé lọ tàbí dáhùn sí ń jókòó nínú ìlà títí àkókò ẹrọ yóò fi tán, kò sì sí àṣìṣe láti ṣàkọsílẹ̀ nítorí pé kò sí nǹkan tí ó kùnà. Mo rí ẹnìkan tí ó lo ọ̀sán kan lórí àtòjọ ìyọ̀nda tí ó bàjẹ́ tí ó wá jẹ́ olùgbéjáde tí ó ṣáà fún ibùdókọ̀ 443. Ṣàkọsílẹ̀ ìlànà àti ibi-àsopọ̀ gbogbo packet tí o pinnu láti sọnù.
Socket olùyẹ́nà gbọdọ̀ jáde kúrò nínú ọ̀nà abẹ́lẹ̀
Gbígbéjáde ni ibi tí ìdẹkùn tó kàn wà. Àwọn olùyẹ́nà alágbèéká máa ń gbé ní àdírẹ́sì àdáni tí ọ̀nà abẹ́lẹ̀ kò lè dé, nítorí náà ìbéèrè tí o gbé jáde kò lọ sí ibikíbi, app sì ń jábọ̀ àkókò kíkà tí ó tán. Fi àwọn ìbéèrè tí a fọwọ́ sí ránṣẹ́ sí olùyẹ́nà tí o mọ̀ pé ó dé, kí o sì fi socket yẹn fún VpnService.protect() kọ́kọ́. Socket tí a kò dáàbò bò ń da ìbéèrè náà padà sínú ọ̀nà abẹ́lẹ̀ tìrẹ, níbi tí ó ti tún dé app, tí ó ń yí ká títí àkókò yóò fi parí.
Àṣìṣe náà dàbí ìdádúró nẹ́tíwọ́kì, ìdí nìyẹn tí ó fi ń wà pẹ́ nínú àwọn ìjábọ̀ àṣìṣe. Tọ́jú àwọn olùkà fún àwọn ìbéèrè tí a rán àti àwọn ìdáhùn tí a gbà: tí nọ́mbà àkọ́kọ́ bá ń gòkè tí èkejì sì dúró ní òdo, socket ni o ń wò, kì í ṣe àtòjọ.
Ìwọ̀n àti checksum ń kùnà láìsí ìfiránṣẹ́
Sísọnù ní ìdákẹ́jẹ́ tún ń wá láti ìwọ̀n. Ìdáhùn DNS pẹ̀lú àkójọ ìdáhùn ńlá, tàbí ìfọwọ́sowọ́pọ̀ TCP pẹ̀lú àwọn àṣàyàn tí ó gbòòrò, lè kọjá MTU ọ̀nà tí o kò fi tí ó ṣe é mọ́, ẹ̀yà náà á pòórá ní òkè, ẹrọ náà yóò sì tún gbìyànjú pẹ̀lú kéré tàbí ó jáwọ́. Fífi MTU ibi-ìsopọ̀ sí 1280 jẹ́ àṣàyàn àìléwu tí ó ń dúró lórí ọ̀pọ̀ ọ̀nà alágbèéká, àti pé kí o ṣe kedere sàn ju kí o jogún ìpilẹ̀ tí ẹnikẹ́ni kò díwọ̀n.
Tí ìwọ fúnra rẹ bá ń kọ́ àwọn packet, checksum ni apani ìdákẹ́jẹ́ kejì. UDP checksum tí a ṣírò lórí pseudo-header tí ó fi gígùn UDP tàbí pápá ìlànà sílẹ̀ ń ṣẹ̀dá packet tí ó dàbí ẹni pé ó tọ́ ní ẹ̀gbẹ́ rẹ tí olùgbà sì ń sọnù láìsí àmì. Fi pseudo-header rẹ wé ìpèsè náà pápá-pápá, kí o sì tẹ̀ jáde checksum tí a ṣírò fún ṣíṣàn kan tí a mọ̀ nígbà tí o ń ṣàtúnṣe.
Ohun tí VpnService kò ní ṣe fún ọ
Ìdènà méjì yẹ kí o mọ̀ kí o tó ṣàpẹẹrẹ yí wọn ká. Kò sí app lasan tí ó lè fi proxy gbogbo ẹ̀rọ tàbí fáìlì PAC sórí láìsí Wi-Fi, apá yẹn kò sì yí padà. Ọ̀nà fún app kọ̀ọ̀kan ti yí padà: kí API 29 tó wà, VpnService.Builder kò lè gbé proxy rárá, àti láti API 29 setHttpProxy(ProxyInfo.buildPacProxy(uri)) ń fi script PAC fún pẹpẹ láti dìwọ̀n fún nẹ́tíwọ́kì VPN. Dìwọ̀n àwọn ìlànà nínú kóòdù rẹ fúnra rẹ nígbà tí o bá ń dojú kọ API àtijọ́ tàbí nígbà tí àpẹẹrẹ PAC kò lè sọ ìlànà náà. UDP pẹ̀lú kò jẹ́ ọ̀fẹ́: aṣàwákiri ń fi TCP nìkan ránṣẹ́ nípasẹ̀ proxy SOCKS, àti ọ̀pọ̀ àwọn ẹrọ SOCKS5 kò fi UDP ASSOCIATE sílẹ̀ rí, nítorí náà àpẹẹrẹ tí ó dá lórí proxy ń sọnù tàbí ń tú UDP nígbà tí TCP dàbí ẹni tí ó ní ìlera.
Ìdènà kejì yẹn ni ìdí tí ìlànà tí ó dá lórí UDP fi lè ṣiṣẹ́ lórí nẹ́tíwọ́kì lasan tí ó sì kùnà ní àkókò tí VPN rẹ bá so mọ́. Tí a bá retí pé ọ̀nà abẹ́lẹ̀ yóò gbé UDP, olùgbéjáde gbọdọ̀ ṣe ìmúṣẹ ọ̀nà gbígbéjáde fún un, kì í ṣe ọ̀nà TCP pẹ̀lú irú socket mìíràn nìkan.
Ṣàyẹ̀wò ní ìtẹ̀léntẹ̀lẹ̀ yìí
Ṣiṣẹ́ lórí àtòjọ náà ní ìtẹ̀léntẹ̀lẹ̀ kí o sì dúró ní ìpele àkọ́kọ́ tí ó kùnà, nítorí gbogbo àyẹ̀wò tó kàn jẹ́ ariwo títí ti ìṣáájú yóò fi dúró.
- Ṣàkọsílẹ̀ àwọn ọ̀nà tí a fi sí, kí o sì jẹ́rìí bóyá àwọn packet tí kì í ṣe DNS ń wọnú ibi-ìsopọ̀ TUN rárá.
- Ṣàkọsílẹ̀ orúkọ ìbéèrè, ìpinnu àti kóòdù ìdáhùn fún orúkọ kan tí a dènà àti ọ̀kan tí a fọwọ́ sí.
- Jẹ́rìí pé socket olùyẹ́nà ní ààbò àti pé olùyẹ́nà tí a yàn ń dáhùn láti inú ọ̀nà abẹ́lẹ̀.
- Jẹ́rìí MTU ibi-ìsopọ̀ àti checksum ìdáhùn kan tí o kọ́ pẹ̀lú ọwọ́.
- Tún ojú-ìwé náà ṣe lórí Wi-Fi àti lórí nẹ́tíwọ́kì alágbèéká, nítorí àwọn olùyẹ́nà alágbèéká àti MTU ọ̀nà yàtọ̀.
Tí gbogbo márùn-ún bá dúró tí ojú-ìwé náà sì ṣì ń dúró, ẹni tí a fẹ̀sùn kàn tó kàn ni olùgbéjáde fúnra rẹ̀: fi ìbéèrè tí a mú wé ìdáhùn tí a mú, kí o sì wá ìṣirò byte tí ó ṣáà tàbí socket tí ó ti dílẹ̀ ní ìdajì. Ìtọ́kasí VpnService.Builder bo àwọn àdéhùn ọ̀nà, DNS àti MTU, àti protect() jẹ́ ìpè VpnService lọ́tọ̀ kì í ṣe àṣàyàn builder; ibi-ìsopọ̀ tí ó so mọ́ ń túmọ̀ sí pé àdéhùn àkọ́kọ́ ni a ti mú ṣẹ nìkan.