Pínpín tunnel ní Android VpnService: ohun tí o le fi ọ̀nà rán ní ti gidi
VpnService kìkì ń fi àwọn pákétì tí builder gbé sínú àpèjúwe rẹ̀ kọjá. Ṣàyẹ̀wò àwọn àkọ́sọ́nà, ìjẹ́rìí proxy, DNS àti àkọsílẹ̀ àwọn áàpù kí o tó fi ẹ̀sùn kan pínpín tunnel.
Pínpín tunnel nínú áàpù VpnService máa ń já ní àwọn ibi pàtó kan, ìtúnṣe kọ̀ọ̀kan sì yàtọ̀. Olùṣe máa ń fi ibi kan tí ó kùnà hàn nìkan, nítorí náà iṣẹ́ àkọ́kọ́ ni láti mọ̀ ààlà wo ni o ń kàn: àwọn ọ̀nà tí builder gbà, proxy tí o kò lè jẹ́rìí, resolver tí o kàn kéde, tàbí àkọsílẹ̀ áàpù tí pẹtẹ́lì ń lò fún olùmúlò kọ̀ọ̀kan. Ìdí nìyẹn tí mo fi ń pa àyẹ̀wò ìgbésẹ̀ mẹ́rin mọ́. Ó ń lọ ní tẹ̀léra tí ó wà nísàlẹ̀ yìí ó sì dúró ní ìkùnà àkọ́kọ́.
Jẹ́rìí ohun tí builder fún pẹtẹ́lì
VpnService.Builder jẹ́ àkọsílẹ̀ àwọn ìkéde. establish() ń dá ParcelFileDescriptor padà fún ojú-ọ̀nà àròyé, pẹtẹ́lì sì ń fi kìkì ìgbòkègbodò tí ó bá àwọn àkọ́sọ́nà addAddress àti addRoute mu lọ sínú àpèjúwe yẹn; addDnsServer ń sọ fún àwọn olùṣe irú resolver tí wọ́n yẹ kí wọ́n béèrè. Ibi tí ó wà ní òde gbogbo àkọ́sọ́nà tí o fi kún kò ní dé áàpù rẹ láéláé, ohunkóhun tí ojú-ọ̀nà bá ṣèlérí. Òtítọ́ kan yìí ń ṣàlàyé ọ̀pọ̀lọpọ̀ ìròyìn nípa pínpín tunnel tí ó já kí a tó yí kóòdù padà.
Ṣàkọsílẹ̀ àwọn àkọsílẹ̀ àdírẹ́sì, ọ̀nà àti DNS tí builder rẹ ṣe, lẹ́yìn náà fi wọ́n wé àwọn ibi tí ó kùnà. /32 tí ó ṣẹ́ kù fún ẹ̀rọ ìṣàkóso wọ́pọ̀ ju tunnel tí ó já lọ. Bí àkọsílẹ̀ bá tọ́, tẹ̀síwájú; bí kò bá tọ́, ìyókù àkọsílẹ̀ àyẹ̀wò jẹ́ iṣẹ́ asán.
excludeRoute wà lẹ́yìn API 33 nìkan
Ìyọkúró tí ó dá lórí ibi ni ìbéèrè tí ó máa ń di ìlà ìtìlẹ́yìn ní ọ̀pọ̀ ìgbà. builder.excludeRoute(IpPrefix) dé ní API 33; kí ó tó dé, ọ̀nà kan ṣoṣo tí a ń tìlẹ́yìn ni láti fi àwọn ọ̀nà kún gbogbo nǹkan àyàfi àkọ́sọ́nà tí a yọkúró, ìyẹn ni pé kí o ka àwọn àkọ́sọ́nà àfikún fúnra rẹ. Àwọn ìpè méjèèjì kì í ṣe àwòrán dígí: ọ̀kan ń yọ kúrò nínú àkójọ ọ̀nà ojú-ọ̀nà, èkejì ń kọ́ àkójọ láti òdo, ẹ̀rọ àtijọ́ yóò sì sọ ìpè tí kò mọ̀ tàbí kí ó fojú fo pẹ̀lú ìdákẹ́jẹ́. Pín ẹ̀ka lórí Build.VERSION.SDK_INT kí o sì dán àwọn ọ̀nà méjèèjì wò lórí ohun èlò gidi.
Nígbà tí o bá ń ka àwọn àfikún, kíyèsí ìbámu àwọn àkọ́sọ́nà. Ìyọkúró /24 nínú ọ̀nà /16 nílò àwọn àkọ́sọ́nà ìbòrí tí ó ń ṣàpèjúwe ìyókù ní tòótọ́, kì í ṣe /8 kan tí ó ti bàjẹ́. Ṣàkọsílẹ̀ àkọsílẹ̀ ìkẹyìn kí o sì jẹ́rìí pé a ṣì ń yanjú ẹ̀rọ tí a yọkúró nípasẹ̀ ọ̀nà ní òde tunnel.
A kò lè ṣàpèjúwe ẹ̀rí proxy
setHttpProxy(ProxyInfo) ń darí ojú-ọ̀nà sí proxy HTTP tàbí SOCKS, URL PAC sì lè yan láàrin wọn fún ibi kọ̀ọ̀kan. ProxyInfo tàbí ọ̀nà PAC kò gbé orúkọ olùmúlò àti ọ̀rọ̀ ìpamọ́, nítorí náà proxy tí ó nílò ìjẹ́rìí wà ní òde API pẹtẹ́lì. Àwọn áàpù tí ó nílò rẹ̀ sábà ń fi userspace stack, tun2socks tàbí ẹ̀rọ irú kan kún inú, wọ́n sì ń dáhùn ìpèníjà 407 fúnra wọn.
Ìyàn yẹn ní àwọn àbájáde. userspace stack ń rí kìkì ìgbòkègbodò tí o darí sí i, nítorí náà ó gbọ́dọ̀ gbé nínú ààlà àpèjúwe kan náà, ó sì ń jogún ibùkún protect() kan náà fún socket ìgòkè tirẹ̀. Bí o bá fi protect() sílẹ̀, tunnel yóò mú ìgbékalẹ̀ tirẹ̀, èyí tí ó ń farahàn bí ìfọwọ́sowọ́pọ̀ tí ó dúró lẹ́yìn pákétì àkọ́kọ́. Dán wò pẹ̀lú proxy tí ó béèrè ẹ̀rí, nítorí proxy tí ó ṣí ń kọjá ní ọ̀nà pẹtẹ́lì kò sì fi ohunkóhun hàn.
Àkọsílẹ̀ fún áàpù kọ̀ọ̀kan àti DNS pẹ̀lú jẹ́ ìkéde
Builder ní addAllowedApplication àti addDisallowedApplication, wọ́n sì yapa ara wọn: pípe àwọn méjèèjì ń sọ ìyàsọ́tọ̀ jáde. Bí ó ti wù kí ó rí, a ń lo àkọsílẹ̀ fún olùmúlò kọ̀ọ̀kan nígbà ìṣètò ojú-ọ̀nà, nítorí náà tunnel profáìlì iṣẹ́ ni ó ń darí áàpù profáìlì iṣẹ́, kì í ṣe tirẹ. Ohun tí kò sí API kankan tí ó ń fúnni ni ìṣàkóso lórí ìpinnu áàpù mìíràn: o kò lè ti òde ti pákétì kan sínú tunnel rẹ, o kò sì lè ti VPN tí ó ti ń ṣiṣẹ́ mọ́ tàbí tún un ṣètò.
DNS ń tẹ̀lé àwòrán kan náà. addDnsServer ń kéde àdírẹ́sì resolver; kò fàyè gba áàpù rẹ láti dáhùn àwọn ìbéèrè. Bí o bá fẹ́ yanjú àwọn orúkọ fúnra rẹ, ṣe resolver kan kí o sì darí àdírẹ́sì rẹ̀ sínú tunnel. Àwọn áàpù tí ó ń lo DoT tàbí DoH sí orúkọ ẹ̀rọ tí ó dúró lè forí àdírẹ́sì tí o kéde kọjá, nítorí náà kà yíyanjú orúkọ sí ìsapá tí ó dára jùlọ àyàfi tí o bá tún dènà ọ̀nà ìbéèrè náà.
Manifest, always-on àti àdánwò ìgbésẹ̀ mẹ́rin
A ń kéde yíyẹ nínú manifest: BIND_VPN_SERVICE, àlẹ̀mọ́ intent android.net.VpnService àti iṣẹ́ iwájú bí tunnel bá gbọ́dọ̀ yè ní ẹ̀yìn. Always-on VPN tún nílò onRevoke mímọ́, nítorí pé ẹ̀rọ ń pè é nígbà tí olùmúlò bá yí ètò padà tàbí tí áàpù mìíràn bá gba ìṣàkóso.
Ṣe àwọn àyẹ̀wò ní tẹ̀léra kí o sì dúró ní ìkùnà àkọ́kọ́. Àkọ́kọ́, yọ àwọn àkọsílẹ̀ àdírẹ́sì, ọ̀nà àti DNS tí a fún builder jáde. Èkejì, jẹ́rìí pé establish() dá àpèjúwe padà àti pé socket ìgbékalẹ̀ ní ààbò. Ẹ̀kẹta, béèrè ibi kan nínú àkọ́sọ́nà tí a kó sínú àti ọ̀kan nínú àkọ́sọ́nà tí a yọkúró. Ẹ̀kẹrin, ṣàyẹ̀wò irú resolver tí ó dáhùn ní tòótọ́ nípasẹ̀ bíbeèrè orúkọ ẹ̀rọ tí kìkì resolver rẹ lè yanjú.
Ìfọwọ́sowọ́pọ̀ tí ó parí kò fi ọ̀kan nínú àwọn ìgbésẹ̀ tí ó tẹ̀lé hàn. Àyẹ̀wò kọ̀ọ̀kan ń ya ìpele kan sọ́tọ̀, nítorí náà àṣeyọrí ní ìgbésẹ̀ kejì kò sọ ohunkóhun nípa ẹ̀kẹrin.
Ìtọ́kasí VpnService.Builder ń ṣe àkọsílẹ̀ gbogbo ojú builder. Ohunkóhun tí o nílò ju ìyẹn lọ ni API mìíràn, áàpù mìíràn tàbí userspace stack tirẹ, ìyẹn sì jẹ́ ìpinnu àpẹrẹ kì í ṣe àṣìṣe pínpín tunnel.