Android VpnService ń so mọ́ra ṣùgbọ́n kò sí pákẹ́tì tí ó dé nẹ́tíwọ́kì
Tunnel wà ṣùgbọ́n àwọn ojú-ìwé ṣì kùnà: yẹ ipò kíkà, ààbò socket, àtìlẹ́yìn TCP àti àkójọ ọ̀nà kí o tó fi ẹ̀sùn kan olùpèsè VPN.
Tunnel gòkè, àmì kọ́kọ́rọ́ farahàn, ṣùgbọ́n gbogbo ìbéèrè nínú aṣàwákiri ṣì ń parí pẹ̀lú àkókò. Nínú ètò VpnService àpapọ̀ yẹn sábà máa ń túmọ̀ sí pé ìṣẹ̀ṣẹ̀ kíkà wà láàyè àti pé ìdajì ìjáde ti bàjẹ́, kì í ṣe pé olùpèsè kọ ìfọwọ́sowọ́pọ̀. Android ti ṣẹ̀dá interface, ti gbé ìrìnàjò ètò náà sínú rẹ̀, ó sì ti fi descriptor fáìlì fún ìlànà rẹ. Ohunkóhun tí ó wà lẹ́yìn descriptor yẹn ni kóòdù rẹ, ìpè kan tí ó ṣáákiri sì tó láti gbé gbogbo ìṣàn náà mì.
Ohun tí ètò ń fún ọ àti ohun tí kò fún ọ
establish() ń dá ParcelFileDescriptor padà fún interface tun. Ètò náà ń kọ àwọn pákẹ́tì IP tí ó ń jáde sínú rẹ̀ ó sì retí pé ìlànà rẹ yóò kà wọ́n, pinnu ibi tí wọ́n ń lọ, kí ó sì fi wọ́n ránṣẹ́ nípasẹ̀ socket lasan. Kò sí gbígbé káàkiri nínú kérnẹ́lì lábẹ́, nítorí náà nígbà tí kò bá sí ẹnìkan tí ń kà, àwọn pákẹ́tì ni a sọnù àwọn òǹkà interface kò sì yí padà rárá.
Bẹ̀rẹ̀ pẹ̀lú kíkà dípò dídi. Fi ọ̀kan kún òǹkà ní gbogbo ìkà tí ó ṣàṣeyọrí kí o sì kọ ibi-àfojúsùn àti ètò àwọn pákẹ́tì àkọ́kọ́ sílẹ̀. Tí òǹkà bá dúró ní òdo nígbà tí ìrìnàjò ń ṣẹ̀dá, àṣìṣe wà lókè kóòdù gbígbé rẹ, èyí tí ó dín ìwárí kù sí ìṣètò builder àti ipò kíkà. Tí òǹkà bá yí padà tí aṣàwákiri sì ṣì kùnà, àṣìṣe wà ní ọ̀nà fífi ránṣẹ́ tàbí ọ̀nà ìpadà.
Kíkà tí ń díni ń pinnu bóyá ìṣẹ̀ṣẹ̀ yóò yí
setBlocking(true) ń fi descriptor sínú ipò dídíni ó sì ti wà láti API 21. Nínú àwọn àtẹ̀jáde àtijọ́, ojútùú ni olùrànlọ́wọ́ JNI kékeré tí ń pa O_NONBLOCK kùrò pẹ̀lú fcntl lórí descriptor àìgbà.
Nínú ipò àìdíni kíkà yẹn ń padà lẹ́sẹ̀kẹsẹ̀ pẹ̀lú iye òdì, ìṣẹ̀ṣẹ̀ tí kò ka àbájáde sí yóò yi kóòdù kan káà lai gbé ìrìnàjò kankan. Nínú ipò dídíni kíkà ń dúró, èyí tí ìtẹ́ẹ̀ǹtí gbígbé fẹ́, ṣùgbọ́n lẹ́yìn náà a kò lè dá ìtẹ́ẹ̀ǹtí dúró mọ́. Pípa descriptor mọ́ ni ọ̀nà tí a ṣe àtìlẹ́yìn fún láti mú kíkà kùnà kí ìṣẹ̀ṣẹ̀ lè jáde. Pípa ìlànà tàbí dídá ìtẹ́ẹ̀ǹtí dúró lè fi ìbẹ̀rẹ̀ tó kàn sílẹ̀ pẹ̀lú descriptor tí kò bá interface mu mọ́.
Ka pákẹ́tì kan ní gbogbo ìpè sínú búfà kan tí ó dà bí MTU interface, kí o sì kà òdo tàbí ìpadà òdì sí àṣìṣe, kì í ṣe pákẹ́tì òfìfo.
protect() ṣáájú fífi ránṣẹ́ àkọ́kọ́, kì í ṣe lẹ́yìn
Gbogbo socket tí ó ń gbé pákẹ́tì tí a kó mọ́ra gbọ́dọ̀ ní ààbò ní àkọ́kọ́. Socket tí kò ní ààbò ń tẹ̀lé àwọn òfin ọ̀nà kan náà tí o ṣẹ̀ṣẹ̀ gbé kalẹ̀, nítorí náà àwọn pákẹ́tì rẹ̀ padà sínú tunnel ìṣẹ̀ṣẹ̀ kíkà rẹ sì tún gbé wọn. Lẹ́yìn náà tunnel ń gbé ìjáde tirẹ̀ káà láìlópin, àti láti ìta ó dà bí ìsopọ̀ tí ó ṣí ṣùgbọ́n tí kò dáhùn rárá.
Ìtẹ̀lé ni protect, lẹ́yìn náà connect tàbí bind, lẹ́yìn náà send. Pípe protect lẹ́yìn connect lè fi ìpinnu ọ̀nà àtẹ́lẹ̀ sílẹ̀, nítorí náà socket ń tẹ̀síwájú lílo ọ̀nà tí kò tọ́ bí ìpè tilẹ̀ dá true padà. Yẹ boolean tí ó ń dá padà kí o sì kùnà ní gbóhùngbóhùn nígbà tí ó jẹ́ false dípò wíwọ inú fífi ránṣẹ́ tí kò lè ṣiṣẹ́.
Àṣìṣe àṣẹ láti sendto lórí socket tí kò fọwọ́ kàn protect() rí ni àmì ìdánimọ̀ àṣìṣe yìí.
Àpẹẹrẹ UDP kò gbé HTTPS
Àpẹẹrẹ gbígbé tí ọ̀pọ̀ ìkẹ́kọ̀ọ́ ń dà ni ń ṣe pẹ̀lú UDP nìkan. TCP nílò ìfọwọ́sowọ́pọ̀, àwọn nọ́mbà ìtẹ̀lé, àwọn ìjẹ́rìí àti àtúnránṣẹ́, ìṣẹ̀ṣẹ̀ tí ń dà ẹrù láàárín descriptor tun àti socket kò sì pèsè ọ̀kan nínú wọn. Ìdí ni pé ìbéèrè DNS nípasẹ̀ UDP lè kọjá nígbà tí gbogbo ìbéèrè HTTPS ń dúró. Yálà ṣiṣẹ́ àkójọ TCP nínú ààyè olùmúlò tàbí fi àwọn ìsopọ̀ fún proxy àdúgbò tí ń parí TCP lórí ẹ̀rọ kí ó sì gbé ìṣàn náà lọ.
Dán ìpínyà wò kí o tó tún ohunkóhun kọ: fi ìbéèrè UDP kan ránṣẹ́ kí o sì ṣí ìsopọ̀ TCP kan sí host kan náà. Tí ọ̀nà UDP bá ṣiṣẹ́ tí ọ̀nà TCP sì dúró ní SYN àkọ́kọ́, kóòdù gbígbé ni ìṣòro kì í ṣe olùpèsè. Ìfiwéra kan yẹn ń fi àkókò púpọ̀ pamọ́ tí a ń lò láti ka àwọn àkọsílẹ̀ olùpèsè tí kò ní ohun kan tí ó wúlò.
Àkójọ ọ̀nà àti àwọn àlẹ̀mọ́ fún ètò kọ̀ọ̀kan ń dín ohun tí o rí kù
addAddress, addRoute àti addDns ń pinnu ohun tí ètò ń ránsẹ́ sínú tunnel. Ibi-àfojúsùn tí ó wà ní òde àkójọ ọ̀nà kò ní dé descriptor rẹ rárá, nítorí náà kò sí iye ọgbọ́n gbígbé tí yóò tún un ṣe. Kọ àwọn ìpè builder tí o ń ṣe kí o sì fi wọ́n wé àwọn àdírẹ́sì tí ètò náà ń gbìyànjú láti dé.
Yíyàn fún ètò kọ̀ọ̀kan ní ìsàlẹ̀ tirẹ̀: addAllowedApplication àti addDisallowedApplication nílò API 21, àti nínú àwọn àtẹ̀jáde àtijọ́ àwọn ọ̀nà wọnnì kò sí rárá. Àpẹẹrẹ tí ń ṣe àlẹ̀mọ́ nípasẹ̀ pákẹ́tì kò lè ṣiṣẹ́ níbẹ̀ rárá.
Àtúntò ń fi àwọn descriptor àtijọ́ sílẹ̀
Pípe establish() lẹ́ẹ̀kan sí i ń dá descriptor tuntun padà ó sì pa interface àtẹ́lẹ̀ mọ́. Descriptor àtijọ́ kò wúlò mọ́, nítorí náà ìtẹ́ẹ̀ǹtí tí ó ṣì díni lórí rẹ̀ gba àṣìṣe, àwọn socket tí a ṣẹ̀dá fún ọ̀nà àtijọ́ sì lè nílò pípààrọ̀. onRevoke ni ìpèpadà fún tunnel tí olùmúlò tàbí ètò ti gbà. Mímú ìgbésí-ayé dán lọ́wọ́ olùní kan, tí ń dá olùkà dúró kí ó tó tún ṣe, ń dènà ọ̀pọ̀ jùlọ àwọn ipò tí a ti so mọ́ ṣùgbọ́n tí ó ti kú.
Ka gbogbo àṣìṣe ní ìbámu pẹ̀lú ìgbésẹ̀ tí ó jẹ mọ́. Àtúntò ìsopọ̀ láti recvfrom túmọ̀ sí pé ìpẹ̀kun jíjìnnà ti pa mọ́ nígbà tí kóòdù rẹ ṣì ń kà. Àṣìṣe àdírẹ́sì tí kò tọ́ ń tọ́ka sí àyẹ̀wò orí-ọ̀rọ̀ tàbí àṣìṣe àìsí-ìbá, kì í ṣe sí nẹ́tíwọ́kì.
Ìtẹ̀lé iṣẹ́: ipò dídíni ṣí, pákẹ́tì kan fún ìkà, orí-ọ̀rọ̀ ti a yẹ̀wò, socket ní ààbò, ẹrù ti a ránṣẹ́, pípa mọ́ tí ó mọ́ nígbà ìfàṣẹ́ àti àkójọ ọ̀nà tí ó bo ibi-àfojúsùn.