هل ما زال التطبيق المستثنى متصلًا؟ قواعد التطبيقات والمسارات تختلف
استثناء تطبيق أندرويد من VPN لا يحجبه. قوائم السماح وقواعد UID والمسارات المدفوعة تحدّد كل منها جزءًا مختلفًا من المسار.
استثناء حزمة هو تعليمة توجيه وليس حجبًا، لذا فإن الصفحات التي تُحمَّل بعد اتصال VPN أمر متوقع وليست دليلًا على عطل. فالاستثناء يزيل التطبيق من النفق بدلًا من حجبه، وتحمل الشبكة العادية حركته. سياستان منفصلتان تلتقيان هنا: واحدة تختار العمليات، والأخرى تختار الوجهات. وقراءتهما بهذا الترتيب تفسّر لماذا لا يُعدّ رمز الاتصال المتصل وتطبيق يعمل تناقضًا.
لماذا يبقي الاستثناء الشبكة مفتوحة
يقبل VpnService.Builder إما قائمة سماح أو قائمة منع، ولا يقبل الاثنتين أبدًا. الحزم في قائمة السماح هي الوحيدة التي تُوجَّه عبر النفق. وقائمة المنع تعكس ذلك: كل حزمة عدا المذكورة تستخدم النفق، والمذكورة تحتفظ بالمسار الفيزيائي. والحزمة غير المذكورة في قائمة السماح تكون أيضًا خارج النفق، لذا فالاستثناء هو الحالة الطبيعية لمعظم التطبيقات في ذلك الوضع.
وهذا يجعل إدخال المنع المحلي قرار توجيه لا قاعدة جدار ناري. وإذا كان المطلوب منع تطبيق من الوصول إلى مضيف، فيجب أن يغطيه النفق وأن يرفض الخادم أو سياسة محلية حركته. وإزالة تطبيق من النفق تغيّر فقط الواجهة التي تحمل حزمه.
حالة Play Store هي المثال المتعمد المعتاد. فاستثناء حزمة المتجر يتيح للتنزيلات استخدام الاتصال الأساسي عندما يتعارض مخرج VPN مع النقل، ويُظهر أن الاستثناء يعني التجاوز لا الحجب.
ملف تعريف واحد، قائمة واحدة
يرمي المنشئ استثناءً إذا استُخدم الاستدعاءان معًا، لذا فملف التعريف الذي أمامك إما قائمة سماح أو قائمة منع. وهذه الحقيقة الواحدة تحدّد كيفية قراءة كل ملاحظة لاحقة. افحص الشيفرة أو التهيئة المُدارة قبل جدول التوجيه، لأن القائمة تحدّد معنى بقية المخرجات. وملف التعريف الهجين ليس حالة يمكن أن تنظر إليها.
ويميّز هذا الفرق أيضًا ما سيفعله تطبيق مُثبَّت حديثًا. فتحت قائمة سماح يبقى خارجًا حتى يضيفه أحد، بينما تحت قائمة منع ينضم إلى النفق افتراضيًا.
تعرض التهيئات المُدارة الخيار نفسه تحت أسماء مفاتيح مختلفة، وتصفه بعض لوحات التحكم بوضع VPN لكل تطبيق بدلًا من قائمة. ولا يزال السلوك يعود إلى ذينك الاستدعاءين، لذا تتبّع الإعداد رجوعًا إلى قائمة الحزم بدلًا من الوثوق بالتسمية. وإذا اختلفت التسمية والقائمة، تفوز القائمة.
اتبع قاعدة UID إلى جدول النفق
يمنح أندرويد كل تطبيق معرّف مستخدم Linux خاصًا به، وتثبّت خدمة VPN قواعد سياسة تطابق نطاقات UID. وتُرسَل الحركة المطابقة إلى جدول توجيه يشير مساره الافتراضي إلى جهاز tun. ويُخصَّص رقم الجدول لكل نسخة VPN، لذا يتغيّر بعد إعادة الاتصال أو بعد إنشاء ملف تعريف VPN ثانٍ.
مخرجات القواعد هي الخريطة. كل سطر يسمّي جدول بحث، وذلك الجدول يحمل المسار الافتراضي الذي يحدّد هل تدخل الحزم المطابقة النفق.
adb shell ip rule show
adb shell ip route show table all
adb shell cmd package list packages -U | grep <package>
شغّل الأمر الثالث أولًا للحصول على UID، ثم ابحث عن القاعدة التي يحتوي نطاقها عليه. وتلك القاعدة تشير إلى رقم جدول، و ip route show table <n> بذلك الرقم يظهر ما إذا كان هناك مسار افتراضي عبر جهاز tun. وإذا لم يكن للجدول مسار افتراضي، يكون التطبيق مختارًا لكن بلا مسار، وهو عطل مختلف.
تحتاج هذه الأوامر إلى بنية قابلة للتنقيح أو جهاز يستطيع adb shell قراءة حالة الشبكة فيه. وعلى هاتف إنتاجي يظل مدير الحزم يجيب، لكن فحص التوجيه قد يُرفض، لذا سجّل ما تستطيع واعتبر الباقي غير محقَّق.
المسار يطالب ببادئة لا بتطبيق
يطالب Builder.addRoute ببادئات الوجهة للنفق. وملف تعريف يضيف فقط 10.0.0.0/8 يرسل تلك البادئة عبر النفق ويترك كل وجهة أخرى على المسار الفيزيائي. وهذا هو النفق المنقسم العادي، وهو مستقل عن التطبيقات التي اختارتها القواعد.
تعكس التهيئة المدفوعة من الخادم النموذج نفسه. فدفعات المسارات الفردية تضيف بادئات، بينما تستبدل تعليمة redirect-gateway المسار الافتراضي وتلتقط كل شيء للتطبيقات التي يغطيها النفق. وإزالة تلك التعليمة قد تقلّص نفقًا عاملًا إلى شبكة فرعية واحدة دون أي تغيير على الجهاز.
وقد يفشل أيضًا تثبيت مسار مدفوع ببوابة أو محدِّد متريك غير معتاد. فضّل الصيغة العادية للبادئة ودع الخادم يتولى التمرير و NAT.
اقرأ التقاطع قبل أن تغيّر إعدادًا
يحمل النفق تقاطع العمليات المغطاة والوجهات المطالب بها. فالتطبيق المغطى الذي يطلب عنوانًا خارج البادئات المنشورة يخرج عبر الشبكة الفيزيائية. والحزمة الممنوعة تبقى خارجًا حتى عندما تطلب عنوانًا داخل تلك البادئات. ولا واحدة من الحالتين عطل؛ كلتاهما السياستان تؤديان عملهما.
وقد يترك VPN لكل تطبيق تطبيقًا مرتبطًا به بلا اتصال. فعندما يكون on-demand مغلقًا والنفق معطّلًا، يبقى التطبيق مرتبطًا بـ VPN لكل تطبيق وليس له بديل، ما يبدو كتطبيق معطوب لا كحالة سياسة. وتفعيل on-demand، أو إزالة الارتباط عبر الإدارة، يغيّر ذلك.
| Layer | What it selects | Where to look | Typical mismatch |
|---|---|---|---|
| Package list | Processes | Builder calls or managed configuration | App excluded but expected to be blocked |
| UID policy rule | Which table a UID uses | ip rule show | Tunnel icon on, app still on Wi-Fi |
| Routing table | Destinations for matched traffic | ip route show table <n> | Covered app reaches only one subnet |
| Server push | Prefixes offered to the client | Server route configuration | Tunnel shrinks after a server edit |
شخّص محورًا واحدًا في المرة. أكّد السماح أو المنع أولًا، واقرأ قواعد UID والجداول المثبَّتة ثانيًا، واختبر تطبيقًا ثانيًا على الوجهة نفسها أخيرًا. فالتطبيق الثاني يفصل اختيار العملية عن اختيار الوجهة في طلب واحد.
دوّن النتيجة كتطبيق ووجهة ورقم جدول. ذلك الثلاثي هو ما يجب أن يحافظ عليه التغيير التالي.