خودکارسازی L2TP در اندروید: اسکریپت میتواند درخواست کند، نه آن را بسازد
یک مسیر شل، L2TP/IPsec را در اندروید بالا نمیآورد. IPsec، L2TP، PPP و سیاست پلتفرم هرکدام بخشی را در دست دارند، پس انتخاب کنید چه چیزی میتواند آن را کنترل کند.
افسانه این است که L2TP در اندروید چیز دیگری است که یک اسکریپت شل میتواند آغاز کند: یک مسیر اضافه کن، سرویس قدیمی را صدا بزن، تمام. نمیتواند چنین باشد، چون چهار لایه متفاوت باید توافق کنند تا یک تونل بستهای را حمل کند. لایه IPsec مسیر را محافظت میکند، L2TP نشست را حمل میکند، PPP پیوند را مذاکره میکند و اندروید باید نتیجه را بهعنوان یک VPN ثبت کند که بتواند دور آن مسیریابی کند. دو بار دیدهام که این کار با دستورهای کپیشده امتحان شد و هر دو بار مسیر وجود داشت در حالی که هیچ چیز رمزنگاری نشده بود.
تغییر مسیر واقعاً چه کاری انجام میدهد
افزودن یک مسیر تعیین میکند بسته بعدی کجا برود. این کار یک انجمن امنیتی را مذاکره نمیکند، نشست L2TP باز نمیکند و تبادل PPP را که نشانی، همتا و تنظیمات DNS تولید میکند اجرا نمیکند. روی گوشی، نتیجه قابل مشاهده ترافیکی است که از مسیر اشتباه خارج میشود، یا خارج میشود و میمیرد، بدون هیچ وضعیت تونلی در هیچ کجا.
همین برای فراخوانی سرویسی که از نسخه قدیمیتر کپی شده است صادق است. لولهکشی داخلی VPN اندروید یک API خودکارسازی منتشرشده نیست، و یک تراکنش شمارهدار از نسخه دیگر میتواند به عملیات متفاوتی برسد یا امتیازهایی بخواهد که اسکریپت ندارد. خودکارسازیای که رمز عبور حمل میکند هرگز نباید به آرگومانهای داخلی حدسزده وابسته باشد، چون حالت شکست یا یک no-op خاموش است یا پروفایلی نیمهساخته که کسی آن را پاک نمیکند.
چهار مالک، و اسکریپت هیچیک از آنها نیست
به ترتیب بگیرید. IPsec مسیر محافظتشده را برقرار و نگهداری میکند و همتاها را احراز هویت میکند. L2TP نشست را روی آن حمل میکند، و همین لایهبندی دلیل آن است که استاندارد آنها را مکانیزمهای جداگانه میداند نه یک پروتکل. درون آن، PPP پارامترهای پیوندی را مذاکره میکند که کلاینت استفاده خواهد کرد. سپس اندروید سمت پلتفرم را در اختیار دارد: رابط VPN ثبتشده، دامنه بهازای هر برنامه، وضعیت always-on و چرخه حیاتی که تعیین میکند وقتی برنامه کشته میشود چه اتفاقی میافتد.
یک اسکریپت فقط آخرین لایه را میبیند، و معمولاً بهطور غیرمستقیم. میتواند از یک کلاینت بخواهد متصل شود اگر آن کلاینت کنترل مستند ارائه دهد، و میتواند بعداً وضعیت رابط را تماشا کند. نمیتواند جای سه لایه پایینتر را بگیرد و نمیتواند کاری کند که پلتفرم یک رابط ثبتنشده را بهعنوان VPN بپذیرد.
چرا یک دیمن هم میانبر نیست
راهاندازی یک دیمن لینوکس با امتیاز روی دستگاه شبیه قطعه گمشده به نظر میرسد، و اغلب واقعاً تونلی بالا میآورد. کاری که نمیکند ثبت آن تونل با اندروید است. رابط درون هسته وجود دارد، ولی انتخاب VPN پلتفرم، مسیریابی بهازای هر برنامه، سیاست always-on و چرخه حیات از آن خبر ندارند، و تغییرات مسیر و DNS خود دیمن بر سر همان جدولها با مدیر شبکه رقابت میکنند.
نتیجه اتصالی است که برای ترافیک دیمن کار میکند و بهطرز مرموزی برای برنامهای که برایتان مهم بود کار نمیکند، یا اتصالی که تا زمانی که سیستم شبکههایش را دوباره ارزیابی کند دوام میآورد. هیچکدام باگ پلتفرم نیست؛ این مرز میان مالکیت یک سوکت و مالکیت تسهیلات VPN است.
مسیرهای پشتیبانیشده چه شکلی هستند
اگر سازمان بتواند به پروفایلی برود که خود اندروید فراهم میکند، مسیر پلتفرم صادقانهترین است. از API 30 به بعد، VpnManager فراهمسازی و کنترل پروفایلهای VPN پلتفرم را برای برنامهها پشتیبانی میکند، با یک جریان مجوز که به برنامه فراخواننده متصل است. این یک مبدل L2TP نیست: مدل پروفایلی که برای IKEv2 فراهم میکند پیکربندی موجود L2TP را ترجمه نمیکند، و تغییر پروتکل یک مهاجرت است نه تغییر نام. هویتها، مسیرها، DNS خصوصی و مجوزهای دسترسی باید آگاهانه منتقل شوند.
اگر سرویس باید L2TP/IPsec بماند، ترکیب پشتیبانیشده یک کلاینت و نسخهای از سیستمعامل است که اپراتور واقعاً مستند کرده، و قرارداد خودکارسازی آن اگر وجود دارد. وقتی کنترل بدوننظارت مستندی وجود ندارد، پاسخ درست یک اتصال دستی پشتیبانیشده است، نه یک اسکریپت ممتاز شکننده که تصادفاً روی یک بیلد کار میکند.
یک خودکارسازی درست چه میکند
با داشتن یک کنترل مستند، خودکارسازی کاری کوچک و قابل دفاع دارد: اتصال نامدار را درخواست کن، منتظر آمادهبودن بمان، در خطای احراز هویت یا پیکربندی متوقف شو، بار کاری موردنظر را اجرا کن و پاکسازی را به مؤلفهای بسپار که مالک اتصال است. اعتبارنامهها نزد کلاینتی میمانند که میداند چگونه آنها را ذخیره و چرخش دهد.
قبل از نوشتن اولین خط، بنویسید که هر لایه متعلق به کدام مؤلفه است و نتیجه را با آن بسنجید:
- IPsec و PPP توسط کلاینت مدیریت میشوند، نه مسیرهای اسکریپت.
- اتصال در وضعیت VPN پلتفرم ظاهر میشود، بنابراین دامنه بهازای هر برنامه و always-on بر آن اعمال میشود.
- هیچ فراخوانی سرویس داخلی، شماره تراکنش یا آرگومان حدسزده اعتبارنامهای حمل نمیکند.
- شکست در هر مرحله هیچ پروفایل نیمهثبتشدهای باقی نمیگذارد.