Ọ̀nà tí a fi kún tábìlì main lórí Android dàbí ẹni tí ó tọ́ nínú gbogbo àkọsílẹ̀, síbẹ̀ kò gbé ìrìnàjò náà. Ìdí ni pé tábìlì main jẹ́ ọ̀kan nínú ọ̀pọ̀ àṣàyàn, a kì í kọ́kọ́ béèrè lọ́wọ́ rẹ̀. Iṣẹ́ nẹ́tíwọ́kì Android ń kọ àwọn òfin ètò ìṣèlú tí wọ́n ń yan tábìlì ìpadà-ọ̀nà pẹ̀lú ìsọfúnni tí àdírẹ́sì ibi-àfojúsùn kò ní — uid app, àmì lórí pákẹ́tì, interfaci tí ó ti wá — ìwákiri ibi-àfojúsùn sì ń ṣẹlẹ̀ lẹ́yìn náà, nínú tábìlì tí àwọn òfin yẹn yàn.

Ìpinnu mẹ́ta ní ìtẹ̀lẹ́ntẹ̀lẹ́ kan

Pákẹ́tì tí ń jáde ń ṣe ìpinnu mẹ́ta ọ̀tọ̀ọ̀tọ̀. Ní àkọ́kọ́, òfin ètò ìṣèlú ń pinnu tábìlì ìpadà-ọ̀nà wo ni ó wúlò. Ní èkejì, ọ̀nà kan nínú tábìlì yẹn ń pinnu ìgbésẹ̀ tó ń bọ̀ àti interfaci ìjáde. Ní ẹ̀kẹta, àwọn ìkọ̀ netfilter ń pinnu bóyá pákẹ́tì yóò yè, yóò yí padà, tàbí a ó darí rẹ̀.

Ìtẹ̀lẹ́ntẹ̀lẹ́ ṣe pàtàkì nítorí ìpele kọ̀ọ̀kan lè dáhùn ìbéèrè tirẹ̀ nìkan. Òfin ògiri iná tí ó gba pákẹ́tì kò yan tábìlì, ọ̀nà tí a fi kún tábìlì tí kò sí òfin tí ó yàn ú kò ní ipa. Ọ̀pọ̀ ìdàrúdàpọ̀ nípa VPN Android ń wá láti inú títún ọ̀kan nínú mẹ́ta ṣe àti àìrí ìyípadà, nítorí àṣìṣe wà nínú òmíràn.

StageSelectorWhat it cannot decide
Policy ruleuid range, mark, incoming interfaceWhich route exists inside the table
Route lookupDestination prefix, longest matchWhether the packet is allowed out
Netfilter hookChain position, match conditionsWhich table was selected

Àwọn àmì jẹ́ pápá tí a kó pọ̀, kì í ṣe àmì-ìdánimọ̀ tí ìwọ ní

Android ń kó ọ̀pọ̀ òtítọ́ pọ̀ sínú iye àmì kan náà: nẹ́tíwọ́kì wo ni a yàn, bóyá app yàn nẹ́tíwọ́kì ní gbangba, bóyá a dáàbò bo socket lọ́wọ́ VPN, àti àwọn bíìtì tó ní í ṣe pẹ̀lú àwọn àṣẹ. Àkọlé fwmark AOSP ń ṣàlàyé ìtò yẹn fún igi ìsinsìnyí, ìtò náà sì jẹ́ àlàyé inú pẹlẹbẹ tí ń yí padà láàrín àwọn ìtújáde.

Ìdí ni pé lórí Android ó léwu láti kọ gbogbo iye àmì pẹ̀lú iptables -j MARK --set-mark. Kò fi àmì kún; ó rọ́pò ìyàn nẹ́tíwọ́kì tí ẹ̀rọ náà ti ṣe. Pákẹ́tì yóò bá àwọn òfin mìíràn mu, èyí tí ó lè dàbí pé VPN bẹ̀rẹ̀ iṣẹ́, tàbí bí ẹni pé app tí kò ní í ṣe pẹ̀lú pàdánù ìsopọ̀, dá lórí àwọn bíìtì tí a tún kọ.

Bí ó bá pọn dandan láti fi ọwọ́ kan àwọn àmì, kọ́kọ́ ka iye ìsinsìnyí kí o sì lo ìbòjú kí àwọn bíìtì tí ìwọ yé lè yí padà nìkan:

ip rule show
ip route show table all | head -40
ip route get 10.20.4.11

Àmì ìsopọ̀ jẹ́ ohun ọ̀tọ̀ sí àmì pákẹ́tì, kò sì sí èyí tí í ṣe ọ̀nà. Mímú àmì padà lórí àwọn pákẹ́tì ìdáhùn jẹ́ ìgbésẹ̀ ọ̀tọ̀ sí yíyan tábìlì nígbà ìjáde, ìdí ni pé àwọn àtúnṣe ọ̀nà kan ń dá àwọn ìsopọ̀ tí ó ṣí, tí ó sì di àré.

Ta ni ó ní àwọn òfin àti àwọn tábìlì

Iṣẹ́ nẹ́tíwọ́kì Android, netd, ń dá àwọn òfin àti àwọn tábìlì fún nẹ́tíwọ́kì kọ̀ọ̀kan. AOSP RouteController ni ibi tí a ti kó àwọn òfin yẹn fún VPN, nẹ́tíwọ́kì ti ara àti ìwọ̀n uid, ìgbà-ìgbé rẹ̀ sì so mọ́ àwọn ìṣẹ̀lẹ̀ nẹ́tíwọ́kì dípò fáìlì ìtòlẹ́sẹẹsẹ.

Àbájáde méjì tẹ̀lé. Ní àkọ́kọ́, àwọn ipò àti nọ́mbà tábìlì tí o bá lórí ẹ̀rọ kan jẹ́ kúlẹ̀kúlẹ̀ inú ìkọ́, kì í ṣe interfaci: àwọn nọ́mbà tí wọ́n dàbí ara wọn lórí ẹ̀yà Android mìíràn lè túmọ̀ sí ohun mìíràn pátápátá. Ní èkejì, a ń tún ipò kọ́ nígbà tí nẹ́tíwọ́kì bá yí padà, nítorí náà òfin tí a fi sí i lónìí láti shell root lè ti pòórá lẹ́yìn ìyípadà Wi-Fi tó ń bọ̀.

Ìpòórá yẹn ni a sábà máa ń ròyìn bí ẹni pé ẹ̀rọ ń kọ ojú sí ọ̀nà kan. Ohun tí ó ṣẹlẹ̀ gbáà ni pé òfin tí ó yan tábìlì kò sí mọ́, ọ̀nà inú tábìlì sì di aláìlèdé ní ojú pákẹ́tì. Ṣàyẹ̀wò àkọsílẹ̀ òfin, kì í ṣe àkọsílẹ̀ ọ̀nà, nígbà tí ìtòlẹ́sẹẹsẹ tí ń ṣiṣẹ́ bá dáwọ́ ṣiṣẹ́ lẹ́yìn ìsopọ̀ padà.

Ìbéèrè nípa ìtẹ̀lẹ́ntẹ̀lẹ́ àwọn ìkọ̀ kò ní ìdáhùn gbogbogbò

Ìbéèrè bóyá iptables ń ṣiṣẹ́ ṣáájú ìpadà-ọ̀nà VPN kò lè dáhùn láìdárúkọ ọ̀nà pákẹ́tì. Pákẹ́tì tí a dá níbílẹ̀ ń gba ìkọ̀ output kọjá, níbẹ̀ ni ìyípadà àmì ti ń ru ìṣàyẹ̀wò ìpadà-ọ̀nà padà — ìwákiri kejì, kì í ṣe àtúnṣe ẹ̀yìn ti èkínní. Pákẹ́tì tí ó ti ọ̀dọ̀ oníbàárà tether wá ń gba ọ̀nà prerouting kọjá a sì gbé e lọ dípò, àwọn ẹ̀wọ̀n tí ó rí i sì yàtọ̀.

Nítorí náà òfin kan náà lè lè ṣiṣẹ́ fún ìrìnàjò app kan tí kò sì hàn fún ìrìnàjò tether, kíkà tí ó dúró ní òdo sì sọ fún ọ ọ̀nà tí pákẹ́tì gbà, kì í ṣe bóyá òfin náà tọ́. Lo àwọn kíkà láti fi ọ̀nà múlẹ̀ kí o tó yí ipò ìbámu kankan padà.

Èyí tún ni ìpele tí àṣìṣe ìpadà-ọ̀nà ètò ìṣèlú ti ń ṣòro láti rí. Ìpadà-ọ̀nà sí tábìlì tí ó wà ṣùgbọ́n tí kò ní ibi-àfojúsùn ń mú nẹ́tíwọ́kì aláìlèdé jáde tí ó dàbí ìjákulẹ̀ ògiri iná, nígbà tí ìjákulẹ̀ ògiri iná ń mú àkókò parí tí ó dàbí ihò dúdú ìpadà-ọ̀nà.

Ṣàyẹ̀wò nínú ẹ̀rọ náà, tàbí fi í sílẹ̀

Fún àyẹ̀wò tí a fọwọ́ sí, fi òtítọ́ mẹ́rin múlẹ̀ kí o tó fi ọwọ́ kan ohunkóhun: uid àti profáìlì app, nẹ́tíwọ́kì tí Android yàn fún un, bóyá VPN ní app yẹn nínú rárá, àti bóyá ìṣòro wà fún àwọn ìdílé àdírẹ́sì méjèèjì. Ìyọkúrò fún app kọ̀ọ̀kan ń ṣàlàyé ọ̀pọ̀ ìròyìn VPN kò ṣiṣẹ́ láìsí àṣìṣe ìpadà-ọ̀nà kankan.

Lẹ́yìn náà ka àwọn òfin, ìbòjú àti àwọn tábìlì tí ó wà lóòótọ́ lágbára, kí o sì pa ìyípadà nẹ́tíwọ́kì mọ́ nínú fèrèsé àkíyèsí. Bí ìhùwàsí bá yí padà káàkiri ìsopọ̀ padà, ìwọ ń wo ìgbà-ìgbé tí a ń ṣàkóso, kì í ṣe ọ̀nà tí ó sọnù.

Fún àwọn àìní deede, lo àwọn ìṣàkóso tí a ṣètìlẹ́yìn fún: ìkójọpọ̀ àti ìyọkúrò fún app kọ̀ọ̀kan nínú ohun èlò VPN, àti yíyan nẹ́tíwọ́kì ti pẹlẹbẹ fúnra rẹ̀ fún ohunkóhun tí ó nílò ọ̀nà pàtó. Bí ìsopọ̀ àṣẹ-pàtàkì bá ní láti fọwọ́ sowọ́pọ̀ pẹ̀lú ẹ̀rọ ìpadà-ọ̀nà ní ti gidi, darí ìmúṣẹ ẹ̀yà Android gangan tí ìwọ ń ṣètìlẹ́yìn fún, kí o sì tọ́jú ìgbà-ìgbé rẹ̀ nípasẹ̀ ẹ̀ka tí ó ní í. Fífọ́ àwọn ẹ̀wọ̀n pẹlẹbẹ mọ́ tàbí fífi òfin ipò gíga sí i yóò yí ìṣàyẹ̀wò padà sí olùṣàkóso nẹ́tíwọ́kì kejì, fọ́nù yóò sì hùwà ní ìbámu pẹ̀lú.

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