Miksi estetty Android-sovellus näyttää yhä verkkokäyttöä
Käyttölaskuri mittaa tavuja yhdellä rajalla, ei onnistunutta pyyntöä. Tarkista aikaväli, UID-kohtainen kohdistus ja se, mikä sovellus omistaa VPN-palvelun.
Estät sovelluksen Androidin VPN-palomuurissa, sovellus lakkaa toimimasta ja sen käyttörivi jatkaa kasvuaan. Houkutteleva johtopäätös on, että esto vuoti tai että laskuri on rikki. Kumpikaan ei seuraa. Käyttötietue kertoo, että tiettynä havaintopisteenä tavuja kohdistettiin tuolle identiteetille; se ei kerro mitään siitä, hyväksyikö etäpalvelu pyynnön. Kun tiedät, mikä raja mitattiin ja mille identiteetille se veloitettiin, kaksi havaintoa lakkaa olemasta ristiriidassa.
Laskuri mittaa tavuja, ei toimitusta
Android kohdistaa liikenteen UID:lle ja laskee sitä molempiin suuntiin, ja se tekee sen rajapinnan rajalla eikä sillä hetkellä, kun sovelluksen pyyntö onnistuu.
Hylätty yhteysyritys liikuttaa silti paketteja: SYN, reset tai niitä seuraavat uudelleenlähetykset, sekä DNS-kysely, joka edelsi molempia. Nuo tavut ovat olemassa, vaikka mitään ei toimitettu, ja joillakin poluilla ne lasketaan ennen kuin mikään suodatin päättää, mitä niille tehdään.
Siksi estetyn sovelluksen rivi voi kasvaa, vaikka jokainen pyyntö epäonnistuu. Laskuri vastaa kysymykseen ”montako tavua tälle identiteetille kohdistettiin”, ei kysymykseen ”saavuttiko tämä identiteetti internetin”. Kaavio ei pysty erottamaan hyväksyttyä virtaa kohteliaasti hylätystä kättelystä, eikä pysty yhteissumma, joka laskee molemmat suunnat yhteen.
Kohdistus seuraa UID:tä, ei kuvaketta
Rivi on UID-kohtainen, ja yhden UID:n voi jakaa useampi kuin yksi paketti, kun taas näkyvä sovellus voi antaa työn erilliselle komponentille, joka toimii oman identiteettinsä alla. Jaetun WebView-prosessin piirtämä selaimen välilehti, taustan synkronointipalvelu tai pääsovelluksen rinnalle asennettu kumppanipaketti tuottavat kaikki liikennettä, jonka käyttönäyttö voi näyttää nimellä, jota et odottanut, tai sen sovelluksen alla, jonka todella estit. Estetty paketti ja sen pyynnöt kuljettava apuri ovat kaksi eri subjektia, ja sääntö kattoi vain toisen niistä.
Kun luvut näyttävät vääriä, vertaa UID:tä äläkä tunnistetta. Käyttörajapintaa kysytään UID:llä, ja adb shell dumpsys package <package> | grep userId= tulostaa luvun, johon verrata, joten kaksi saman UID:n merkintää ovat laskurin näkökulmasta sama identiteetti.
Aikaväli voi olla sääntöäsi varhaisempi
Käyttötiedot kerätään koreihin ja kysytään määräajoin, ei suoratoisteta reaaliajassa. Päivän summa voi sisältää minuutit ennen eston käyttöönottoa, edellisen tunnin taustasynkronoinnin tai liikennettä, joka oli jo matkalla. Kumulatiivisen summan vertaaminen yhteen hylättyyn pyyntöön ja eron kutsuminen vuodoksi on mittausvirhe, ei palomuurin havainto.
Käytä lyhyempää aikaväliä ja puhdasta alkua. Merkitse aikaleima, kun muutat sääntöä, odota yksi keräysväli ja katso sitten vain sen jälkeisiä tietoja. Jos summa jatkaa kasvuaan aikavälillä, joka alkaa säännön jälkeen, sinulla on jotain tutkittavaa; jos se lakkaa kasvamasta, aiempi kasvu oli näytettyä historiaa.
VPN-palvelu ei ehkä ole se, jonka määritit
VPN-palomuuri näkee vain liikenteen, jota sen oma palvelu kuljettaa. Jos toinen VPN-sovellus käynnistyy ja ottaa aktiivisen yhteyden, suodattimesi ei ole enää polulla, vaikka sen rajapinta on yhä asetuksissa. Sovelluskohtaiset ohitusluettelot tekevät saman tarkoituksella, eikä sovelluksen poissulkeva profiili ole vuoto, kun sovellus sitten toimii.
IPv4, IPv6 ja DNS voivat myös eriytyä. IPv4:ää käsittelevä suodatin voi jättää IPv6:n tai yksityisen DNS-resolverin ulkopuolelleen, joten osa sovelluksen liikenteestä kulkee polkua, jota sääntösi eivät koskaan kuvailleet. Tarkista, mikä sovellus omistaa VPN:n juuri nyt ja mitä poissulkuluettelo sanoo, ennen kuin kirjoitat mitään uudelleen:
adb shell settings get secure always_on_vpn_app
adb shell dumpsys connectivity
adb shell dumpsys netstats detail
Testaa yksi tuore pyyntö ja kirjaa neljä tosiseikkaa
Valitse harmiton pyyntö, tee se kerran ja kirjoita neljä tosiseikkaa: voimassa oleva sääntö, sovelluksen UID, verkon tila ja aika. Tarkista sitten, kirjasiko suodattimesi virran ja näkikö kohde tai yhdyskäytävä saman yhteyden. Yksi molemmilla puolilla tunnistettu virta on todiste; koontisumma ei ole.
Puolustettava johtopäätös nimeää, mitä evättiin ja mikä havainto sen vahvisti. ”Laskuri nousi” ei ole havainto, eikä ”kaikki käyttölaskurit ovat väärennettyjä” ole sitä myöskään. OSI-kerroksen iskulause ei ratkaise tätä: rehellinen vastaus on, että laskuri ja esto voivat molemmat olla oikeassa samalla kun ne kuvaavat eri asioita. Androidin NetworkStatsManager-viite dokumentoi, miten nämä korit kysytään ja kohdistetaan.