APIهای VPN در iOS: NEVPNManager، ارائهدهنده تونل یا پروفایل؟
API را بر اساس انتقالی که باید با آن صحبت کنید انتخاب کنید، سپس ثابت کنید که تونل ترافیک را حمل میکند: ترتیب ذخیره، بارگذاری و شروع، اختیارات ارائهدهنده و قواعد درخواستی.
سه محصول مختلف به نام VPN در iOS پاسخ میدهند و یک API مشترک ندارند. VPN شخصی روی انتقالهای داخلی IPsec و IKEv2 سیستم سوار میشود. تونل سفارشی، پروتکل خودتان را درون یک افزونه شبکه اجرا میکند. و پروفایل پیکربندی هر یک از این دو را پیکربندی میکند و میتواند رفتار درخواستی را اضافه کند. انتخاب بر اساس انتقالی که باید با آن صحبت کنید سریعتر از انتخاب بر اساس هر آموزشی است که اول کامپایل شد.
بررسیهای زیر را به ترتیب اجرا کنید، زیرا هر گام فرض میکند گام قبلی یک پیکربندی معتبر ساخته است.
گام 1: بر اساس انتقال انتخاب کنید
اگر سرور IKEv2 یا IPsec به سبک سیسکو است، NEVPNManager کافی است و انتقالهای سیستم رایگان ارائه میشوند. اگر سرور OpenVPN، WireGuard یا هر چیز دیگری صحبت میکند، NEVPNManager نمیتواند کمک کند: هیچ قلابی برای پروتکل شخص ثالث ندارد. آن حالت به NETunnelProviderManager با ارائهدهنده تونل بسته نیاز دارد که پروتکل را پیادهسازی کند. پروفایل فقط پیکربندی را توزیع میکند و نمیتواند انتقالی را که سیستمعامل ندارد اضافه کند.
PPTP در سیستمهای کنونی هدف نیست. IPsec با رمز مشترک هنوز نام گروه را در remoteIdentifier، یک آیتم جاکلیدی که رمز را نگه میدارد و احراز هویت گسترده را هنگامی که سرور نام کاربری میخواهد انتظار دارد. هر قطعه گمشده بهصورت همان خطای عمومی پیکربندی ظاهر میشود، پس همه را پیش از عیبیابی هر چیز دیگر اضافه کنید.
گام 2: ترتیب ذخیره، بارگذاری، شروع را رعایت کنید
NEVPNManager در ترجیحات مینویسد، آنها را بازمیخواند و تنها پس از آن شروع میکند. اشیای پروتکل و مدیر را پر کنید، saveToPreferences را صدا بزنید، loadFromPreferences را صدا بزنید و startVPNTunnel را از گرداننده تکمیل بارگذاری صدا بزنید. شروع پیش از بازگشت بارگذاری، خطای پیکربندی نامعتبر، کد 1 در NEVPNErrorDomain، را روی پیکربندیای که در غیر این صورت درست است تولید میکند.
شکل آن بهقدری کوتاه است که در یک جا بماند:
manager.protocolConfiguration = proto
manager.isEnabled = true
manager.saveToPreferences { }
manager.loadFromPreferences { manager.connection.startVPNTunnel() }
startVPNTunnel وقتی درخواست پذیرفته شود برمیگردد، نه وقتی تونل بالا باشد. NEVPNStatusDidChange را ببینید و برای وضعیت واقعی connection.status را بخوانید. برنامهای که در محل فراخوانی موفقیت را فرض میکند در حالی که افزونه هنوز گفتوگو میکند، VPN متصل را گزارش میدهد. وضعیت در حال اتصال برای لحظهای عادی است؛ وضعیتی که هرگز از آن بیرون نمیآید همان خرابیای است که ارزش ثبت دارد.
گام 3: به فرایند ارائهدهنده آنچه لازم دارد بدهید
انتقال سفارشی در فرایندی جداگانه با شناسه بسته و اختیار خودش اجرا میشود. هم برنامه نگهدارنده و هم ارائهدهنده در زمان امضا به اختیار افزونه شبکه نیاز دارند، و ساخت Developer ID بیرون از App Store هم باید آن را در پروفایل تأمین حمل کند. اختیار گمشده شبیه اشکال پروتکل به نظر میرسد، زیرا افزونه بهسادگی شروع نمیشود.
هیچ توصیفگر سوکت عمومی برای قرض گرفتن وجود ندارد. NEPacketTunnelProvider شیء NEPacketTunnelFlow را با read، write و cancel به شما میدهد، و کدی که به مسیرهای کلید خصوصی دست میزند بین نسخهها میشکند. ارائهدهنده در حالی که برنامه در پسزمینه است به کار ادامه میدهد، پس نگهدارنده برای این کار به حالت پسزمینه نیاز ندارد.
گام 4: درخواستی بودن مجموعهای از قواعد است، نه یک کلید
isOnDemandEnabled فقط قواعد را مسلح میکند؛ NEOnDemandRuleConnect و همتایانش تصمیم میگیرند تونل کِی بالا بیاید. قاعده ارزیابی اتصال با یک URL آزمون تنها بهاندازه همان URL ارزش دارد. اگر آزمون بدون تونل پاسخ دهد، قاعده نتیجه میگیرد که شبکه خصوصی از قبل در دسترس است و هرگز وصل نمیشود، پس آن را به چیزی نشانه بگیرید که فقط از داخل پاسخ میدهد.
همیشهروشن بودن وعدهای جداگانه است. به دستگاهی تحت نظارت و پروفایلی مدیریتشده نیاز دارد، و کاربر بدون نظارت میتواند هر وقت بخواهد پروفایل را بردارد. طرحی را که به همیشهروشن بودن وابسته است تحویل ندهید مگر آنکه ناوگان تحت نظارت باشد.
گام 5: مسیر را ثابت کنید، نه برچسب را
جستوجو برای رابطهای tun، tap، ppp یا ipsec ثابت میکند VPN پیکربندی شده است، نه اینکه درخواست شما از آن استفاده کرده باشد. NWPathMonitor با usesInterfaceType(.other) میگوید رابط مجازی در دسترس است، و گرداننده بقاپذیری میتواند یک میزبان را بیازماید. هیچیک از این دو مسیر خروج را ثابت نمیکند، پس آنها را با درخواستی به منبعی که فقط تونل میتواند به آن برسد ترکیب کنید. نامهای رابط کمکی تشخیصی هستند، هرگز دریچهای که منطق برنامه باید بر آن شاخه بزند.
برای بررسی میدانی، نشانی عمومی را با تونل و بدون آن مقایسه کنید و صفحهای را که فقط داخلی است بیاورید. فراخوانی وضعیت ممکن است در حالی که ارائهدهنده گفتوگو میکند متصل گزارش دهد، پس بگذارید نتیجه منبع تصمیم بگیرد و وضعیت را شاهد پشتیبان بدانید.