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ден жакшыраак продукт чечими.