Ar „iPhone“ yra VPN tinkle? Ką iOS programėlė iš tikrųjų gali pamatyti
iOS SDK nėra vieno VPN požymio. Programėlė gali stebėti tik savo konfigūraciją, būsenos pranešimą ir ribotą tarpinio serverio momentinę kopiją, nieko daugiau.
Paklauskite iOS programėlės, ar telefonas yra VPN tinkle, ir sąžiningas atsakymas bus toks: ji negali to žinoti taip, kaip jūs turite omenyje. SDK neskelbia jokio požymio „įrenginys yra tunelyje“, o privatūs sąsajos elementai, kurie galėtų prie to priartėti, yra uždaryti platinamoms programėlėms. Galite stebėti savo programėlės konfigūraciją, su ja susietą būseną ir vieną ar du netiesioginius užuominus iš tinklo kamino. Kiekvienas atsako į kitą klausimą, ir dauguma sugedusių patikrinimų kyla iš to, kad vienas jų laikomas visu atsakymu.
Vieno VPN požymio mitas
Manoma, kad kažkur SDK yra savybė, pranešanti, ar įrenginys yra tunelyje, kaip pasiekiamumo požymis praneša, ar priegloba atsako. Tokios viešos savybės nėra. Net jei ji būtų, „tunelis egzistuoja“ ir „mano srautas jį naudoja“ yra skirtingi teiginiai, ir daugumai programėlių svarbus tik antrasis.
Būtent šis atotrūkis yra priežastis, kodėl bibliotekos, reklamuojančios vienos eilutės VPN aptikėją, dažniausiai skaito ką nors trapaus, pavyzdžiui, sąsajos pavadinimą arba tarpinio serverio raktą, ir pateikia tai kaip nuosprendį.
Įkelkite nuostatas prieš pasitikėdami nil
Bendroji valdytojo kopija egzistuoja vos jos paprašote, bet jos protokolo savybė lieka nil, kol nebaigiamas įkėlimo atgalinis iškvietimas. Taigi nil protokolas reiškia „dar neįkelta“ bent jau taip pat dažnai, kaip „neįdiegta“. Skaitykite užbaigimo bloke ir tik tada nuspręskite: egzistuojantis protokolo objektas su įjungtu aktyvavimo požymiu – taip atrodo „įdiegta“.
Antras signalas yra ryšio objekte: negaliojanti būsena, kurią sistema praneša, kai ši programėlė neturi įdiegtos konfigūracijos. Negaliojanti būsena kartu su nil protokolu po užbaigto įkėlimo yra tikras nebuvimas, o ne laiko lenktynės.
Ryšio pokyčiai ateina kaip pranešimai
Apdorotuvai, perduoti load ir save, praneša, kas atsitiko konfigūracijai, o ne ką daro tunelis. Laukimas, kol vienas jų suveiks jungiantis, yra lenktynės, kurios niekada neišsisprendžia. Stebėkite būsenos pasikeitimo pranešimą ir perskaitykite dabartinę ryšio objekto reikšmę, kai jis ateina.
Kai konfigūracija įdiegta, ryšio būsena pereina trumpą seką: atjungta, jungiamasi, prijungta, iš naujo patvirtinama, atjungiama. „Prijungta“ apibūdina tunelį, o ne serverį už jo, todėl tai nėra įrodymas, kad srautas teka. On-demand gali pakelti tunelį ir tada, kai programėlė sustabdyta, ir tada pranešimas ateina anksčiau, nei turite ką atnaujinti.
Ribota tarpinio serverio momentinė kopija yra užuomina, o ne nuosprendis
CFNetwork gali perduoti programėlei dabartines sistemos tarpinio serverio nuostatas, ir to rezultato viduje yra ribotas žodynas, kurio raktas – sąsajos pavadinimas. Pavadinimas, prasidedantis tun, utun, ppp, ipsec arba tap, yra užuomina, kad tunelis yra. Tai vis dar momentinė kopija to, ką ši programėlė gali matyti, o ne teiginys apie tai, kur keliauja paketai.
Tiekėjai nesutaria dėl pavadinimų, todėl trūkstamas priešdėlis nieko neįrodo, o esanti sąsaja gali egzistuoti ir nenešdama srauto. Pasiekiamumas dar silpnesnis: sėkminga užklausa į privatų adresą rodo, kad kelias tai užklausai tuo metu veikė, o ne kad VPN įdiegtas.
Simuliatorius skolinasi „Mac“, o kitos programėlės lieka nematomos
Simuliatorius neturi savo tinklo kamino; kiekvienas jo užmezgamas ryšys yra „Mac“ kompiuterio. Todėl „Mac“ priegloboje veikiantis VPN jau galioja simuliuojamai programėlei, o paties simuliatoriaus nuostatos nieko nerodo. Jei tunelis pakilo po simuliatoriaus paleidimo, jį paleisti iš naujo paprastai greičiau nei derinti programėlę. Priegloba nestandartiniame prievade turi turėti tą prievadą URL adrese arba vietinį peradresavimą, pavyzdžiui, socat TCP-LISTEN:12345,fork TCP:host:12345.
Viešosios API neišvardys VPN profilių, priklausančių kitoms programėlėms ar konfigūracijos profiliams. Vienai žinomai programėlei URL schemos patikra per canOpenURL yra perkeliamas triukas, o nuo iOS 9 užklausiama schema turi būti deklaruota jūsų Info.plist; jei jos neįtrauksite, kvietimas grąžins false. „OpenVPN Connect“ atsako į openvpn://, todėl tai geras pavyzdys ir prastas bendrasis aptikėjas.
Sujunkite tris stebėjimus ir pasakykite, ką jie reiškia
Praktiškai sukraukite tris rezultatus: įkeltą ir įjungtą konfigūraciją, ryšio būseną, kuri nėra negaliojanti, ir užklausą į adresą, pasiekiamą tik per tunelį. Kiekvienas atskirai klaidina; kartu jie pasako, ką programėlė gali žinoti, o ne ką vartotojas daro prielaidą.
Rezultatą rašykite kaip tris eilutes diagnostikoje, o ne kaip vieną loginį dydį. Kai vartotojas sako, kad VPN išjungtas, o jūsų programėlė nesutinka, trys eilutės parodo, kuris stebėjimas nukrypo, ir tai yra skirtumas tarp palaikymo bilieto, dėl kurio galite ką nors daryti, ir tokio, kuris baigiasi „pas mane veikia“.