Zaznavanje dejavnega VPN v peskovniku omejeni aplikaciji Mac
Za to vprašanje ni javnega API-ja, trik z imenom vmesnika pa je le heuristika. Šest preverjanj, da se odločite, na kaj naj se vaša aplikacija v resnici zanaša.
Potrebujete en zaslon, ki se obnaša drugače, ko je tunel aktiven, in ni klica, ki bi vam to povedal. To je omejitev pri izdaji: v macOS nobeno javno ogrodje ne poroča, ali je povezan poljuben VPN, v iOS pa stanje pripada aplikaciji, ki je namestila konfiguracijo. Spodnja preverjanja vodijo od te meje do nečesa, kar lahko izdate, in vsako od njih lahko iskanje konča zgodaj.
Preverjanje 1: je na vprašanje sploh mogoče odgovoriti?
Peskovnik reši vprašanje prej kot kateri koli API. Proces tretje strani ne more našteti razširitve drugega ponudnika in ne more prebrati niti konfiguracije te razširitve, zato ni podprtega predmeta, ki bi ga lahko vprašali.
Vsak obhod se zaleti v isto steno. Seznami vmesnikov, scutil --nc list in neposredno branje sistemske konfiguracije bodisi zahtevajo pravice, ki jih peskovnik zadrži, bodisi so odvisni od vedenja, ki ga Apple ni nikoli obljubil. Če načrt potrebuje eno od tega, je problem načrt. Funkcija, zgrajena na nedokumentirani podrobnosti, je zahtevek za podporo z datumom dobave.
Preverjanje 2: ali vaša aplikacija upravlja tunel sama?
Če ga, imate podprt odgovor za svojo konfiguracijo. Naložite nastavitve, obravnavajte napako, nato preberite stanje in se naročite na spremembe, namesto da bi anketirali:
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
}Bodite natančni glede tega, kaj to vrne: stanje tunela, ki ste ga namestili. Uporabnik z drugim odjemalcem bo prikazan kot nepovezan, in to ni hrošč v vaši kodi. Odločite se, katero od teh dveh vprašanj vaša funkcija v resnici postavlja, preden zgradite na odgovoru.
Preverjanje 3: kaj bi vam heuristika v resnici povedala?
Široko kopirani pristop vpraša sistemski slovar proxyja za njegove omejene vnose in prebere ključe, ki so po naključju imena vmesnikov:
let settings = CFNetworkCopySystemProxySettings()?.takeRetainedValue() as NSDictionary?
let scoped = settings?["__SCOPED__"] as? [String: Any]
let names = scoped?.keys ?? []Ključ, ki se začne z tap, tun, ppp, ipsec ali utun pomeni, da je prisoten vmesnik z obsegom tunela. Ujemanje celotnega imena takoj spodleti, ker je iOS 12 prinesel utun1 in utun2, nekateri profili pa se prikažejo kot ipsec4, ppp0 ali utun0. Primerjajte predpone.
Kljub temu ime ne identificira lastnika. Sistemske funkcije in razširitve drugih ponudnikov tudi ustvarjajo vmesnike utun, in eden lahko obstaja, ne da bi prenašal kar koli vašega prometa. Berite to kot namig, da je v bližini nekaj v obliki tunela, nič močnejšega. Lažno pozitiven izid je tu poceni, če omejujete samo eno funkcijo, in drag, če omejujete prijavni zaslon.
Preverjanje 4: lahko namesto tega preizkusite cilj?
Če mora aplikacija le vedeti, ali je notranja storitev dosegljiva, preizkusite to storitev. Kratka sonda s časovno omejitvijo odgovori na vprašanje, od katerega je funkcija v resnici odvisna, in deluje naprej, ko uporabnik zamenja odjemalca ali tunel spremeni obliko.
Dosegljivost je opazovanje o vaši poti. Ime vmesnika je sklep o nečem, kar meji na vašo pot, zato heuristika ustvarja prepire v poročilih o napakah, sonda pa dokaze. Če sonda spodleti, medtem ko uporabnik vztraja, da je VPN vklopljen, imate zdaj konkretno pot za odpravljanje napak: razreševanje imen, pot ali dovoljenje storitve.
Preverjanje 5: lahko platforma vsili, kar potrebujete?
Ko je zahteva jamstvo, da nič ne uide iz tunela, je profil pravo mesto, ne detektor. Vklop includeAllNetworks v konfiguraciji polnega tunela v iOS 14 ali novejšem spremeni vedenje platforme, namesto da bi vaša aplikacija to sklepala. Zastavica je dokumentirana v referenci NEVPNProtocol.
To je druga vrsta odgovora: vsiljevanje namesto opazovanja. Velja tudi le za profile, ki jih nadzirate, zato ne pomaga potrošniški aplikaciji, ki opazuje tuj tunel.
Preverjanje 6: naredite napako varno in opazljivo
Izklopite samo zmogljivost, ki potrebuje tunel, in pustite preostanek aplikacije uporaben. Detektor, ki ob vsaki negotovosti skrije celoten vmesnik, ustvari izpad za vsakogar, čigar tunel uporablja ime, ki ga niste nikoli predvideli. Vrnite se k konservativnemu vedenju: lokalne funkcije delujejo naprej in onemogočen je le tisti oddaljeni klic, ki resnično potrebuje tunel. Ta izbira je produktna odločitev in si zasluži, da je zapisana ob heuristiki.
Zabeležite, kaj ste opazili: imena vmesnikov, različico platforme in rezultat ene sonde. To spremeni naslednje poročilo iz prepira v preverjanje. Nato dajte prednost podprti izjavi, kjer jo imate, ker lahko upravljana konfiguracija izrecno nosi namero in odpravi večino razloga za preverjanje imen.
Če so vas preverjanja od 1 do 5 pustila brez podprtega odgovora, izdajte sonde in rezultat pošteno označite. Dokumentiran signal najboljšega truda je boljša produktna odločitev kot zasebni API, ki se zlomi v naslednji izdaji.