Чаму заблакаваная праграма Android усё яшчэ паказвае выкарыстанне сеткі
Лічыльнік выкарыстання вымярае байты на адной мяжы, а не паспяховы запыт. Праверце часавае акно, прывязку да UID і тое, якая праграма валодае службай VPN.
Вы блакуеце праграму ў сваім міжсеткавым экране VPN на Android, праграма перастае працаваць, а яе радок выкарыстання працягвае расці. Спакуслівая выснова — што блакаванне працякло або што лічыльнік зламаны. Ні адно не вынікае. Запіс выкарыстання кажа, што байты былі аднесены да гэтай асобы ў нейкім пункце назірання; ён нічога не кажа пра тое, ці прыняла аддаленая служба запыт. Калі вы ведаеце, якая мяжа была вымераная і на якую асобу яна была аднесена, дзве назіранні перастаюць супярэчыць адно аднаму.
Лічыльнік вымярае байты, а не дастаўку
Android адносіць трафік да UID і лічыць яго ў абодвух напрамках, і робіць гэта на мяжы інтэрфейсу, а не ў момант, калі запыт праграмы ўдаецца.
Адпрэчаная спроба злучэння ўсё роўна перамяшчае пакеты: SYN, скід або паўторы, што ідуць за ім, плюс запыт DNS, які папярэднічаў абодвум. Гэтыя байты існуюць, нават калі нічога не было дастаўлена, і на некаторых шляхах яны лічацца раней, чым любы фільтр вырашыць, што з імі рабіць.
Вось чаму радок заблакаванай праграмы можа расці, калі кожны запыт няўдалы. Лічыльнік адказвае на пытанне «колькі байтаў было аднесена да гэтай асобы», а не «ці дасягнула гэтая асоба інтэрнэту». Графік не можа адрозніць прыняты паток ад ветліва адпрэчанага рукапаціскання, і сума, якая складае абодва напрамкі разам, таксама не можа.
Прывязка ідзе за UID, а не за значком
Радок вядзецца па UID, і адзін UID можа выкарыстоўвацца некалькімі пакетамі, тады як бачная праграма можа перадаць працу асобнаму кампаненту, які працуе пад сваёй уласнай асобай. Зачынка браўзера, якую малюе агульны працэс WebView, служба фонавай сінхранізацыі або спадарожны пакет, усталяваны побач з асноўнай праграмай, — усе яны ствараюць трафік, які экран выкарыстання можа паказаць пад імем, якога вы не чакалі, або пад праграмай, якую вы блакавалі. Заблакаваны пакет і памочнік, які пераносіць яго запыты, — гэта дзве розныя сутнасці, і правіла ахоплівала толькі адну з іх.
Калі лічбы выглядаюць няправільна, параўноўвайце UID, а не назву. API выкарыстання запытваецца па UID, і adb shell dumpsys package <package> | grep userId= друкуе лік, з якім трэба параўноўваць, таму два запісы з аднолькавым UID — гэта адна і тая ж асоба з пункту гледжання лічыльніка.
Часавае акно можа папярэднічаць вашаму правілу
Даныя выкарыстання збіраюцца ў групах і апытваюцца, а не перадаюцца ў жывым рэжыме. Дзённая сума можа ўключаць хвіліны да ўключэння блакавання, фонавую сінхранізацыю з папярэдняй гадзіны або трафік, які ўжо быў у шляху. Параўнанне назапашанай сумы з адным адпрэчаным запытам і называнне розніцы ўцечкай — гэта памылка вымярэння, а не выснова міжсеткавага экрана.
Выкарыстайце больш кароткае акно і свежы пачатак. Запішыце адзнаку часу, калі змяняеце правіла, пачакайце адзін інтэрвал збору, затым глядзіце толькі на даныя пасля яго. Калі сума працягвае расці ў акне, якое пачынаецца пасля правіла, вам ёсць што даследаваць; калі яна перастае расці, ранейшае павелічэнне было адлюстраваннем гісторыі.
Служба VPN можа быць не той, якую вы наладзілі
Міжсеткавы экран VPN бачыць толькі трафік, які пераносіць яго ўласная служба. Калі іншая праграма VPN запускаецца і пераймае актыўнае злучэнне, вашага фільтра больш няма на шляху, хаця яго інтэрфейс усё яшчэ ёсць у наладах. Спісы абыходу для асобных праграм робяць тое ж самае наўмысна, і профіль, які выключае праграму, не з'яўляецца ўцечкай, калі праграма потым працуе.
IPv4, IPv6 і DNS таксама могуць разыходзіцца. Фільтр, які апрацоўвае IPv4, можа пакінуць IPv6 або прыватны рэзалвер DNS па-за ім, таму частка трафіку праграмы ідзе шляхам, якога вашыя правілы ніколі не апісвалі. Праверце, якая праграма зараз валодае VPN і што гаворыць спіс выключэнняў, перш чым нешта перапісваць:
adb shell settings get secure always_on_vpn_app
adb shell dumpsys connectivity
adb shell dumpsys netstats detail
Праверце адзін свежы запыт і запішыце чатыры факты
Выберыце бясшкодны запыт, зрабіце яго адзін раз і запішыце чатыры факты: правіла, якое дзейнічае, UID праграмы, стан сеткі і час. Затым праверце, ці зарэгістраваў ваш фільтр гэты паток і ці ўбачыў пункт прызначэння або шлюз тое ж злучэнне. Адзін паток, вызначаны з абодвух бакоў, — гэта доказ; агульная сума — не.
Абарончая выснова называе, што было забаронена і якое назіранне гэта пацвердзіла. «Лічыльнік вырас» — не выснова, і «усе лічыльнікі выкарыстання фальшывыя» таксама не выснова. Лозунг узроўню OSI гэтага не вырашае: сумленны адказ у тым, што лічыльнік і блакаванне могуць быць абодва правільнымі, апісваючы розныя рэчы. Даведнік Android NetworkStatsManager дакументуе, як гэтыя групы запытваюцца і адносяцца.