Taisyklė buvo paprasta: filtruoti srautą tik tol, kol telefonas prijungtas prie biuro Wi-Fi. Ji laikėsi mėnesius, o paskui vieną rytą telefonas stovėjo tame pačiame SSID su ta pačia rakto piktograma, o filtravimas buvo sustojęs. Tinkle niekas nepasikeitė; pasikeitė tai, ar programėlė mato tinklo pavadinimą. Android sistemoje „kuriame Wi-Fi aš esu“ ir „blokuok šį srautą“ yra du atskiri darbai, o ugniasienė, kuri juos sumaišo, atsiveria būtent tada, kai pavadinimas tampa neprieinamas.

Simptomas: tapatybė dingsta, o politika seka paskui

SSID taisyklė perskaito reikšmę ir tada pasirenka šaką. Kai skaitymas negrąžina nieko naudingo, kodas turi ką nors daryti, o įprasta numatytoji reikšmė yra „ne laukiamas tinklas, tad nefiltruoti“. Ši numatytoji reikšmė paverčia leidimų problemą srauto nuotėkiu. Rakto piktograma lieka matoma, nes VPN tarnyba vis dar veikia; ji tik vykdo kitą šaką.

Žiūrėkite į įvykių tvarką, o ne į tinklą. Atmestas leidimo dialogas, sistemos atnaujinimas, perkėlęs prieigą prie SSID už kito leidimo, išjungtos vietos tarnybos ar darbo profilio politikos pakeitimas gali duoti tą patį rezultatą, kol telefonas lieka tame pačiame prieigos taške.

Kodėl pavadinimas gali grįžti nežinomas

WifiInfo.getSSID() grąžina dabartinio tinklo paslaugų rinkinio identifikatorių, o Android dokumentuoja, kad prieiga prie vietai jautrių laukų priklauso nuo leidimo. Kai prieigos nėra, kvietimas grąžina UNKNOWN_SSID, o ne garsiai nepavyksta. Taigi tuščia ar nežinoma reikšmė nėra įrodymas, kad telefonas paliko Wi-Fi; tai įrodymas, kad programėlė negali klasifikuoti tinklo.

Du patikrinimai atskiria atvejus. Patvirtinkite, kad telefonas prijungtas, ir pažiūrėkite, ką praneša sistema, tada patvirtinkite, kad programėlė tikrai turi leidimą, kurio jai reikia šioje Android versijoje:

adb shell cmd wifi status
adb shell dumpsys package <your.app> | grep -i -E "ACCESS_FINE_LOCATION|NEARBY_WIFI_DEVICES"

Jei būsenos eilutė rodo prijungtą tinklą, o programėlė mato nežinomą pavadinimą, turite leidimo arba API lygio problemą, o ne Wi-Fi problemą. Ištaisykite tai prieš liedami ugniasienės taisykles, nes kiekviena tolesnė taisyklė vertinama pagal reikšmę, kurios programėlė negali perskaityti.

Kur filtravimas iš tikrųjų vyksta

Vietinė Android ugniasienė paprastai naudoja VpnService modelį, nesiųsdama srauto į nuotolinį serverį: ji paima virtualų sąsają, taiko savo taisykles ir perduoda tai, ką leidžia. Platforma leidžia vieną aktyvią VPN tarnybą vienam naudotojo profiliui, o antroji pakeičia pirmąją, o ne sluoksniuojasi ant jos. Todėl atskira ugniasienės programėlė ir atskiras darbo VPN nesudaro dviejų pakopų grandinės; vienas iš jų laimi.

Tai svarbu SSID taisyklei, nes vykdymo taškas ir stebėjimo taškas yra skirtingi komponentai. VpnService nusprendžia, kas palieka įrenginį; Wi-Fi API tik pateikia etiketę. Programėlė gali teisingai vykdyti ir neteisingai klasifikuoti, ir būtent tai yra šio straipsnio gedimas.

Suteikite nežinomai būsenai savo politiką

Traktuokite tinklo tapatybę kaip tris būsenas ir užrašykite kiekvienos politiką prieš išleisdami taisyklę. Trečioji būsena yra ta, kuri pamirštama, ir būtent į ją jus pastatys užpuolikas ar neteisinga konfigūracija.

ObservationPolicy to specify
Expected SSID is readableThe explicit filtering policy you designed
A different SSID is readableThe default policy for untrusted networks
Unknown, changing or unreadableFail closed until classification is reliable

Uždaras nepavykimas reiškia, kad nežinoma būsena paveldi griežčiausią protingą politiką, o ne patogiausią. Jei dėl to telefonas tampa nebenaudojamas naujame tinkle, teisingas sprendimas yra sąmoninga ir matoma išimtis, o ne tyliai nulio patikrinime paslėptas pasitikėjimo sprendimas.

Pažįstamas SSID yra etiketė, o ne tinklo operatoriaus įrodymas. Bet kas gali paleisti prieigos tašką su biuro pavadinimu, todėl pavadinimo sutapimas niekada neturėtų būti vienintelis dalykas tarp jautrios sesijos ir nepatikimo segmento.

Tikrinkite perėjimus, o ne pastovią būseną

Pastovios būsenos testai praeina tame tinkle, kuriame kūrėte taisyklę. Gedimai gyvena perėjimuose: atmestas leidimas, Wi-Fi į mobilųjį, vienas SSID į kitą, VPN tarnybos perkrovimas ir kita VPN programėlė, perimanti sąsają. Kiekvienam nuspręskite, ar esami ryšiai peržiūrimi ir ar apsaugotas srautas lieka blokuojamas, kol būsena nežinoma.

Užrašykite rezultatą trimis sakiniais: stebima sąlyga, sprendimą vykdantis komponentas ir sąmoningas atsarginis veiksmas. Jei trūksta kurio nors iš trijų, taisyklė dar nėra politika; tai spėjimas, kuris biuro tinkle veikia atsitiktinai.

Susiję straipsniai