Sandbox режиміндегі Mac қолданбасында белсенді VPN-ді анықтау
Бұл сұраққа арналған жария API жоқ, ал интерфейс атауының тәсілі тек эвристика. Қолданбаңыз шынымен неге сүйенуі керек екенін шешуге арналған алты тексеру.
Туннель қосулы кезде бір экранның басқаша әрекет етуі керек, бірақ мұны айтатын шақыру жоқ. Бұл шығару шектеуі: macOS-те ешбір жария фреймворк ерікті VPN қосылғанын хабарламайды, ал iOS-те күй конфигурацияны орнатқан қолданбаға тиесілі. Төмендегі тексерулер осы шектен шығаруға болатын нәрсеге дейін апарады, және олардың кез келгені іздеуді ертерек аяқтауы мүмкін.
Тексеру 1: сұраққа мүлдем жауап беруге бола ма?
Sandbox кез келген API-ден бұрын сұрақты шешеді. Үшінші тарап процесі басқа жеткізушінің кеңейтімін тізімдей алмайды және сол кеңейтімнің конфигурациясын да оқи алмайды, сондықтан сұрауға қолдау көрсетілетін нысан жоқ.
Әрбір айналып өту бір қабырғаға соғылады. Интерфейс тізімдері, scutil --nc list және жүйе конфигурациясын тікелей оқу не sandbox ұстап тұрған рұқсаттарды талап етеді, не Apple ешқашан уәде етпеген мінез-құлыққа тәуелді. Егер жоспарға осылардың біреуі қажет болса, мәселе жоспарда. Құжатталмаған детальге құрылған функция — жеткізу күні бар қолдау билеті.
Тексеру 2: қолданбаңыз туннельді өзі басқара ма?
Егер басқарса, өз конфигурацияңыз үшін қолдау көрсетілетін жауабыңыз бар. Параметрлерді жүктеңіз, қатені өңдеңіз, содан кейін күйді оқып, сұрау жасаудың орнына өзгерістерге жазылыңыз:
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
}Бұл не қайтаратынына дәл болыңыз: сіз орнатқан туннельдің күйі. Басқа клиентті іске қосқан пайдаланушы ажыратылған ретінде көрінеді, және бұл сіздің кодыңыздағы қате емес. Жауапқа сүйенбес бұрын функцияңыз осы екі сұрақтың қайсысын шынымен қойып отырғанын шешіңіз.
Тексеру 3: эвристика сізге шын мәнінде не айтады?
Кеңінен көшірілген тәсіл жүйелік прокси сөздігінен оның ауқымды жазбаларын сұрайды және интерфейс атаулары болып шығатын кілттерді оқиды:
let settings = CFNetworkCopySystemProxySettings()?.takeRetainedValue() as NSDictionary?
let scoped = settings?["__SCOPED__"] as? [String: Any]
let names = scoped?.keys ?? []Кілт tap, tun, ppp, ipsec немесе utun деп басталса, туннель ауқымындағы интерфейстің бар екенін білдіреді. Толық атауды сәйкестендіру бірден сәтсіз болады, өйткені iOS 12 utun1 және utun2-мен келді, ал кейбір профильдер ipsec4, ppp0 немесе utun0 ретінде көрінеді. Оның орнына префикстерді салыстырыңыз.
Сонда да, атау ешбір иесін анықтамайды. Жүйелік функциялар мен басқа жеткізушілердің кеңейтімдері де utun интерфейстерін жасайды, және біреуі сіздің трафигіңіздің ешнәрсесін тасымалдамай-ақ болуы мүмкін. Мұны айналада туннель пішінді нәрсе бар деген белгі ретінде оқыңыз, одан күштірек емес. Мұндағы жалған оң нәтиже қымбат емес, егер сіз тек бір функцияны қақпаласаңыз, ал қымбат, егер кіру экранын қақпаласаңыз.
Тексеру 4: оның орнына межелі орынды тексере аласыз ба?
Егер қолданбаға ішкі қызметтің қолжетімді екенін білу ғана қажет болса, сол қызметті тексеріңіз. Таймаутпен қысқа сынақ функция шынымен тәуелді сұраққа жауап береді және пайдаланушы клиентті ауыстырғанда немесе туннель пішінін өзгерткенде де жұмыс істейді.
Қолжетімділік — бұл сіздің жолыңыз туралы бақылау. Интерфейс атауы — жолыңызға іргелес нәрсе туралы қорытынды, сондықтан эвристика қате есептерінде дау тудырады, ал сынақ дәлел тудырады. Егер пайдаланушы VPN қосулы деп талап еткенде сынақ сәтсіз болса, енді жөндеуге нақты жолыңыз бар: атауларды шешу, маршрут немесе қызмет рұқсаты.
Тексеру 5: платформа қажет нәрсені мәжбүрлей ала ма?
Талап туннельден ешнәрсе шықпайтынына кепілдік болғанда, профиль — соның орны, детектор емес. includeAllNetworks параметрін iOS 14 немесе одан кейінгі нұсқада толық туннель конфигурациясында қосу қолданбаңыздан қорытынды жасауды сұраудың орнына платформаның мінез-құлқын өзгертеді. Жалауша NEVPNProtocol анықтамасында құжатталған.
Бұл жауаптың басқа түрі: бақылаудың орнына мәжбүрлеу. Ол сондай-ақ тек сіз басқаратын профильдерге қатысты, сондықтан басқаның туннелін бақылап отырған тұтынушы қолданбасына көмектеспейді.
Тексеру 6: сәтсіздікті қауіпсіз және бақыланатын етіңіз
Тек туннель қажет мүмкіндікті өшіріп, қолданбаның қалғанын пайдалануға жарамды қалдырыңыз. Сенімді болмаған кезде бүкіл интерфейсті жасыратын детектор сіз ешқашан болжамаған атауды қолданатын туннелі бар әркімге іркіліс жасайды. Оның орнына консервативті мінез-құлыққа оралыңыз: жергілікті функциялар жұмысын жалғастырады және тек туннель шынымен қажет қашықтағы шақыру өшіріледі. Бұл таңдау — өнімдік шешім, және ол эвристиканың қасына жазылуға лайық.
Не бақылағаныңызды тіркеңіз: интерфейс атаулары, платформа нұсқасы және бір сынақтың нәтижесі. Бұл келесі есепті даудан тексеруге айналдырады. Содан кейін қолдау көрсетілетін декларация бар жерде соны қалаңыз, өйткені басқарылатын конфигурация ниетті анық тасымалдай алады және атауларды тексерудің көп себебін жояды.
Егер 1-ден 5-ке дейінгі тексерулер сізді қолдау көрсетілетін жауапсыз қалдырса, сынақты шығарыңыз және нәтижені адал белгілеңіз. Құжатталған барынша күш салу сигналы келесі шығарылымда бұзылатын жеке API-ден гөрі жақсы өнімдік шешім.