آیا iPhone روی VPN است؟ یک اپ iOS واقعاً چه چیزی میتواند ببیند
در SDK آیاواس هیچ پرچم واحد VPN وجود ندارد. یک اپ فقط میتواند پیکربندی خودش، یک اعلان وضعیت و یک عکس لحظهای محدود از پراکسی را ببیند، نه بیشتر.
از یک اپ iOS بپرسید آیا گوشی روی VPN است و پاسخ صادقانه این است که نمیتواند آن را به معنایی که شما میگویید بداند. SDK هیچ پرچمی برای «دستگاه در تونل است» ارائه نمیدهد و رابطهای خصوصی که ممکن است به آن نزدیک شوند برای اپهای منتشرشده بستهاند. میتوانید پیکربندی خود اپ، وضعیت متصل به آن و یکی دو نشانه غیرمستقیم از پشته شبکه را مشاهده کنید. هرکدام به پرسشی متفاوت پاسخ میدهند و بیشتر بررسیهای خراب از این میآید که یکی از آنها را تمام پاسخ بگیریم.
افسانه پرچم واحد VPN
باور این است که جایی در SDK ویژگیای هست که گزارش میدهد دستگاه در تونل است یا نه، همانطور که پرچم دسترسپذیری گزارش میدهد میزبان پاسخ میدهد یا نه. چنین ویژگی عمومی وجود ندارد. حتی اگر بود، «تونلی وجود دارد» و «ترافیک من از آن استفاده میکند» دو ادعای متفاوتاند و برای بیشتر اپها فقط دومی مهم است.
همین شکاف دلیل آن است که کتابخانههایی که آشکارساز یکخطی VPN را تبلیغ میکنند معمولاً چیز شکنندهای مثل نام رابط یا کلید پراکسی را میخوانند و آن را بهعنوان حکم ارائه میدهند.
پیش از اعتماد به nil تنظیمات را بارگذاری کنید
نمونه مشترک مدیر همان لحظه که درخواستش کنید وجود دارد، اما ویژگی پروتکل آن تا کامل شدن callback بارگذاری 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 خاموش است و اپ شما موافق نیست، آن سه خط نشان میدهند کدام مشاهده انحراف داشته، و این تفاوت میان تیکتی است که میتوانید رویش اقدام کنید و یکی که با «برای من کار میکند» تمام میشود.