VPN برنامهمحور در اندروید: کنار گذاشتن یک برنامه به معنی مسدود کردن آن نیست
فهرست برنامهمحور روی صفحه به یک مالک تونل تعلق دارد، و کنار گذاشتن یک برنامه آن را دور آن تونل میفرستد نه بیرون از شبکه. از همانجا شروع کنید.
دو نفر یک پرسش را میپرسند و پاسخهای ناسازگار میگیرند، چون در جایهای متفاوتی ایستادهاند. یکی صفحه تنظیمات VPN سیستم را باز کرده و فهرستی از برنامهها را ویرایش میکند. دیگری VpnService.Builder.addDisallowedApplication() را در یک ویرایشگر مینویسد. هر دو آن را فیلتر VPN برنامهمحور مینامند. تنها یکی از آنها مالک کنترلی است که توصیف میکند، و هیچکدام چیزی را مسدود نمیکنند.
از صفحهای شروع کنید که کاربر میبیند
تنظیمات را باز کنید، ورودی VPN را پیدا کنید و به اتصالی نگاه کنید که واقعاً فعال است. اگر کلاینت فهرست برنامهمحور ارائه میدهد، آن فهرست به تونل خود کلاینت تعلق دارد. پلتفرم API عمومی منتشر نمیکند که برنامهای نامرتبط بتواند از طریق آن انتخاب برنامههای VPN دیگری را بخواند یا ویرایش کند، پس برنامه دوم نمیتواند آن فهرست را برای کاربر درست کند.
این نخستین دوراهی مسیر است. اگر VPN نصبشده چنین تنظیمی ندارد، چیزی برای دور زدن با کد وجود ندارد: این ویژگی در محصولی که مالک تونل است غایب است. اگر دارد، اصلاح درست در همان صفحه است، توسط کسی که میتواند آن را باز کند.
بسته را به درون تونل دنبال کنید
وقتی برنامه خودتان تونلی میسازد، یک رابط TUN ایجاد میکند و اعلام میکند ترافیک کدام برنامهها به آن وارد میشود. فراخوانهای عضویت پیش از برپا شدن رابط انجام میشوند، و پس از آن مجموعه قواعد برای آن نشست ثابت است:
val builder = VpnService.Builder()
builder.addAddress("10.8.0.2", 32)
builder.addRoute("0.0.0.0", 0)
builder.addDisallowedApplication("com.example.bypass")
val tun = builder.establish() // membership decided hereآن فراخوانها فقط به تونلی اعمال میشوند که برنامه شما همین حالا ساخته است و به هیچ چیز دیگری. آنها خطمشی سراسری دستگاه نیستند، برای کلاینتهای دیگر پایدار نمیمانند، و نمیتوانند به VPN کس دیگری دست یابند. وقتی فراخوان سازنده به دلیل قابل حل نبودن بسته استثنا میدهد، رابط هرگز برپا نمیشود، که شکستی پاک است نه خاموش.
چرا کنار گذاشتن شبیه مسدودسازی به نظر میرسید
برنامه کنار گذاشتهشده دور تونل شما به شبکه زیرین هدایت میشود. این ضد مسدود کردن آن است: ترافیک هنوز دستگاه را ترک میکند، فقط بیرون از رابطی که شما کنترل میکنید. برنامهای به سبک دیوار آتش برعکس عمل میکند. ترافیک برنامه را به تونل خود میپذیرد و سپس بستهها را دور میریزد یا از ارسال آنها خودداری میکند، بنابراین رابط همان است و جهت خطمشی وارونه شده است.
کار پشت این وارونگی یک پرچم پیکربندی نیست. شما بستههای IP را از توصیفگر تونل میخوانید، بهازای هر جریان تصمیم میگیرید، و آنها را از یک سوکت محافظتشده ارسال میکنید یا دور میریزید. هر چیزی که مدیریت نکنید بهسادگی متوقف میشود، و به همین دلیل تونل نیمهتمام شبیه شبکهای خراب است نه فیلتری کارا. اگر هدفتان مسدودسازی است، برای پردازش بسته، سرویس پیشزمینه و خطمشی نوشتهشده برای ترافیکی که نمیتوانید دستهبندی کنید بودجه بگذارید.
وقتی خودتان آن را میسازید چه چیزی میشکند
اندروید عموماً همزمان فقط یک VPN فعال را اجازه میدهد، پس تونل فیلترکننده شما و یک تونل حریم خصوصی بر سر یک جایگاه رقابت میکنند مگر اینکه محصولات زنجیرهسازی را پشتیبانی کنند. VPN همیشهفعال با مسدودسازی اتصالها حالت شکست را به شکلی تغییر میدهد که اینجا مهم است: ترافیکی که نمیتواند وارد تونل شود دور ریخته میشود بهجای اینکه مستقیم فرستاده شود، و این همان چیزی است که طراحی جلوگیری از نشت میخواهد و نشست اشکالزدایی بهندرت انتظارش را دارد.
قابلیت مشاهده بستهها تله دوم است. حل نام بسته یک برنامه میتواند با NameNotFoundException شکست بخورد، و در نسخههای جدیدتر اندروید مجموعه بستههایی که میبینید به پرسوجوهایی بستگی دارد که اعلام کردهاید. استثنا را مدیریت کنید بهجای فرض اینکه هر نامی حل میشود، و فهرست را هنگام نصب یا حذف برنامهها دوباره بخوانید نه اینکه همیشه در حافظه نهان نگه دارید.
دستگاههای مدیریتشده مالک سوم را اضافه میکنند. یک خطمشی تحرک سازمانی میتواند VPN برنامهمحور یا نمایه همیشهفعال را تعیین کند، و یک برنامه معمولی نمیتواند آن را نادیده بگیرد. پیش از اشکالزدایی کد خودتان بررسی کنید که آیا دستگاه مدیریت میشود، چون در آن حالت ممکن است فهرستی که میخواهید تغییر دهید برای هیچکس که گوشی را در دست دارد قابل ویرایش نباشد.
آن را با برنامهای که خودتان کنترل میکنید آزمایش کنید
با برنامهای که میخواهید فیلتر کنید آزمایش نکنید. از برنامه دوم که رفتار شبکهاش را میتوانید مشاهده کنید استفاده کنید، و بررسی کنید که آیا ترافیکش از تونل شما بیرون میرود در حالی که ترافیک هدف بیرون نمیرود. اگر هر دو داخل بمانند، خطمشی کار میکند و هدف کنار گذاشته شده است؛ اگر هیچکدام بیرون نرود، خود تونل اشتباه است و فهرست برنامهها مشکل نیست.
سپس تصمیم بگیرید کدام یک از سه چیز را واقعاً میسازید. تونل برنامهمحور همان API سازنده است، با فهرست بهعنوان بخشی از نمایه شما. دیوار آتش دستگاه پردازش بسته بههمراه چرخه عمری است که میتوانید از آن دفاع کنید. تغییر VPN کس دیگری اصلاً مسیر پشتیبانیشدهای نیست، و پاسخ صادقانه در آنجا این است که آن تنظیم به همان محصول تعلق دارد.