Ní Android 10 àti lẹ́yìn rẹ̀, ohun èlò tí ó bá ṣí /proc/net/tcp gba kíkọ̀ ìwọlé ní ipò tábìlì socket. Kò ṣe pàtàkì fún interface VPN: àwọn pákẹ́ẹ̀tì ṣì ń dé, nítorí pé tunnel jẹ́ ìpinnu ìtọ́sọ́nà, kì í ṣe ìyọ̀ǹda fáìlì. Ohun tí ó yí padà ni ìdáhùn sí ìbéèrè tí ó dín: «èyí tí ohun èlò wo ni ó ni ìsopọ̀ yìí?» Àrọ́wọ́to ni ConnectivityManager.getConnectionOwnerUid, ìbéèrè tí a ṣe àtìlẹ́yìn fún ìsopọ̀ kọ̀ọ̀kan, ìyàn láàárín àṣà àtijọ́ àti API tuntun dá lórí èwo nínú iṣẹ́ mẹ́ta tí o ní gan-an: gbígba àwọn pákẹ́ẹ̀tì, ìsọtọ́ ṣísàn, tàbí àpapọ̀ ìlò.

Àwọn ọ̀nà méjì láti dáhùn ìbéèrè ẹni tí ó ni

Ṣáájú API 29, ìlànà aláṣẹ tàbí root lè ka àwọn tábìlì socket ti kernel, kí ó bá mẹ́rin mu, kí ó sì mọ UID ẹni tí ó ni. Ìyẹn ń fúnni ní àkójọ ohun elo gbogbo ẹ̀rọ nínú fáìlì kan. Láti API 29, ìwòye ètò fáìlì ti ní ààlà, ìlànà tí a ṣe àtìlẹ́yìn fún ni ìbéèrè fún ìsopọ̀ kọ̀ọ̀kan pẹ̀lú protocol, àdírẹ́sì ibùdó àti àdírẹ́sì jínjìn.

QuestionLegacy socket tablesgetConnectionOwnerUid
Who owns this flow?Scan and match the tupleAsk once per tuple
Device-wide inventory?Yes, when readableNo, one flow at a time
Historical usage?NoNo; that is NetworkStatsManager
Works without root?No on modern releasesYes, for authorized callers

Ìfiwéra kì í ṣe «àtijọ́ lórí tuntun». Ó jẹ́ iṣẹ́ mẹ́ta ọ̀tọ̀ọ̀tọ̀ tí fáìlì kan tí a lè kà ń tẹ́rùn-ún pẹ̀lú rẹ̀ tẹ́lẹ̀, tí àwọn interface mẹ́ta ọ̀tọ̀ọ̀tọ̀ pẹ̀lú àwọn àdéhùn mẹ́ta ń tẹ́rùn-ún pẹ̀lú wọn báyìí.

Àdírẹ́sì ibùdó ni ìparí ohun èlò

Ìwé-ìbùwọ́ ọ̀nà náà ń gba protocol, àdírẹ́sì socket ibùdó àti àdírẹ́sì socket jínjìn. «Ibùdó» túmọ̀ sí ẹ̀gbẹ́ ohun èlò nínú ìsopọ̀, kì í ṣe ìparí tí ó ṣẹ̀ṣẹ̀ jẹ́ orísun pákẹ́ẹ̀tì ní àkókò tí o ṣàyẹ̀wò. Pákẹ́ẹ̀tì tí ó ń rìn láti server jínjìn padà sí ohun èlò ní orísun àti ìdí tí ó yí padà ní ìbámu pẹ̀lú ìtumọ̀ yẹn.

ConnectivityManager cm = getSystemService(ConnectivityManager.class);
int uid = cm.getConnectionOwnerUid(
    OsConstants.IPPROTO_TCP, appLocalAddress, appRemoteAddress);

Àṣìṣe ìtọ́sọ́nà yìí ni ìdí tí ó wọ́pọ̀ jùlọ tí ìbéèrè tí ó ń ṣiṣẹ́ fi ń dá ìdáhùn tí kò tọ́, tàbí kò dá ohunkóhun. Ṣàkọsílẹ̀ ìparí méjèèjì ṣáájú ìpè kí o sì jẹ́rìí bàbà pẹ̀lú ìsopọ̀ tí ohun èlò náà ṣí gan-an. Ìdílé àdírẹ́sì náà ṣe pàtàkì: àdírẹ́sì tí a fi IPv4 ṣe àwòrán àti àdírẹ́sì IPv6 àbínibí jẹ́ tuple ọ̀tọ̀ọ̀tọ̀, bẹ́ẹ̀ náà ni àwọn ṣísàn TCP àti UDP lórí àwọn ibudo kan náà.

Ìyọ̀ǹda àti àwọn àbájáde àìmọ̀ jẹ́ apá àdéhùn

Ìbéèrè náà ní ààlà sí àwọn olùpè tí a fún ní àṣẹ, pẹ̀lú ohun èlò VPN tí ó ń ṣiṣẹ́ fún olùmúlò tí ó kan. Ohun èlò àbójútó tí kò ní àlàfo kò lè rò pé òun lè ka àwọn ìsopọ̀ profile mìíràn, ìpè tí kò ní àṣẹ sì lè ju àtakò ààbò dànù dípò mímú àṣìṣe onífẹ̀ẹ́ padà. Ṣàkóso àwọn àbájáde méjèèjì ní gbangba.

Ẹni tí ó ní tí kò sí kì í ṣe orúkọ àpótí. Ṣísàn náà lè ti dé ní àárín pákẹ́ẹ̀tì àti ìbéèrè, tuple lè jẹ́ àìpé, tàbí a lè máà fún olùpè ní àṣẹ láti mọ̀. Fífi ìdáhùn àkọ́kọ́ tí ó ṣe àṣeyọrí pamọ́ àti lílò rẹ̀ lẹ́yìn náà ń so ìsopọ̀ tuntun mọ́ ohun èlò àtijọ́, èyí tí ó burú ju jíjẹ́rìí àìmọ̀ lọ.

Nígbà tí ìsọtọ́ bá kùnà, ìrìnàjò náà tún nílò ìpinnu: dínà níbi tí ìlànà bá béèrè, gba ààyè ìwọ̀n tí o yé nìkan, tàbí fi àlàfo hàn. Ìpadà yẹn jẹ́ ti àpẹrẹ, kì í ṣe ti àkọsílẹ̀.

Ìṣirò jẹ́ ìbéèrè mìíràn

NetworkStatsManager ń jẹ́rìí ìlò lábẹ́ àwọn òfin ìwọlé tirẹ̀. Ó lè sọ bí UID kan ti gbé pọ̀ tó ní àkókò kan; kò lè sọ ẹni tí ó ni pákẹ́ẹ̀tì alààyè àìdánimọ̀. Àwọn agbára nẹ́tíwọ́kì ń ṣàpèjúwe àwọn ànímọ́ nẹ́tíwọ́kì, kì í ṣe àkójọ socket. Dídà mẹ́ta pọ̀ ń mú àwọn pátákó ìṣàkóso tí ó dàbí aláìṣeéyẹ̀, tí kì í sì í ṣe bẹ́ẹ̀.

Fún ọ̀ràn rírọrùn ti pínpín èyí tí àwọn ohun èlò ń lo tunnel, àwọn àkójọ ohun èlò tí a gbà àti tí a fi ààlà tí Android ṣe àtìlẹ́yìn ti ń sọ ìlànà náà láìṣe scrap kankan. Fi ìsọtọ́ fún ṣísàn kọ̀ọ̀kan pamọ́ fún àwọn ọ̀ràn tí ó nílò rẹ̀ gan-an, kí o sì ṣètò ìnáwó fún ìmúṣẹ tí a ń tọ́jú tí ó ń kojú ìtọ́sọ́nà, àwọn ìyọ̀ǹda àti àwọn ipò àìmọ̀ papọ̀.

Yan irinṣẹ́ ní ìbámu pẹ̀lú iṣẹ́, lẹ́yìn náà dán àwọn etí

Bí ohun tí a nílò bá jẹ́ yíyan tunnel, lo àkójọ pẹpẹ. Bí ó bá jẹ́ ìsọtọ́ lọ́wọ́lọ́wọ́, lo ìbéèrè ẹni tí ó ni kí o sì kà gbogbo tuple tí kò lè dáhùn sí gẹ́gẹ́ bí àìmọ̀. Bí ó bá jẹ́ àpapọ̀ ìtàn, lo stats API. Lẹ́yìn náà dán àwọn etí mẹ́ta tí ó ń fọ́ àwọn ìmúṣẹ aláìlẹ́mìí: pákẹ́ẹ̀tì ní ìtọ́sọ́nà òdìkejì, ṣísàn tí ó dé ṣáájú ìbéèrè rẹ, àti olùpè tí kì í ṣe VPN tí ó ń ṣiṣẹ́.

Kò sí ohun kan nínú èyí tí ó béèrè fún pípa SELinux, root fọ́nù tàbí ṣíṣe àwọn tábìlì kernel ní kíkà fún gbogbo ènìyàn. Ààlà náà ni kókó: pẹpẹ náà gbé ìsọtọ́ lọ sẹ́yìn àdéhùn kan kí ìdáhùn lè dé ọ̀dọ̀ ẹ̀yà tí ó nílò rẹ̀ lábẹ́ òfin, kì í sì í dé ọ̀dọ̀ ẹlòmíràn.

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