Прашајте 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 е исклучен, а вашата апликација не се согласува, трите реда покажуваат кое набљудување отстапило, и тоа е разликата меѓу билет за поддршка на кој можете да дејствувате и таков што завршува со «кај мене работи».

Поврзани статии