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-аас илүү сайн бүтээгдэхүүний шийдвэр юм.