iOS VPN деген атка үч башка продукт жооп берет жана алар бир API бөлүшпөйт. Personal VPN системанын ичине орнотулган IPsec жана IKEv2 транспортторун колдонот. Custom tunnel өз протоколуңузду network extension ичинде иштетет. Configuration profile экөөнүн бирин конфигурациялайт жана on-demand жүрүм-турумун кошо алат. Сүйлөшүүгө тийиш транспорт боюнча тандоо, биринчи компиляцияланган окуу куралы боюнча тандоодон тезирээк.

Төмөнкү текшерүүлөрдү тартиби менен аткарыңыз, анткени ар бир кадам мурункусу туура конфигурация чыгарды деп эсептейт.

1-кадам: транспорт боюнча тандаңыз

Эгер сервер IKEv2 же Cisco стилиндеги IPsec болсо, NEVPNManager жетиштүү жана системалык транспорттор акысыз келет. Эгер сервер OpenVPN, WireGuard же башка нерсени сүйлөсө, NEVPNManager жардам бере албайт: анын үчүнчү тараптын протоколу үчүн илгичи жок. Ал учур протоколду ишке ашырган packet tunnel provider менен NETunnelProviderManager талап кылат. Профиль конфигурацияны гана таратат жана операциялык системада жок транспортту кошо албайт.

PPTP азыркы системаларда максат эмес. Shared-secret IPsec азыр да remoteIdentifier ичиндеги топ атын, сырды сактаган keychain элементин жана сервер колдонуучу атын сураганда кеңейтилген аутентификацияны күтөт. Ар бир жетишпеген бөлүк ошол эле жалпы конфигурация катасы катары көрүнөт, ошондуктан башка нерсени оңдоодон мурун алардын баарын кошуңуз.

2-кадам: сактоо, жүктөө, баштоо тартибин сактаңыз

NEVPNManager preferencesке жазат, аларды кайра окуйт, анан гана баштайт. Протокол жана manager объектилерин толтуруңуз, saveToPreferences чакырыңыз, loadFromPreferences чакырыңыз жана load completion handlerден startVPNTunnel чакырыңыз. Жүктөө кайтпай туруп баштоо башка жагынан туура конфигурацияда configuration-invalid катасын, NEVPNErrorDomain code 1, жаратат.

Форма бир жерде сактоого жетиштүү кыска:

manager.protocolConfiguration = proto
manager.isEnabled = true
manager.saveToPreferences { }
manager.loadFromPreferences { manager.connection.startVPNTunnel() }

startVPNTunnel суроо кабыл алынганда кайтат, туннель көтөрүлгөндө эмес. NEVPNStatusDidChange байкаңыз жана чыныгы абал үчүн connection.status окуңуз. Чакыруу жеринде ийгилик деп эсептеген колдонмо extension дагы сүйлөшүү жүргүзүп жатканда VPN туташтырылды деп билдирет. Connecting абалы бир учурга кадимки; андан эч качан чыкпаган абал — журналга жазганга татыктуу ката.

3-кадам: provider процессине керектүү нерсени бериңиз

Custom transport өз bundle identifier жана өз entitlement бар өзүнчө процессте иштейт. Container колдонмо да, provider да кол коюу учурунда network-extension entitlement керек, ал эми App Store сыртындагы Developer ID build аны provisioning profile ичинде алып жүрүүгө тийиш. Жетишпеген entitlement протокол катасына окшош, анткени extension жөн эле башталбайт.

Карызга ала турган коомдук socket descriptor жок. NEPacketTunnelProvider сизге read, write жана cancel менен NEPacketTunnelFlow берет, ал эми жеке ачкыч жолдоруна жеткен код чыгарылыштар ортосунда бузулат. Колдонмо backgroundда болгондо provider иштей берет, ошондуктан container колдонмого бул үчүн background режими керек эмес.

4-кадам: on-demand — эрежелер жыйындысы, өчүргүч эмес

isOnDemandEnabled эрежелерди гана куралдандырат; туннель качан көтөрүлөрүн NEOnDemandRuleConnect жана анын бир туугандары чечет. probe URL бар evaluate-connection эрежеси ошол URL канчалык жакшы болсо, ошончолук жакшы. Эгер probe туннелсиз жооп берсе, эреже жеке тармакка мурун эле жетүүгө болот деп тыянак чыгарат жана эч качан туташпайт, ошондуктан аны ичтен гана жооп берген нерсеге багыттаңыз.

Always-on өзүнчө убада. Ага көзөмөлдөнгөн түзмөк жана башкарылуучу профиль керек, ал эми көзөмөлдөнбөгөн колдонуучу профилди каалаган убакта алып сала алат. Флот көзөмөлдөнбөсө, always-onго көз каранды долбоорду чыгарбаңыз.

5-кадам: белгини эмес, жолду далилдеңиз

tun, tap, ppp же ipsec интерфейстерин скандоо VPN конфигурацияланганын далилдейт, бирок сурооңуз аны колдонгонун эмес. NWPathMonitor usesInterfaceType(.other) менен виртуалдык интерфейс жеткиликтүү деп айтат, ал эми viability handler бир хостту текшере алат. Экөө тең чыгуу жолун далилдебейт, ошондуктан аларды туннель гана жете алган ресурска суроо менен айкалыштырыңыз. Интерфейс аттары диагностикалык жардамчы, колдонмо логикасы бутактанышы керек болгон дарбаза эмес.

Талаа текшерүүсү үчүн коомдук даректи туннель менен жана ансыз салыштырып, ички гана баракты алыңыз. Status чакыруу provider сүйлөшүп жатканда туташтырылды деп билдириши мүмкүн, ошондуктан чечимди ресурстун жыйынтыгы кабыл алсын, ал эми statusту кошумча далил катары караңыз.

Тектеш макалалар