iPhone у VPN? Што насамрэч можа ўбачыць праграма для iOS
У SDK iOS няма адзінага сцяга VPN. Праграма можа назіраць уласную канфігурацыю, апавяшчэнне пра статус і абмежаваны здымак проксі — і нічога больш.
Спытайце ў праграмы для iOS, ці тэлефон у VPN, і сумленны адказ будзе такі: яна не можа ведаць гэтага так, як вы маеце на ўвазе. SDK не прадстаўляе ніякага сцяга для «прылада ў тунелі», а прыватныя інтэрфейсы, якія маглі б наблізіцца да гэтага, зачыненыя для праграм, што публікуюцца. Вы можаце назіраць уласную канфігурацыю праграмы, стан, прывязаны да яе, і адзін-два ўскосныя намёкі з сеткавага стэка. Кожны адказвае на сваё пытанне, і большасць зламаных праверак паходзіць ад таго, што адзін з іх прымаюць за ўвесь адказ.
Міф пра адзіны сцяг VPN
Існуе перакананне, што недзе ў SDK ёсць уласцівасць, якая паведамляе, ці прылада ў тунелі, гэтак жа, як сцяг дасягальнасці паведамляе, ці адказвае хост. Такой публічнай уласцівасці не існуе. Нават калі б яна была, «тунель існуе» і «мой трафік ідзе праз яго» — гэта розныя сцвярджэнні, і для большасці праграм важнае толькі другое.
Менавіта праз гэтую прагаліну бібліятэкі, што рэкламуюць дэтэктар VPN у адзін радок, звычайна чытаюць нешта крохкае — імя інтэрфейса або ключ проксі — і падаюць гэта як прысуд.
Загрузіце налады, перш чым давяраць nil
Агульны асобнік менеджара існуе адразу, як вы яго запытаеце, але яго ўласцівасць пратакола застаецца nil, пакуль не завершыцца зваротны выклік загрузкі. Таму nil пратакола азначае «яшчэ не загружаны» як мінімум гэтак жа часта, як «не ўсталяваны». Рабіце чытанне ўнутры блока завяршэння і толькі потым вырашайце: аб'ект пратакола, які існуе і мае ўключаны сцяг, — гэта і ёсць «усталяваны».
Другі сігнал знаходзіцца на аб'екце злучэння: несапраўдны стан, які сістэма паведамляе, калі ў гэтай праграмы няма ўсталяванай канфігурацыі. Несапраўдны статус разам з nil пратакола пасля завершанай загрузкі — гэта сапраўдная адсутнасць, а не гонка часу.
Змены злучэння прыходзяць як апавяшчэнні
Апрацоўнікі, перададзеныя load і save, паведамляюць, што адбылося з канфігурацыяй, а не што робіць тунель. Чаканне, што адзін з іх спрацуе ў момант падключэння, — гэта гонка, якая ніколі не вырашаецца. Назірайце замест гэтага апавяшчэнне пра змену статусу і чытайце бягучае значэнне аб'екта злучэння, калі яно прыйдзе.
Пасля ўсталявання канфігурацыі стан злучэння праходзіць кароткую паслядоўнасць: адключана, падключаецца, падключана, пацвярджаецца зноў, адключаецца. «Падключана» апісвае тунель, а не сервер за ім, таму гэта не доказ, што трафік ідзе. On-demand таксама можа ўзняць тунель, пакуль праграма прыпыненая, і тады апавяшчэнне прыходзіць раней, чым у вас з'явіцца што абнавіць.
Абмежаваны здымак проксі — гэта намёк, а не прысуд
CFNetwork можа перадаць праграме бягучыя сістэмныя налады проксі, і ўнутры гэтага выніку ёсць абмежаваны слоўнік з ключамі па імені інтэрфейса. Імя, што пачынаецца з tun, utun, ppp, ipsec або tap, — гэта намёк, што тунель прысутнічае. Гэта застаецца здымкам таго, што бачыць гэтая праграма, а не сцвярджэннем пра тое, куды ідуць пакеты.
Пастаўшчыкі разыходзяцца ў назвах, таму адсутнасць прэфікса нічога не даказвае, а наяўны інтэрфейс можа існаваць, не пераносячы трафіку. Дасягальнасць яшчэ слабейшая: паспяховы запыт да прыватнага адраса паказвае, што шлях працаваў для гэтага запыту ў той момант, а не што VPN усталяваны.
Сімулятар пазычае Mac, а іншыя праграмы застаюцца нябачнымі
У сімулятара няма ўласнага сеткавага стэка; кожнае злучэнне, якое ён робіць, — гэта злучэнне Mac. Таму VPN, які працуе на хост-машыне Mac, ужо дзейнічае для сімуляванай праграмы, а ўласныя налады сімулятара нічога не паказваюць. Калі тунель узняўся пасля запуску сімулятара, перазапуск звычайна хутчэйшы за адладку праграмы. Хост на нестандартным порце патрабуе гэтага порта ў URL або лакальнай пераадрасацыі накшталт socat TCP-LISTEN:12345,fork TCP:host:12345.
Публічныя API не будуць пералічваць профілі VPN, якія належаць іншым праграмам або профілям канфігурацыі. Для адной вядомай праграмы пераносным трукам з'яўляецца праверка схемы URL праз canOpenURL, а з iOS 9 запытаная схема павінна быць абвешчана ў вашым Info.plist; калі яе не паказаць, выклік верне false. OpenVPN Connect адказвае на openvpn://, што робіць яго добрым прыкладам і дрэнным агульным дэтэктарам.
Аб'яднайце тры назіранні і скажыце, што яны значаць
Складзіце тры вынікі на практыцы: канфігурацыя, якая загрузілася і ўключана; стан злучэння, які не несапраўдны; і запыт да адраса, дасягальнага толькі праз тунель. Кожнае паасобку ўводзіць у зман; разам яны кажуць пра тое, што праграма можа ведаць, а не пра тое, што мяркуе карыстальнік.
Запішыце вынік як тры радкі ў дыягностыцы, а не як адзін boolean. Калі карыстальнік кажа, што VPN выключаны, а ваша праграма не згодна, тры радкі паказваюць, якое назіранне разышлося, і гэта розніца паміж зваротам у падтрымку, з якім можна нешта зрабіць, і такім, што сканчаецца словамі «у мяне працуе».