Android 10 және одан кейінгі нұсқаларда /proc/net/tcp ашатын қолданба socket кестесінің орнына қатынасқа рұқсат етілмеген жауап алады. VPN интерфейсіне бұл бәрібір: пакеттер әлі келеді, өйткені туннель — маршруттау шешімі, файл рұқсаты емес. Өзгергені — тар сұраққа жауап: «бұл қосылымды қай қолданба иеленеді?» Орынбасары — ConnectivityManager.getConnectionOwnerUid, әр қосылым бойынша қолдау көрсетілетін сұрау, ал ескі әдет пен жаңа API арасындағы таңдау нақты үш жұмыстың қайсысы бар екеніне байланысты: пакеттерді қабылдау, ағынды атрибуциялау немесе тұтынуды қосу.

Ие сұрағына екі жауап жолы

API 29-ға дейін артықшылығы бар немесе root процесі ядроның socket кестелерін оқып, төрттікті сәйкестендіріп, иесінің UID-ін біле алатын. Бұл бір файлда бүкіл құрылғының тізімін беретін. API 29-дан бастап файл жүйесінің көрінісі шектеулі, ал қолдау көрсетілетін жол — протокол, жергілікті мекенжай және қашықтағы мекенжаймен әр қосылым бойынша сұрау.

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

Салыстыру «ескіге қарсы жаңа» емес. Бұл бұрын бір оқылатын файлмен қанағаттандырылған, ал қазір үш түрлі шартпен үш түрлі интерфейспен қанағаттандырылатын үш түрлі жұмыс.

Жергілікті мекенжай — қолданбаның шеті

Әдіс қолтаңбасы протоколды, жергілікті socket мекенжайын және қашықтағы socket мекенжайын қабылдайды. «Жергілікті» — қосылымдағы қолданба жағы, тексеру сәтінде пакеттің көзі болып қалған шеті емес. Қашықтағы серверден қолданбаға қайтатын пакеттің көзі мен межелі жері осы анықтамаға қатысты керісінше.

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

Бұл бағыт қатесі жұмыс істейтін сұраудың қате жауап немесе мүлде жауап бермеуінің ең жиі себебі. Қоңырау алдында екі шетті де жазып алыңыз және жұпты қолданба шынымен ашқан қосылыммен салыстырыңыз. Мекенжай тұқымдасы да маңызды: IPv4 арқылы салынған мекенжай мен байырғы IPv6 мекенжайы әртүрлі төрттіктер, сол сияқты бір порттағы TCP және UDP ағындары да.

Өкілеттік және белгісіз нәтижелер шарттың бөлігі

Сұрау өкілетті қоңырау шалушылармен шектеледі, оның ішінде тиісті пайдаланушының белсенді VPN қолданбасы бар. Қатысы жоқ мониторинг қолданбасы басқа профильдің қосылымдарын санай алады деп болжай алмайды, ал өкілетсіз қоңырау достық қате орнына қауіпсіздік ерекшелігін лақтыруы мүмкін. Екі нәтижені де анық өңдеңіз.

Жоқ ие — пакет атауы емес. Ағын пакет пен сұрау арасында жабылуы мүмкін, төрттік толық болмауы мүмкін, немесе қоңырау шалушыға білуге рұқсат етілмеген болуы мүмкін. Бірінші сәтті жауапты кэштеп, кейін қайта пайдалану жаңа қосылымды ескі қолданбаға телиді, бұл белгісіз деп хабарлаудан жаман.

Атрибуция сәтсіз болғанда, трафикке бәрібір шешім керек: саясат талап ететін жерде бұғаттаңыз, тек түсінетін аумаққа рұқсат етіңіз немесе олқылықты көрсетіңіз. Бұл қосалқы жол дизайнға жатады, түсініктемеге емес.

Есеп — басқа сұрақ

NetworkStatsManager тұтынуды өз қатынас ережелерімен хабарлайды. Ол UID-тің кезең ішінде қанша жібергенін айта алады; ол еркін тірі пакеттің иесін айта алмайды. Желі мүмкіндіктері желінің қасиеттерін сипаттайды, socket тізілімін емес. Үшеуін араластыру дәйекті көрінетін және ондай болмайтын тақталар жасайды.

Қай қолданбалар туннельді пайдаланатынын шешудің қарапайым жағдайы үшін Android-тың қолдау көрсететін рұқсат етілген және тыйым салынған қолданбалар тізімдері ешбір scraping-сіз саясатты білдіреді. Ағын бойынша атрибуцияны шынымен қажет ететін жағдайларға қалдырыңыз және бағытты, рұқсаттарды және белгісіз күйлерді бірге өңдейтін қолдау көрсетілетін іске асыруға бюджет қойыңыз.

Құралды жұмысқа қарай таңдап, сосын шеттерді сынаңыз

Талап туннельді таңдау болса, платформа тізімін пайдаланыңыз. Тірі атрибуция болса, ие сұрауын пайдаланыңыз және жауапсыз төрттіктің бәрін белгісіз деп санаңыз. Тарихи қосындылар болса, stats API пайдаланыңыз. Содан кейін қарапайым іске асыруларды бұзатын үш шетті сынаңыз: қарсы бағыттағы пакет, сұрауға дейін жабылатын ағын және белсенді VPN болып табылмайтын қоңырау шалушы.

Бұлардың ешқайсысы SELinux-ті өшіруді, телефонды root етуді немесе ядро кестелерін бүкіл әлемге оқылатын етуді талап етпейді. Шектеу — міне мәні: платформа атрибуцияны шарттың артына жылжытты, сонда жауап оны заңды түрде қажет ететін компонентке ғана қолжетімді болады, басқа ешкімге емес.

Қатысты мақалалар