الربط العكسي لأندرويد عبر USB: الأوامر والفحوص والتراجع
الربط العكسي يمرّر حركة الهاتف عبر مُرحّل على الحاسوب المضيف. ابنِ المسار من الهاتف إلى المضيف، وأبقِ VPN المضيف في الحلقة، وتحقق من كل قفزة.
ينقل الربط العكسي حركة الهاتف إلى حاسوب ثم يخرج بها عبر اتصال ذلك الحاسوب. كابل USB وحده لا يفعل ذلك: يحتاج الهاتف إلى خدمة التقاط تتولى توجيهه، ويحتاج الحاسوب إلى مُرحّل يحمل تلك الحزم إلى الأمام. للمسار أربع قفزات: التطبيق، والتقاط الهاتف، ومرحّل USB، ومخرج المضيف، ولكل قفزة مالك مختلف. يبني هذا الدليل ذلك المسار، ويضع VPN المضيف في موضعه، ويفحص كل قفزة قبل أن تثق بالنتيجة.
ارسم القفزات قبل أن تشغّل أي شيء
كل قفزة تطبّق سياستها، ولهذا لا تقول نتيجة ناجحة عند طرف واحد شيئًا عن الطرف الآخر. يختار التطبيق وجهة ومُحلّلًا، وتقرر خدمة الالتقاط أي حركة تدخل المُرحّل، ويمرّر المُرحّل إلى مقابس المضيف، ويحدد توجيه المضيف وVPN الخاص به العنوان الذي تراه الوجهة في النهاية.
| Hop | Owner | What it decides |
|---|---|---|
| Application request | The app | Destination, resolver, address family |
| Capture service | Phone VpnService app | Which traffic enters the relay at all |
| ADB relay | Host process | Forwarding phone flows to host sockets |
| Host egress | Host routing and VPN | Exit address and host policy |
لا يمكن لأكثر من عميل واحد لخدمة VPN أن يشغل دور الالتقاط في الهاتف في الوقت نفسه، لذلك لا يتراكم تطبيق VPN عادي ثانٍ فوق المُرحّل. إذا كان VPN مكانه على الحاسوب، فخدمة الالتقاط هي وصلة الوصول نحو ذلك الحاسوب، وليست دليلًا على أن نفقًا بعيدًا يحمي النتيجة بالفعل.
جهّز المُرحّل قبل أن تمسّ الهاتف
Gnirehtet هو المثال الموثّق لهذه البنية: عميل خدمة VPN بلا صلاحيات جذر على الهاتف، مع مُرحّل يُحمل عبر ADB على المضيف، ويدعم TCP وUDP فوق IPv4. يذكر مستودعه أيضًا أن المشروع لم يعد يُصان بنشاط، لذا تعامل معه كتصميم مرجعي وأداة عاملة لمختبر، لا كمنتج مدعوم يمكن توحيده على أسطول مُدار.
adb devices
adb shell getprop ro.build.version.release
gnirehtet run
شغّل adb devices أولًا. الهاتف الذي لم يقبل مفتاح تصحيح الأخطاء الخاص بالمضيف يُبلّغ عنه كغير مُصرّح به، ولن يتصل المُرحّل حتى يُقبل الطلب على الجهاز. يثبّت gnirehtet run العميل ويشغّل المُرحّل ويُنشّط الالتقاط؛ وفي إصدار يفصل الخطوات، استخدم الأوامر الفرعية الموثّقة install وrelay وstart بدلًا من ذلك.
الوصول عبر ADB علاقة تحكّم بالجهاز، وليس إعداد شبكة. لا تصرّح إلا لحاسوب تتحكم به، وخطط لإلغاء هذا التصريح عند انتهاء المهمة.
أعد VPN المضيف إلى المسار
المُرحّل عملية عادية على المضيف، لذا تتبع اتصالاته اللاحقة جدول توجيه المضيف. ملف تعريف النفق الكامل يحملها؛ أما النفق المنقسم فقد لا يفعل. إذا كان VPN المضيف يستخدم عناصر تحكّم لكل تطبيق، فأضف ثنائي المُرحّل إلى المجموعة المسموحة، وإلا فسيظل المُرحّل يستخدم الواجهة الفيزيائية بينما يبدو المتصفح محميًا.
ip route get 1.1.1.1
curl -4 https://ifconfig.me
sudo ss -tnp | grep -i relay
شغّل الأمرين الأولين قبل توصيل VPN المضيف وبعده. إذا لم يتغير العنوان، فالمُرحّل ليس على النفق، مهما قال نافذة العميل. النفق الخاص فقط يترك أيضًا الوجهات العامة على مخرج المضيف العادي، وهو ما يبدو كتسريب لكنه السياسة التي ضبطتها.
يُحلّ DNS على المضيف للحركة الممرّرة، لذا يحدد مُحلّل المضيف أي خادم يرى الأسماء. إعداد DNS خاص على الهاتف لا ينتقل عبر المُرحّل، واختبار المُحلّل على الهاتف لن يصف عمليات البحث على المضيف.
تحقّق من كل قفزة على حدة
ثلاثة فحوص، بهذا الترتيب: يصل الهاتف إلى المُرحّل، ويصل المُرحّل إلى الوجهة وفق سياسة المضيف، ويحلّ التطبيق الوجهة ويستخدمها بشكل صحيح. توقّف عند أول فشل بدلًا من إعادة تحميل الصفحات والتخمين.
adb shell dumpsys connectivity | grep -i -A3 vpn
adb logcat -s GnirehtetRelay:V Gnirehtet:V
مدخل شبكة VPN في تفريغ الاتصال يُظهر أن خدمة الالتقاط نشطة؛ وسجل المُرحّل نفسه يُظهر ما إذا كانت التدفقات تصل. غياب أحدها يقسم المشكلة بوضوح: لا التقاط يعني جهة الهاتف، ولا تدفقات يعني جهة المضيف.
المتصفح الذي يعمل على المضيف يثبت مسار متصفح المضيف، لا مسار عملية المُرحّل. قارن العناوين التي يبلّغ عنها كل منهما، واختبر موردًا خاصًا وصفحة عامة، لأن نفقًا خاصًا فقط قد يوجّه أحدهما دون الآخر.
فكّك الإعداد واختر سلوك الفشل
التراجع جزء من الدليل. أوقف المُرحّل وأزله، وألغِ تثبيت عميل الالتقاط، وألغِ تصريح تصحيح الأخطاء الخاص بالمضيف من خيارات المطوّر في الهاتف عند انتهاء المهمة.
gnirehtet stop
gnirehtet uninstall
adb kill-server
قرّر ما يجب أن يفعله الهاتف عند اختفاء المُرحّل. بدون خيار صريح قد يرتد إلى بيانات الهاتف المحمول ويسرّب الحركة التي كنت تحاول توجيهها، لذا اضبط سلوك حظر الاتصالات أو سياسة VPN عمدًا واختبر التفكيك قبل أن تعتمد عليه.
سجّل المضيف الذي صُرّح به، وإصدار المُرحّل، وسياسة نفق المضيف، وخطوات التفكيك. هذا السجل هو ما يجعل إعداد الربط العكسي التالي قابلًا للتكرار بدلًا من ظهيرة أخرى من إعادة الاكتشاف.