En aktive VPN an enger sandboxed Mac-App erkennen
Et gëtt keng ëffentlech API fir dës Fro, an den Trick mam Interface-Numm ass just eng Heuristik. Sechs Kontrollen, fir ze entscheeden, op wat deng App wierklech sollt ugewise sinn.
Du brauchs een Ecran, dee sech anescht verhält, wann den Tunnel un ass, an et gëtt kee Opruff, deen der dat seet. Dat ass d'Versandbeschränkung: op macOS mellt kee ëffentlecht Framework, ob en beliebige VPN verbonnen ass, an op iOS gehéiert de Status zu der App, déi d'Konfiguratioun installéiert huet. D'Kontrollen hei drënner ginn vun dëser Grenz bis bei eppes, wat s du verschécke kanns, an all eenzel kann d'Sich virzäiteg ophalen.
Kontroll 1: ass d'Fro iwwerhaapt beäntwertbar?
Sandboxing entscheet d'Fro, ier et eng API mécht. En Drëttparteie-Prozess kann d'Erweiderung vun engem anere Fournisseur net opzielen an och net hir Konfiguratioun liesen, also gëtt et keen ënnerstëtzten Objet, deen ee froe kann.
All Ëmwee stéisst op déi selwecht Mauer. Interface-Lëschten, scutil --nc list an direkt Liese vun der Systemkonfiguratioun erfuerdere sief et Berechtegungen, déi d'Sandbox zréckhält, sief et Verhalen, dat Apple ni versprach huet. Wann de Plang eng vun deene brauch, ass de Plang de Problem. Eng Funktioun, déi op engem ondocumentéierten Detail opgebaut ass, ass en Supportticket mat engem Liwwerdatum.
Kontroll 2: verwalt deng App den Tunnel selwer?
Wann jo, hues du eng ënnerstëtzt Äntwert fir deng eege Konfiguratioun. Lued d'Astellungen, behandelt de Feeler, lies dann de Status a schreif dech op Ännerungen an, amplaz ze pollen:
vpnManager.loadFromPreferences { error in
// handle a load failure before reading status
}
NotificationCenter.default.addObserver(
forName: .NEVPNStatusDidChange,
object: nil,
queue: nil
) { note in
let status = (note.object as? NEVPNConnection)?.status
}Sief präzis, wat dëst zréckgëtt: den Zoustand vum Tunnel, deen s du installéiert hues. En Notzer, deen en anere Client lafe léisst, gëtt als getrennt ugewise, an dat ass kee Feeler an dengem Code. Entscheet, wéi eng vun dësen zwou Froe deng Funktioun wierklech stellt, ier s du op d'Äntwert baus.
Kontroll 3: wat géif eng Heuristik der wierklech soen?
Den dacks kopéierten Usaz freet de System-Proxy-Wierderbuch no senge scopeierten Androunge a liest d'Schlësselen, déi just esou Interface-Nimm sinn:
let settings = CFNetworkCopySystemProxySettings()?.takeRetainedValue() as NSDictionary?
let scoped = settings?["__SCOPED__"] as? [String: Any]
let names = scoped?.keys ?? []E Schlëssel, deen mat tap, tun, ppp, ipsec oder utun ufänkt, bedeit, datt en tunnel-scopeierte Interface do ass. De ganzen Numm ze vergläichen schléit direkt feel, well iOS 12 mat utun1 an utun2 koum a verschidde Profiler als ipsec4, ppp0 oder utun0 erschéngen. Vergläich amplaz d'Prefixer.
Trotzdem identifizéiert en Numm keen Eegentemer. Systemfunktiounen an d'Erweiderunge vun anere Fournisseuren erzeugen och utun-Interfacen, an eng ka bestoen, ouni eppes vun dengem Trafik ze droen. Lies et als Hiweis, datt eppes Tunnel-Fërmeges an der Géigend ass, net méi staark. E falsch Positiv ass hei bëlleg, wann s du just eng Funktioun ofsécher, an deier, wann s du den Login-Ecran ofsécher.
Kontroll 4: kanns du amplaz d'Zil testen?
Wann d'App just wësse muss, ob en internen Service erreechbar ass, test dee Service. Eng kuerz Probe mat engem Timeout beäntwert d'Fro, vun där d'Funktioun wierklech ofhänkt, an se funktionéiert weider, wann den Notzer de Client wiesselt oder den Tunnel seng Form ännert.
Erreechbarkeet ass eng Observatioun iwwer deng Streck. En Interface-Numm ass eng Ofleedung iwwer eppes niewent dengem Wee, dofir produzéiert d'Heuristik Diskussiounen a Feelerberichter an d'Probe Beweiser. Wann d'Probe feelt, während den Notzer drop behaart, datt de VPN un ass, hues du elo eng konkret Streck zum Debuggen: Nummopléisung, Route oder Serviceberechtegung.
Kontroll 5: kann d'Plattform duerchsetzen, wat s du brauchs?
Wann d'Ufuerderung eng Garantie ass, datt näischt aus dem Tunnel entkommt, gehéiert de Profil dohin, net den Detektor. includeAllNetworks an enger Volltunnel-Konfiguratioun op iOS 14 oder méi spéit anzeschalten ännert d'Verhalen vun der Plattform, amplaz datt deng App et soll ofleeden. De Fändel ass dokumentéiert an der NEVPNProtocol-Referenz.
Dat ass eng aner Aart Äntwert: Duerchsetzen amplaz Observatioun. Se gëllt och just fir Profiler, déi s du kontrolléiers, also hëlleft se enger Konsumenten-App net, déi den Tunnel vun engem aneren iwwerwaacht.
Kontroll 6: maach de Feeler sécher an observéierbar
Schalt just d'Fähegkeet aus, déi den Tunnel brauch, a loos de Rescht vun der App benotzbar. En Detektor, deen déi ganz Interface verstoppt, wann en onsécher ass, fabrizéiert en Ausfall fir jiddwereen, deem säin Tunnel en Numm benotzt, deen s du ni erwaart hues. Gëff amplaz op dat konservatiivt Verhalen zréck: lokal Funktiounen funktionéieren weider an just de Fernopruff, deen den Tunnel wierklech brauch, gëtt deaktivéiert. Dee Choix ass eng Produktentscheedung, an se verdéngt et, niewent der Heuristik opgeschriwwen ze ginn.
Log, wat s du observéiert hues: Interface-Nimm, Plattformversioun an d'Resultat vun enger Probe. Dat mécht den nächsten Bericht aus enger Diskussioun eng Kontroll. Dann bevorzug eng ënnerstëtzt Deklaratioun, wou s du eng hues, well eng verwalt Konfiguratioun d'Absicht ausdrécklech droe kann an de meeschte Grond ewechhuele kann, Nimm iwwerhaapt ze kontrolléieren.
Wann d'Kontrollen 1 bis 5 dech ouni eng ënnerstëtzt Äntwert gelooss hunn, verschéck d'Probe a bezeechnung d'Resultat éierlech. En dokumentéierte Bescht-Effort-Signal ass eng besser Produktentscheedung wéi eng privat API, déi bei der nächster Verëffentlechung brécht.