Android: VPN per app – å utelukke en app er ikke det samme som å blokkere den
Lista per app på skjermen tilhører én eier av tunnelen, og å utelukke en app sender den rundt tunnelen i stedet for ut av nettet. Begynn der.
To personer spør om det samme og får svar som ikke er forenlige, fordi de står på hvert sitt sted. Den ene har systemets VPN-innstillinger åpne og redigerer en appliste. Den andre skriver VpnService.Builder.addDisallowedApplication() i en editor. Begge omtaler det som et VPN-filter per app. Bare én av dem råder over kontrollen de beskriver, og ingen av dem blokkerer noe som helst.
Begynn med skjermbildet brukeren ser
Åpne Innstillinger, finn VPN-punktet og se på forbindelsen som faktisk er i bruk. Tilbyr klienten en liste per app, hører den lista til klientens egen tunnel. Plattformen offentliggjør ikke et generelt API der en urelatert app kan lese eller endre apputvalget til en annen VPN, så en annen app kan ikke rette opp lista på vegne av brukeren.
Dette er den første delingen i gjennomgangen. Mangler den installerte VPN-en en slik innstilling, finnes det ingenting å kode seg rundt: funksjonen er ikke i produktet som eier tunnelen. Finnes den, ligger den riktige rettelsen i det skjermbildet, utført av den som kan åpne det.
Følg pakken inn i en tunnel
Når din egen app bygger en tunnel, lager den et TUN-grensesnitt og erklærer hvilke appers trafikk som går inn i det. Medlemskapskallene skjer før grensesnittet settes opp, og etterpå ligger regelsettet fast for økta:
val builder = VpnService.Builder()
builder.addAddress("10.8.0.2", 32)
builder.addRoute("0.0.0.0", 0)
builder.addDisallowedApplication("com.example.bypass")
val tun = builder.establish() // membership decided hereKallene gjelder bare tunnelen appen din nettopp lagde, og ingenting annet. De er ikke en policy for hele enheten, de varer ikke for andre klienter, og de rekker ikke inn i andres VPN. Kaster et byggekall et unntak fordi pakken ikke lar seg slå opp, blir grensesnittet aldri satt opp, og det er en ryddig feil framfor en stille.
Hvorfor utelukkingen så ut som en blokkering
En utelukket app rutes rundt tunnelen din og ut på nettverket under. Det er det motsatte av å blokkere den: trafikken forlater fortsatt enheten, bare utenfor grensesnittet du styrer. En app i brannmur-stil gjør det motsatte. Den slipper appens trafikk inn i tunnelen sin og kaster så pakkene, eller nekter å sende dem videre, så grensesnittet er det samme mens retningen på policyen er snudd.
Arbeidet bak den snuingen er ingen konfigurasjonsbryter. Du leser IP-pakker fra tunnelbeskrivelsen, vurderer per flyt og sender dem videre via en beskyttet socket eller forkaster dem. Alt du ikke håndterer, stopper ganske enkelt, og derfor ser en halvferdig tunnel ut som et ødelagt nettverk og ikke som et fungerende filter. Er målet blokkering, må du beregne pakkehåndtering, en forgrunnstjeneste og en skriftlig policy for trafikk du ikke klarer å klassifisere.
Hva som ryker når du bygger det selv
Android gir vanligvis bare plass til én aktiv VPN av gangen, så filtertunnelen din og en personvernstunnel kjemper om samme plass, med mindre produktene støtter kjetting. Alltid på-VPN med blokkering av tilkoblinger endrer feilbildet på en måte som betyr noe her: trafikk som ikke slipper inn i tunnelen, forkastes i stedet for å sendes direkte, noe et lekkasjeforebyggende design ønsker og en feilsøkingsøkt sjelden regner med.
Pakkesynlighet er felle nummer to. Oppslag av pakkenavnet til en app kan feile med NameNotFoundException, og på nyere Android-versjoner avhenger pakkene du får se, av spørringene du har erklært. Ta hånd om unntaket i stedet for å gå ut fra at alle navn slås opp, og les lista på nytt når apper installeres eller fjernes, framfor å cache den for alltid.
Administrerte enheter gir en tredje eier. En policy for bedriftsmobilitet kan sette en VPN per app eller en alltid på-profil, og en vanlig app kan ikke overstyre den. Kontroller om enheten er administrert før du feilsøker din egen kode, for i så fall er lista du prøver å endre kanskje ikke redigerbar for noen som holder telefonen.
Prøv det med en app du styrer
Ikke test med appen du prøver å filtrere. Bruk en annen app der du kan følge med på nettverksatferden, og sjekk om trafikken går ut gjennom tunnelen din mens målets ikke gjør det. Blir begge inne, virker policyen og målet er utelukket; går ingen ut, er tunnelen selv feil og applista er ikke problemet.
Deretter avgjør du hvilken av tre ting du egentlig bygger. En tunnel per app er bygger-API-et, med lista som en del av profilen din. En enhetsbrannmur er pakkehåndtering pluss en livssyklus du kan stå inne for. Å endre andres VPN er ikke en støttet vei i det hele tatt, og det ærlige svaret der er at innstillingen hører til det produktet.