Apakah iPhone sedang di VPN? Apa yang benar-benar bisa dilihat aplikasi iOS
Tidak ada satu pun flag VPN di SDK iOS. Aplikasi hanya bisa mengamati konfigurasinya sendiri, notifikasi status, dan cuplikan proxy yang terbatas, tidak lebih.
Tanyakan kepada aplikasi iOS apakah ponsel sedang di VPN, dan jawaban jujurnya adalah aplikasi itu tidak bisa mengetahuinya dalam arti yang Anda maksud. SDK tidak menyediakan flag «perangkat ada di dalam terowongan», dan antarmuka privat yang mungkin mendekatinya tertutup bagi aplikasi yang dirilis. Anda bisa mengamati konfigurasi aplikasi Anda sendiri, status yang melekat padanya, dan satu atau dua petunjuk tidak langsung dari tumpukan jaringan. Masing-masing menjawab pertanyaan yang berbeda, dan sebagian besar pemeriksaan yang rusak berasal dari menganggap salah satunya sebagai jawaban utuh.
Mitos satu flag VPN
Keyakinannya adalah bahwa di suatu tempat dalam SDK ada properti yang melaporkan apakah perangkat berada di dalam terowongan, seperti flag keterjangkauan melaporkan apakah sebuah host menjawab. Properti publik semacam itu tidak ada. Bahkan jika ada, «ada terowongan» dan «lalu lintas saya memakainya» adalah klaim yang berbeda, dan hanya yang kedua yang penting bagi sebagian besar aplikasi.
Celah itulah sebabnya pustaka yang mengiklankan pendeteksi VPN satu baris biasanya membaca sesuatu yang rapuh, seperti nama antarmuka atau kunci proxy, dan menyajikannya sebagai putusan.
Muat preferensi sebelum memercayai nil
Instans manajer bersama ada begitu Anda memintanya, tetapi properti protokolnya tetap nil sampai callback pemuatan selesai. Jadi protokol nil berarti «belum dimuat» paling tidak sesering artinya «tidak terpasang». Lakukan pembacaan di dalam blok penyelesaian, dan baru setelah itu putuskan: objek protokol yang ada, dengan flag pengaktifan menyala, itulah bentuk «terpasang».
Sinyal kedua ada pada objek koneksi: status tidak valid, yang dilaporkan sistem ketika aplikasi ini tidak memiliki konfigurasi terpasang. Status tidak valid bersama protokol nil setelah pemuatan selesai adalah ketiadaan yang sebenarnya, bukan balapan waktu.
Perubahan koneksi datang sebagai notifikasi
Handler yang diberikan ke load dan save melaporkan apa yang terjadi pada konfigurasi, bukan apa yang dilakukan terowongan. Menunggu salah satunya terpicu saat menyambung adalah balapan yang tidak pernah selesai. Awasi notifikasi perubahan status sebagai gantinya, dan baca nilai objek koneksi saat ini ketika notifikasi itu tiba.
Setelah konfigurasi terpasang, status koneksi melewati urutan singkat: terputus, menyambung, tersambung, menegaskan ulang, memutus. «Tersambung» menggambarkan terowongan dan bukan server di belakangnya, jadi itu bukan bukti lalu lintas mengalir. On-demand juga bisa menaikkan terowongan saat aplikasi ditangguhkan, dan notifikasinya tiba sebelum Anda punya sesuatu untuk diperbarui.
Cuplikan proxy terbatas adalah petunjuk, bukan putusan
CFNetwork dapat memberi aplikasi pengaturan proxy sistem saat ini, dan di dalam hasil itu ada kamus terbatas dengan kunci berdasarkan nama antarmuka. Melihat nama yang diawali tun, utun, ppp, ipsec, atau tap adalah petunjuk bahwa ada terowongan. Itu tetap cuplikan dari apa yang bisa dilihat aplikasi ini, bukan pernyataan tentang ke mana paket pergi.
Penyedia tidak sepakat soal penamaan, jadi awalan yang tidak ada tidak membuktikan apa pun, dan antarmuka yang ada bisa eksis tanpa membawa lalu lintas. Keterjangkauan bahkan lebih lemah: permintaan yang berhasil ke alamat privat menunjukkan jalur itu bekerja untuk permintaan tersebut pada saat itu, bukan bahwa VPN terpasang.
Simulator meminjam Mac, dan aplikasi lain tetap tak terlihat
Simulator tidak punya tumpukan jaringan sendiri; setiap koneksi yang dibuatnya adalah milik Mac. Jadi VPN yang berjalan di Mac host sudah berlaku bagi aplikasi yang disimulasikan, dan pengaturan simulator itu sendiri tidak menunjukkan apa pun. Jika terowongan naik setelah simulator dimulai, memulainya ulang biasanya lebih cepat daripada men-debug aplikasi. Host pada port nonstandar memerlukan port itu di URL, atau penerusan lokal seperti socat TCP-LISTEN:12345,fork TCP:host:12345.
API publik tidak akan menghitung profil VPN milik aplikasi lain atau profil konfigurasi. Untuk satu aplikasi yang dikenal, uji skema URL melalui canOpenURL adalah trik portabelnya, dan sejak iOS 9 skema yang ditanyakan harus dideklarasikan di Info.plist Anda; jika tidak, panggilan mengembalikan false. OpenVPN Connect merespons openvpn://, yang menjadikannya contoh bagus dan pendeteksi umum yang buruk.
Gabungkan tiga pengamatan dan katakan apa artinya
Tumpuk tiga hasil dalam praktik: konfigurasi yang dimuat dan diaktifkan, status koneksi yang bukan tidak valid, dan permintaan ke alamat yang hanya bisa dijangkau lewat terowongan. Masing-masing menyesatkan bila sendiri; bersama-sama mereka menyatakan apa yang bisa diketahui aplikasi, bukan apa yang diasumsikan pengguna.
Tulis hasilnya sebagai tiga baris dalam diagnostik Anda, bukan satu boolean. Ketika pengguna melaporkan VPN mati sementara aplikasi Anda tidak setuju, tiga baris itu menunjukkan pengamatan mana yang menyimpang, dan itulah bedanya antara tiket dukungan yang bisa Anda tindak lanjuti dan yang berakhir dengan «di saya jalan».