Nee, eng VpnService-App kann de VPN vum Telefon net aschalten
D’App besëtzt een Tunnel an säi Liewenszyklus, net de VPN-Schalter vum Telefon. D’Awëllegung kann zréckgezunn ginn, et leeft ëmmer nëmmen ee VPN gläichzäiteg, an d’Paketë musst Dir selwer analyséieren.
D’falsch Uannahm ass, datt eng VpnService-App e Systemschalter ëmdréit an datt den Telefon vun do un geschützt ass. Wat tatsächlech geschitt, ass méi enk: d’App freet no Awëllegung, baut eng Schnëttstell, liest a schreift Paketë duerch en Dateideskriptor, an gëtt d’Schnëttstell zréck wann se ophält. Et kann ëmmer nëmmen een esouchen Tunnel gläichzäiteg lieweg sinn, an de System kann en huelen ouni ze froen. De gréissten Deel vum verwirrenden Verhalen, dat d’Leit dem Protokoll uschreiwen, kënnt aus deem Besëtzmodell.
Behandelt all Iwwergang am Liewenszyklus als Deel vum Design, net als Randfall.
Mythos: d’App schalt de VPN vum Telefon an
Den Oflaf fänkt mat VpnService.prepare() un, deen en Intent zréckgëtt, deen de Benotzer muss akzeptéieren, a geet mat establish() weider, deen duerno nach aus Grënn feele kann, déi d’App net kontrolléiert. En zweete Tunnel opzebauen deaktivéiert déi éischt Schnëttstell an ersetzt d’Systemnotifikatioun. Niergendwo an där Reiheet besëtzt d’App en appaaratwäiten Schalter; si besëtzt den Deskriptor, deen hir ginn ass, an d’Paketë, déi drop landen. Och d’dauerhaft Notifikatioun gehéiert dem System an net dem Design vun der App.
Well d’Schnëttstell ginn an net gegraff gëtt, kann en anere Client de Platz zu all Moment huelen. D’App léiert dat duerch en Zeréckruff, net duerch en Zeréckgabwäert.
Datt d’App forcéiert gestoppt gouf, ass aus deem selwechte Grond am Notifikatiounsberäich ze gesinn: de System mëttelt, wat en ginn huet, net wat d’App gewielt huet ze weisen.
Mythos: d’Awëllegung gëtt eng Kéier ginn
Wann de System den Tunnel un en anere Client iwwergëtt, schéckt en eng Zréckzuchstransaktioun op de binder, deen d’Basisklass aus onBind() zréckgëtt. Eng App, déi dee binder duerch hiren eegene ersetzt, muss d’Zréckzuchstransaktioun selwer weiderschécken, soss gëtt VpnService.onRevoke() ni ausgeléist an de Service schreift weider an en Deskriptor, deen et net méi gëtt. D’Genehmegung kann och de Benotzer zréckzéien, an de System kann de Service wärend engem Neistart oder enger Ëmmer-un-Verbindung stoppen.
Domat ëmzegoen ass konkreet Aarbecht an net eng Logzeil: hält op den Deskriptor ze liesen, maacht en zou, läscht de Verbonne-Fändel a sot dem Benotzer a wéien Zoustand hien ass. Entscheet dann, ob d’App soll nei opbauen, nach eng Kéier froen oder waarden, well an enger Ëmmer-un-Konfiguratioun kann de System de Service vun sech aus zréckbréngen.
Eng App, déi den Zréckzuch als Ausnam an net als Zoustand behandelt, mëttelt verbonnen, während all Paket, dat se schreift, verworf gëtt, an dat ass dee schlëmmste Méiglechkeet-Feelermodus fir eng Dateprotection-Utilitéit.
Mythos: d’Schnëttstell filtert den Trafic fir Iech
Wat ukommt, ass rohe IP. Ofgräifen oder filtere bedeit IP-, TCP-, UDP- an IPv6-Headeren ze analyséieren, Flëss ze verfollegen an Äntwerten zréck an den Deskriptor ze schreiwen, wat eng Opgräif-App zu engem klengen Netzwierkstapel mécht an net zu enger Systemanlag. protect() existéiert, damatter den eegenen Transport-Socket vun der App ëm hiren Tunnel geet amplaz sech selwer ofzegräifen, an en gëtt e Boolean zréck, deen op all Socket eng Iwwerpréiwung verdéngt, dee no dem Opbau vum Tunnel erstallt gëtt.
D’Lëschte vun erlaabten an net erlaabten Appen am Builder entscheeden, wien säin Trafic an d’Schnëttstell kënnt. Si ginn keen Zougang zu Belaaschtung iwwer d’IP-Paketë vun der Schnëttstell eraus, an et gëtt keen API, deen den Tunnel vun engem anere Client weist oder d’VPN-Profile vum System opzielt. Netzwierkfäegkeeten kënnen soen, datt en Netzwierk VPN-Transport ass, awer net wiem säin Tunnel et ass.
Dofir kréien Zoustands-Froe fir aner Appen iderspriechen Äntwerten: d’Informatioun ass einfach net fir Äre Prozess ugeluecht.
Wat de Liewenszyklus wierklech verlaangt
Verfollegt d’Zoustänn, déi Dir kontrolléiert: prett, opgebaut, zréckgezunn, gestoppt. Eng Neiverbindung soll Ofbau gefollegt vum Opbau sinn, mat engem eenzegen Eegentümer fir den Deskriptor an den Transport-Socket, well zwee Komponenten, déi sech ëm den Opbau räissen, sech ëm deen eenzege fräie Platz sträiten. Hannergrond-Starts si limitéiert op modernem Android, dofir ass eng Boot-Ausstrahlung keng Garantie; benotzt e Vierdergrondservice mat senger Notifikatioun, wou den API-Niveau et erlaabt.
Logt den Iwwergang an net just den Endzoustand, a hält d’Zoustandsmaschinn kleng genuch, fir all Wee ze testen. En Zoustand, deen Dir am Test net erreecht, ass en Zoustand, deen Dir am Feld ouni Log begéint.
Test de Liewenszyklus op engem Apparat
Emulatoren kënnen d’Verbindung fälschen, awer net de Wee vun der Awëllegung an dem Zréckzuch iwwerzeegend, dofir fuert dës op engem richtegen Apparat mat engem zweeten installéierte VPN-Client, dee de Platz klaut.
adb shell dumpsys connectivity | grep -i -A3 vpn
adb shell dumpsys activity services | grep -i -A2 vpnservice
adb logcat -s VpnService:V AndroidRuntime:E
adb shell am force-stop com.example.vpnapp
Start den Tunnel, bestätegt d’Notifikatioun an d’Schnëttstell, verbënnt dann den anere Client a kuckt, ob de Zréckzuch-Zeréckruff leeft an den Zoustand sech läscht. Stoppt d’App forcéiert a préift, ob nach eppes en liewegen Deskriptor mëttelt.
Widderhielt d’Reiheet no engem Ëmmer-un-Neistart, well dee Wee sech vun enger vum Benotzer gestarteter Verbindung ënnerscheet. Wat Dir sicht, ass net en gréngen Ikon, mä den Noweis, datt d’App opgehalen huet en Deskriptor ze benotzen, deen se net méi besoss.