چرا یک برنامه نمیتواند پروفایل VPN ذخیرهشده را در Android یا iOS روشن کند
ساختن تونل خودتان و روشن کردن یک پروفایل ذخیرهشده دو کار متفاوت است. مقایسه کنید که Android، iOS و رایانه رومیزی واقعاً به برنامه چه اجازه میدهند.
دو کار بسیار متفاوت زیر نام VPN برنامهنویسی قرار میگیرند، و تنها یکی از آنها برای یک برنامه معمولی روی هر یک از دو پلتفرم موبایل در دسترس است. اولی روشن کردن پروفایلی است که کاربر از قبل ذخیره کرده است؛ دومی ساختن تونل درون فرایند خودتان است. Android دومی را از طریق VpnService به شما میدهد و iOS دومی را از طریق مجوز Network Extension میدهد، در حالی که اولی نزد سیستم، مالک دستگاه یا سرور MDM میماند. مشخص کردن اینکه واقعاً به کدام نیاز دارید معمولاً پروژه را کوچکتر میکند.
دو کار با یک نام
فعال کردن یک پروفایل ذخیرهشده یعنی گفتن به یک تونل موجود که بالا بیاید: یک میزبان، یک اعتبارنامه، یک پروتکل، همه از قبل در جایی که کاربر میبیند پیکربندی شدهاند. ساختن تونل یعنی کد شما مالک رابط، حلقه بستهها و پروتکل است. در فهرست کارهای محصول شبیه هم به نظر میرسند و تقریباً هیچ پیادهسازی مشترکی ندارند.
هیچیک از دو پلتفرم موبایل اولی را به یک برنامه SDK ارائه نمیدهد. اتصالی که بدون هیچ کاری از سوی کاربر ظاهر شود از بدافزار قابل تشخیص نیست، بنابراین هر دو سیستم یک دروازه رضایت جلوی هر برنامهای که ترافیک حمل میکند میگذارند.
Android: یک دروازه رضایت، و هیچ API پروفایل
VpnService از Android 4.0 وجود دارد و به برنامه اجازه میدهد رابط tun بسازد و سپس بستهها را بخواند و بنویسد. سرویس باید با BIND_VPN_SERVICE اعلام شود، و VpnService.prepare() همان دیالوگ سیستمی را تولید میکند که از کاربر اجازه میخواهد. نمونه پلتفرم، ToyVpn، روشنترین بیان شکل مورد نظر است: کد شما مالک رابط و هر چیزی است که از آن میگذرد.
کاری که نمیکند افزودن یک ورودی به صفحه تنظیمات VPN سیستم است. هیچ API عمومی برای آن وجود ندارد، و برنامه تنظیمات پروفایلهای خود را در انباری نگه میدارد که یک برنامه معمولی به آن نمیرسد. فراخوانی کلاسهای پنهان از یک برنامه عادی پروفایلهایی تولید میکند که سیستم هرگز فهرست نمیکند، به همین دلیل کدی که در یک نسخه کار میکرد در نسخه بعد بیصدا از کار میافتد.
مسیر مدیریتشده جداست. مالک دستگاه یا مالک پروفایل میتواند یک بسته VPN همیشهروشن را از طریق APIهای سیاست دستگاه تعیین کند، و یک ابزار سازمانی میتواند پروفایلی بفرستد که کاربر سپس تأیید میکند. این اختیار مدیریت دستگاه است، نه مجوزی که برنامه هنگام نصب درخواست میکند. اگر مشتری شما سازمان است، این مسیری است که باید برایش برنامهریزی کنید؛ اگر مشتری شما شخصی است که از فروشگاه نصب میکند، اصلاً در دسترس نیست.
iOS: مجوز همان مرز است
iOS همان کار را متفاوت تقسیم میکند. یک کلاینت VPN ارائهدهنده تونل بسته یا پروکسی برنامه را در چارچوب Network Extension پیادهسازی میکند، و مجوز متناظر باید به حساب توسعهدهنده داده شود. یک پیکربندی VPN شخصی از طریق NEVPNManager برای حالت سادهتر وجود دارد، و همچنان در همان مدل مجوز اجرا میشود. Apple کل سطح را در مرجع Network Extension مستند میکند، که ارزش خواندن پیش از تعیین دامنه کار را دارد.
هیچ راه پشتیبانیشدهای برای باز کردن صفحه تنظیمات VPN، خواندن پیکربندیهای ذخیرهشده کاربر یا شروع یکی از آنها وجود ندارد. کاری که یک کلاینت میتواند بکند فرستادن یک پروفایل پیکربندی برای نصب توسط کاربر و سپس استفاده از تونل حاصل از طریق فراخوانیهای شبکه معمولی است. تونلزنی برای هر برنامه توسط سرور MDM از طریق قاعده درخواستی تعیین میشود، نه توسط برنامه در زمان اجرا.
کلاینت VPN یک فروشنده بزرگ مدرکی نیست بر اینکه حساب شما میتواند همان چیز را بفرستد. آن مجوزها برای هر حساب توسعهدهنده درخواست و بررسی میشوند، پس ریسک زمانبندی نزد Apple است، نه در طرح اسپرینت شما.
رایانه رومیزی دورتر میرود، اما مالکیت تغییر نمیکند
Windows حالت مجاز است. Add-VpnConnection یک ورودی دفترچه تلفن از یک جلسه PowerShell ارتقایافته میسازد، و rasdial آن را از یک اسکریپت وصل یا قطع میکند. یک برنامه همچنین میتواند یک کلاینت فروشنده را از طریق خط فرمان مستندش هدایت کند. ساختن پروفایل همچنان یک اقدام اداری است، چون ورودی در انباری در سطح ماشین زندگی میکند.
macOS با ابزارهای متفاوت همینطور رفتار میکند. scutil --nc start و stop روی سرویسهایی کار میکنند که از قبل وجود دارند، در حالی که ساختن یکی وظیفه مدیریت سیستم است. مالک بودن فرایند روی یک لپتاپ شما را مالک پیکربندی نمیکند.
در عوض چه بسازید
اگر نیاز واقعی این است که برنامه شما به یک API داخلی برسد، تونلی که کاربر از قبل اجرا میکند کافی است. درخواستهای HTTPS معمولی بفرستید، بگذارید سیستم مسیر را انتخاب کند، و دست از تلاش برای کنترل تونل بردارید. اگر نیاز این است که فقط ترافیک برنامه شما از تونل استفاده کند، از کانال مدیریت VPN برای هر برنامه بخواهید، یا TLS را درون برنامه در برابر سرویسی که بدون آن در دسترس است پایان دهید.
APIهای پنهان میانبری نیستند که ارزشش را داشته باشد. آنها میان نسخهها تغییر میکنند، در بررسی برنامه شکست میخورند، و خرابیهایی که تولید میکنند برای کسی که کد را به ارث میبرد شبیه خرابیهای معمولی شبکه است. مقایسه Android در برابر iOS نیست؛ مالک بودن یک تونل در برابر درخواست از پلتفرم برای مسیریابی ترافیک است، و تنها اولی مال شماست برای ساختن.