Ọ̀nà méjì lè gbé ipò ìsopọ̀ IP sí iwájú ìtẹ̀jáde Android, àti méjèèjì parí ní irú kan náà ìwé àpèjúwe fáìlì pẹ̀lú àwọn olówó tí ó yàtọ̀ pátápátá. Ọ̀kan ń gba VpnService àti builder rẹ̀, èkejì ń gba root shell àti /dev/net/tun. Gbogbo ìkànsíórí àpèjúwe yẹn jẹ́ àkópọ̀ tí ń jáde, gbogbo àkọsílẹ̀ sì jẹ́ àkópọ̀ tí ń wọlé. Ohun tí ó ya àwọn ọ̀nà yẹn jẹ́ ẹni tí ó di ìlànà mú, ẹni tí ó ye ìgbésókè OS, àti iye tí ó wà nínú tábìlì ọ̀nà tí o lè fi ọwọ́ kàn.

Gba ọ̀nà pẹpẹ náà àyàfi tí o bá lè dárúkọ ohun pàtó tí ó kọ̀ láti ṣe. Ìkọ̀ yẹn sábà jẹ́ TAP, gbígbà níta ẹ̀ka àwọn ìtẹ̀jáde rẹ, tàbí ìlànà ọ̀nà tí framework kò fi hàn rí.

Ní ọ̀nà pẹpẹ, o ń kéde èròdí dípò àṣẹ. O ń fún ní kéréèkéré àdírẹ́sì kan, àwọn ọ̀nà tí o fẹ́, àwọn olùpín DNS àti àkójọ ìtẹ̀jáde àṣàyàn, lẹ́yìn náà iṣẹ́ ẹ̀rọ Android yóò ṣe ètò àṣẹ-olówó náà lábẹ́ ìdánimọ̀ rẹ̀ fúnra rẹ̀. O kò mọ orúkọ ìsopọ̀ náà ṣáájú, o kò sì gbé ioctl tí ó dá a jáde rí, àti pé ìyẹn ni kókó.

Ọ̀nà méjì láti gba ìsopọ̀ IP

Ọ̀nà root ni ìlànà àtijọ́. O ń ṣí /dev/net/tun, o ń pe TUNSETIFF pẹ̀lú IFF_TUN, o ń gbé ìsopọ̀ sókè pẹ̀lú ip link, o sì ń fi ọwọ́ kún àwọn àdírẹ́sì àti ọ̀nà. Gbogbo ìgbésẹ̀ ni tìrẹ láti ṣe dáadáa, pẹ̀lú àwọn tí framework ìbá ti ṣe ní ìdákẹ́jẹ́ẹ́. Ọ̀nà kan tí ó ṣonù ń fún olùlò ní ìròyìn kan náà bí olùpín tí ó kú.

Wíwá àṣìṣe yàtọ̀ gẹ́gẹ́ bí ètò. Ní ọ̀nà root, ìsopọ̀ wà tàbí ioctl rẹ ti dá àṣìṣe padà tí o lè kà ní tààrà. Ní ọ̀nà pẹpẹ, ìsopọ̀ wà lẹ́yìn tí establish() bá ṣe àṣeyọrí, nítorí náà ìkùnà ń bọ̀ gẹ́gẹ́ bí àfikún tàbí null àpèjúwe dípò kókó ẹ̀rọ tí o lè fi ọwọ́ wò.

Ohun tí establish() ń dá padà gan-an

Builder.establish() ní ìpinnu mẹ́ta, ọ̀kọ̀ọ̀kan sì nílò ìdáhùn ọ̀tọ̀ọ̀tọ̀. Àpèjúwe túmọ̀ sí pé ìsopọ̀ ti ṣètò, ó sì jẹ́ tìrẹ fún lílò, null túmọ̀ sí pé ìbéèrè kò kọjá, àfikún tí a sọ jáde sì túmọ̀ sí pé iṣẹ́ ẹ̀rọ ti kọ̀ ọ́. Sísopọ̀ null àti àṣeyọrí sí boolean kan ni ọ̀nà tí ó wọ́pọ̀ jùlọ tí ìtẹ̀jáde fi ń ròyìn ọ̀nà-ìsàlẹ̀ tí ń ṣiṣẹ́ tí kò sì gbé àkópọ̀ kankan rí. Ìwé ìtọ́kasí Builder ń sọ èrè àdírẹ́sì, ó sì yẹ kí o kà á kí o tó di olùpín lẹ́bi.

Àwọn ìtọ́sọ́nà ni àpèjúwe ń pinnu, kì í ṣe ìlànà rẹ. Ìkànsí ń fún ọ ní àwọn àkópọ̀ tí ń jáde tí a ti yàn fún VPN, àkọsílẹ̀ sì ń fi àwọn àkópọ̀ tí ń wọlé padà sínú ìsopọ̀. Ìgbékalẹ̀ rẹ fúnra rẹ ni ó ń fi àṣírí bo, ń jẹ́rìí àti ń ṣe àgbékalẹ̀ àwọn àkópọ̀ yẹn, nítorí pé pẹpẹ náà dúró ní ààlà àkópọ̀.

Binder jẹ́ ìgbésẹ̀ kan, JNI jẹ́ ìlà mìíràn

Ìbéèrè builder ń gba Binder wọ inú ẹ̀rọ, níbìkan sì lábẹ́ rẹ̀ pẹpẹ ń pe kóòdù ìbílẹ̀ láti ṣètò ẹ̀rọ náà. Ìwọ̀nyí jẹ́ ẹ̀rọ méjì ọ̀tọ̀ọ̀tọ̀ tí a kó pọ̀ sínú ìpè kan. Binder jẹ́ ìbáraẹnisọ̀rọ̀ láàárín àwọn ìlànà láàárín ìtẹ̀jáde rẹ àti iṣẹ́ ẹ̀rọ, nígbà tí JNI jẹ́ afárá láti Java sí ìbílẹ̀ nínú ìlànà kan. Kíkà igi AOSP ti Android 9 ń jẹ́ kí àkópọ̀ náà hàn ní tààrà, ó sì yẹ kí a rántí pé àwọn orúkọ kíláàsì inú àti àwọn ipa fáìlì ń yí padà láàárín àwọn ìtúsílẹ̀.

Ohun tí kò yí padà ni àdéhùn tí o lè gbẹ́kẹ̀ lé: builder, àpèjúwe tí ó ń dá padà, àti ìyípo ìgbésí-ayé iṣẹ́ náà yí i ká. Kò sí ìtẹ̀jáde tí ó yẹ kí ó pe ìbáraẹnisọ̀rọ̀ iṣẹ́ inú tàbí kí ó tún kókó ẹ̀rọ dá láti gba ìsopọ̀. Tí kóòdù rẹ bá gbẹ́kẹ̀ lé orúkọ kíláàsì AOSP, yóò já ní ìtúsílẹ̀ tí o kò dán wò.

TUN ń gbé IP, TAP ń gbé Ethernet

TUN jẹ́ ìsopọ̀ IP. TAP jẹ́ ìsopọ̀ Ethernet, ìyàtọ̀ yẹn sì ń pinnu bóyá afárá ṣeé ṣe rárá. Ẹ̀rọ TUN kò ní àdírẹ́sì MAC, kò sì ní orí-ìwé Ethernet láti gbé lọ, nítorí náà olùlò TUN kò lè darapọ̀ mọ́ afárá ìpele 2, bí a ṣe kọ àwọn ọ̀nà náà.

VpnService ń fún ọ ní ẹ̀yà IP, èyí ni ohun tí VPN ní ìpele ìtẹ̀jáde nílò àti ohun tí ó lè ṣe àtìlẹ́yìn fún láìsí àkópọ̀ Ethernet àìtọ́. Tí àwòṣe rẹ bá nílò afárá, ọ̀nà pẹpẹ kò ní gbé ọ lọ síbẹ̀, ọ̀nà root yóò ṣe bẹ́ẹ̀ nìkan tí kẹ́nẹ́lì àti àwọn àṣẹ ẹ̀rọ bá fọwọ́ sowọ́pọ̀.

Níbi tí ọ̀nà root ṣì ń borí

Iṣẹ́ mẹ́ta ń ti àwọn ènìyàn sẹ́yìn kúrò ní ọ̀nà pẹpẹ. Afárá ìpele 2 nílò TAP. Gbígbà ìrìn àwọn ìtẹ̀jáde níta ìwọ̀n VPN rẹ nílò ìríran tí framework kò fún. Ìtọ́sọ́nà ìlànà tí builder kò fi hàn rí, bí tábìlì ọ̀tọ̀ fún ibi-ìdí kan, nílò àwọn ìlànà tí ìwọ fúnra rẹ fi sórí ẹ̀rọ.

Àwọn owó ń bọ̀ lẹ́yìn: bootloader tí a ṣí, tàbí àwòrán tí a fi root ṣe, ìlànà SELinux tí ń yí lábẹ́ rẹ, àti ẹ̀rọ tí kò ní hùwà dáadáa mọ́ lẹ́yìn OTA. Ìlànà root kò tún lè jáde nípasẹ̀ ìpínkiri ìtẹ̀jáde deede, nítorí náà ọ̀pọ̀lọpọ̀ ẹgbẹ́ ń pa á mọ́ gẹ́gẹ́ bí ọ̀nà àyẹ̀wò inú dípò ọjà.

Yíyan láàárín àwọn méjèèjì

Bẹ̀rẹ̀ láti ìsopọ̀ tí o nílò, kì í ṣe kóòdù tí o ní. Tí ìdáhùn bá jẹ́ ẹ̀rọ TUN pẹ̀lú àwọn ọ̀nà tí a fi ààlà sí ìtẹ̀jáde, ọ̀nà pẹpẹ kúrú, ó sì ń ye ìgbésókè. Tí ìdáhùn bá ní àwọn férémù Ethernet, gbígbà àwọn ìtẹ̀jáde mìíràn, tàbí àwọn ìlànà ọ̀nà tí builder kọ̀, o wà ní agbègbè root, ó sì yẹ kí o ṣe ìṣirò rẹ̀ gẹ́gẹ́ bí owó ìṣiṣẹ́.

Àyẹ̀wò kan tí ń yanjú ọ̀pọ̀lọpọ̀ àríyànjiyàn: kọ́ ọ̀nà pẹpẹ kí, kọ àbájáde establish() sílẹ̀ lọ́tọ̀ sí ipò ìpàdé jíjìnnà, kí o sì jẹ́rìí àkópọ̀ kan ní gbogbo ìtọ́sọ́nà. Lẹ́yìn náà nìkan ni kí o pinnu bóyá agbára tí ó ṣonù ń dá ọ̀nà tí a ṣe àtìlẹ́yìn fún lẹ́bi láti fi sílẹ̀.

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