VpnService protect() oder App-Ausschloss: wat d'Routing reparéiert
De Socket schützen, deen den Tunnel dréit, oder déi ganz App ausschléissen: déi dräi Konditiounen, déi entscheeden, wéi eng Breet Ären Android-VPN brauch.
Et gëtt zwee Weeër, fir d'eegen Pakete vum Tunnel aus dem Tunnel ze halen: den Transport-Socket schützen oder déi ganz App aus dem VPN huelen. Si léisen ënnerschiddlech Problemer, an dee méi breede Wee ze wielen, well en einfach ze verkabelen ass, ass genau de Wee, op deem Appen den Zougang zum lokalen Netz an de gesplitteten DNS verléieren, ouni et ze mierken. Fänkt domat un, wat baussen dem Tunnel bleiwe muss, a wielt dann déi klengst Breet, déi dat erreecht.
Wat protect() aus dem Tunnel eraushëlt
VpnService.protect() ass en Opruff pro Socket. Dir gitt him de Socket oder den Deskriptor, deen den Tunnel dréit, an Android markéiert dee Socket, sou datt säi Verkéier dat ënnerleeënd Netz amplaz vun der VPN-Interface benotzt. Alles anescht, wat d'App schéckt, follegt nach ëmmer der normaler VPN-Route.
Genau déi schmuel Breet ass de Punkt. En geschützte Socket ännert net, wéi Ären HTTP-Client Nimm opléist, wéi eng Interface Är Analyse-Opruffer benotzen oder wat mat enger zweeter Verbindung geschitt, déi méi spéit opgemaach gëtt.
Dräi Konditiounen, déi d'Breet entscheeden
Déi éischt Konditioun ass, ob nëmmen den Transport vum Tunnel eraus muss. Wann de Rescht vum Verkéier vun der App weider duerch de VPN soll goen, ass de Socket-Schutz déi richteg Breet. Déi zweet Konditioun ass, ob Dir d'Erstelle vum Socket kontrolléiert. Eng Bibliothek, déi hire eigenen Socket déif banne opmécht, léisst Iech keng Plaz, fir protect() opzeruffen, ausser si bitt en Hook un oder hëlt en deselwechts fäerdege Socket. Déi drëtt Konditioun ass, ob d'App direkt d'Lokalnetz oder e Captive Portal erreeche muss, wat eng aner Fuerderung ass wéi den Tunnel lieweg ze halen.
D'App ausschléissen mat addDisallowedApplication() ass dat grobt Instrument. Et hëlt all Verbindung, déi d'App mécht, aus dem VPN, och déi, déi Dir wollt nokucken, an op eenzel Geräter ännert et och, wéi sech déi lokal Entdeckung behuelen.
Eng drëtt Méiglechkeet ass, den Transport un ee gewielten Netz ze bannen mat bindProcessToNetwork() oder engem Netz-Handle um Socket-Niveau. Dat ass nëtzlech, wann d'Gerät gläichzäiteg Wi-Fi a Mobilfunk huet a Dir wëllt, datt den Tunnel iwwer eng bestëmmten Uplink leeft.
Rufft en op, wärend den Transport entsteet
Rufft protect() am selwechten Block op, deen den Transport erstellt, virum connect() oder send(). Wann den Opruff false zréckgëtt, schléisst de Socket a loosst d'Astellung feelen; weidermaache léisst Iech en Transport, deem seng Pakete kéinten zréck an Är eegen Interface kommen.
D'Form ass kleng genuch, fir se op enger Plaz ze halen:
DatagramSocket transport = new DatagramSocket();
if (!protect(transport)) {
transport.close();
throw new IOException("transport not protected");
}
transport.connect(serverAddress);Dräi Detailer bäissen hei. Éischtens,de Boolean ass dat eenzegt Signal, dat Dir kritt, also loggt de Feeler mat genuch Kontext, fir eng widergeruffe Zustimmung vun engem refuséierten Opruff z'ënnerscheeden. Zweetens,protect() deckt de Socket of, net d'Deskriptor-Nummer: wann Dir de Socket schléisst an duerno déiselwecht Ganzzuel fir en anere Socket notzt, ass den neie Socket net geschützt. Drëttens, wann eng native Bibliothek den Transport opmécht, schützt den Deskriptor, ier den native Code sech verbënnt, soss ka d'Route schonn gewielt sinn.D'VpnService-Referenz ass d'Plaz, wou Dir bestätegt, wéi eng Iwwerlaaschtungen Ären Zil-API-Niveau tatsächlech ubitt.
Test de blockéierten Wee, net nëmmen de glécklechen
Verifizéiert mam Tunnel erop, well dat deen eenzege Staat ass, an deem déi zwee Weeër ënnerscheede kënnen. Schéckt eng Ufro duerch den geschützten Transport an eng vun engem Codewee, dee ni protect() opgeruff huet, a vergläicht dann, wat de wäiten Enn gesäit: déi geschützt Verbindung soll mam ënnerleeënden Netz als Quell ukommen, wärend déi ongeschützt dem Tunnel seng eegen Adress weist an seng Byte-Zähler beweegt. Op dem Gerät weist ss oder netstat déiselwecht Split-Opdeelung, ier eppes den Radio verléisst.
Test d'Widergeruffe getrennt, well eng Ännerung vun der Zustimmung d'Interface ofrappt, ouni Äre Socket-Code ze beréieren. Rufft d'VPN-Zustimmung zréck oder stoppt de Service, baut den Transport nei op a bestätegt, datt protect() nach ëmmer true zréckgëtt an den Transport sech erëm verbënnt, soubal d'Zustimmung erëm gëtt.
Wann d'geschützt Ufro trotzdeem dem Tunnel follegt, geschitt den Schutzopruff wahrscheinlech, nodeem de Socket scho geroutet gouf. Verréckt en méi fréi a testt nach eng Kéier.
Halt d'Entscheedung nieft der Transport-Astellung schrëftlech: wéi eng Sockets geschützt sinn, wéi ee Verkéier vun der App ausgeschloss ass, a wat d'App mécht, wann de Schutz feelt. Genau déi Linn verhënnert, datt e spéidert Refactoring den Ausschloss op déi ganz App verbreet, well een eenzegen Test gefeelt huet. Et gëtt der nächster Persoun och eng Méiglechkeet, d'Absicht ze kontrolléieren, ouni de Manifest zréckzeentwéckelen.