Android VPN per app: å utelukke en app er ikke å blokkere den
App-listen på skjermen tilhører én tunneleier, og å utelukke en app ruter den rundt den tunnelen i stedet for av nettverket. Start der.
To personer stiller samme spørsmål og får svar som ikke passer sammen, fordi de står på forskjellige steder. Den ene har systemets VPN-innstillinger åpne og redigerer en liste over apper. Den andre skriver VpnService.Builder.addDisallowedApplication() i en editor. Begge kaller det et VPN-filter per app. Bare én av dem eier kontrollen de beskriver, og ingen av dem blokkerer noe.
Start på skjermen brukeren ser
Åpne Innstillinger, finn VPN-oppføringen og se på tilkoblingen som faktisk er aktiv. Hvis klienten tilbyr en liste per app, tilhører listen klientens egen tunnel. Plattformen publiserer ikke et generelt API der en urelatert app kan lese eller endre en annen VPNs appvalg, så en andre app kan ikke reparere listen for brukeren.
Dette er den første forgreningen i gjennomgangen. Hvis den installerte VPN-en ikke har en slik innstilling, er det ingenting å kode rundt: funksjonen mangler i produktet som eier tunnelen. Hvis den har det, er den riktige rettelsen på den skjermen, gjort av den som kan åpne den.
Følg pakken inn i en tunnel
Når din egen app bygger en tunnel, oppretter den et TUN-grensesnitt og erklærer hvilke appers trafikk som går inn i det. Medlemskapskallene skjer før grensesnittet etableres, og etterpå er regelsettet fast for den økten:
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 hereDisse kallene gjelder bare tunnelen appen din nettopp laget, og ingenting annet. De er ikke en policy for hele enheten, de vedvarer ikke for andre klienter, og de kan ikke nå inn i noen andres VPN. Når et bygger-kall kaster et unntak fordi pakken ikke kan løses opp, blir grensesnittet aldri etablert, noe som er en ren feil og ikke en stille.
Hvorfor utelukkelsen så ut som en blokkering
En utelukket app rutes rundt tunnelen din til det underliggende nettverket. Det er det motsatte av å blokkere den: trafikken forlater fortsatt enheten, bare utenfor grensesnittet du kontrollerer. En app i brannmur-stil gjør det motsatte. Den slipper appens trafikk inn i tunnelen sin og forkaster deretter pakkene, eller nekter å videresende dem, så grensesnittet er det samme og retningen på policyen er snudd.
Arbeidet bak den snuingen er ikke et konfigurasjonsflagg. Du leser IP-pakker fra tunnelbeskrivelsen, bestemmer per flyt og videresender dem gjennom en beskyttet socket eller forkaster dem. Alt du ikke håndterer stopper bare, og det er derfor en halvferdig tunnel ser ut som et ødelagt nettverk i stedet for et fungerende filter. Hvis målet er blokkering, budsjetter med pakkehåndtering, en forgrunnstjeneste og en skriftlig policy for trafikk du ikke kan klassifisere.
Hva som bryter når du bygger det selv
Android tillater vanligvis bare én aktiv VPN om gangen, så filtertunnelen din og en personvernstunnel konkurrerer om samme plass med mindre produktene støtter kjetting. Alltid på-VPN med blokkering av tilkoblinger endrer feilmodusen på en måte som betyr noe her: trafikk som ikke kan komme inn i tunnelen forkastes i stedet for å sendes direkte, som er det en lekkasjeforebyggende design vil og det en feilsøkingsøkt sjelden forventer.
Pakkesynlighet er den andre fellen. Oppslag av en apps pakkenavn kan feile med NameNotFoundException, og på nyere Android-versjoner avhenger settet med pakker du kan se av spørringene du har deklarert. Håndter unntaket i stedet for å anta at hvert navn løses opp, og les listen på nytt når apper installeres eller fjernes i stedet for å bufre den for alltid.
Administrerte enheter legger til en tredje eier. En virksomhetsmobilitetspolicy kan sette en VPN per app eller en alltid på-profil, og en vanlig app kan ikke overstyre den. Sjekk om enheten er administrert før du feilsøker din egen kode, for i så fall er listen du prøver å endre kanskje ikke redigerbar for noen som holder telefonen.
Test det med en app du kontrollerer
Ikke test med appen du prøver å filtrere. Bruk en andre app der du kan observere nettverksatferden, og sjekk om trafikken går ut gjennom tunnelen din mens målets ikke gjør det. Hvis begge blir inne, virker policyen og målet er utelukket; hvis ingen kommer ut, er tunnelen selv feil og app-listen er ikke problemet.
Avgjør deretter hvilken av tre ting du faktisk bygger. En tunnel per app er bygger-API-et, med listen som del av profilen din. En enhetsbrannmur er pakkehåndtering pluss en livssyklus du kan forsvare. Å endre noen andres VPN er ikke en støttet vei i det hele tatt, og det ærlige svaret der er at innstillingen tilhører det produktet.