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

Повезани чланци