ADB و شبیهساز Android پشت VPN شکست میخورند: سه مسیر
کشف ADB، کارت شبکه مجازی شبیهساز و حلکننده نام میزبان هر یک جداگانه پشت VPN شکست میخورند. هر مسیر را به ترتیب آزمایش کنید پیش از آنکه تونل را مقصر بدانید.
VPN اداری را وصل میکنید و Android Studio شبیهساز در حال اجرا را از دست میدهد، adb start-server معلق میماند و یک گوشی فیزیکی روی Wi-Fi از فهرست دستگاهها حذف میشود. به نظر میرسد یک تونل یک محصول را مسدود کرده است. در عمل سه مسیر جداگانه به سه شکل شکست میخورند: کشف دستگاه adb، شبکه مجازی شبیهساز و حلکننده نام میزبان. تونل معمولاً فقط مسیر آخر و اغلب تنها بخشی از آن را در اختیار دارد.
سه سوکت، سه مالک
سرور adb روی درگاه 5037 در میزبان گوش میدهد و با دستگاهها از طریق USB یا TCP صحبت میکند و برای کشف شبکه از mDNS استفاده میکند. شبیهساز پشت روتر مجازی خودش اجرا میشود: مهمان 10.0.2.15 است، دروازهاش 10.0.2.2 و سرور DNS آن 10.0.2.3 و فرایند شبیهساز همه را به سوکتهای میزبان ترجمه میکند. حلکننده نام میزبان جایی است که کلاینت VPN تنظیمات DNS و دامنههای جستجو را نصب میکند.
همین تفکیک توضیح میدهد چرا یک اصلاح برای یک ابزار کار میکند و برای ابزار دیگر نه. کلاینتی که حلکننده میزبان را تغییر میدهد فرایند شبیهساز را با همان وضعیت حلکنندهای رها میکند که هنگام شروع خوانده بود. کلاینتی که multicast را فیلتر میکند کشف را میشکند بیآنکه به DNS دست بزند. کلاینتی که کارتهای مجازی را فیلتر میکند شبیهساز را رد میکند در حالی که مرورگر میزبان کار میکند. هر نشانه علت جداگانه دارد، پس پیش از تغییر هر تنظیمی مسیر شکستخورده را مشخص کنید.
با چیزی که adb میبیند شروع کنید
پیش از دست زدن به VPN adb devices را اجرا کنید. فهرست خالی مشکل انتقال است نه مسیریابی، و هیچ تنظیم تونلی دستگاهی را که سرور هرگز فهرست نکرده درست نمیکند. سرور را پاک و دوباره راهاندازی کنید: ابتدا adb kill-server سپس adb start-server، و خروجی را بخوانید تا ببینید کدام درگاه را گرفت. اگر خود راهاندازی معلق بماند، کشف mDNS مظنون معمول در شبکهای است که multicast را فیلتر میکند؛ راهحل مستند این است که سرور را با کشف غیرفعال اجرا کنید:
ADB_MDNS_OPENSCREEN=0 adb start-server
adb devicesبرای دستگاه فیزیکی، USB کوتاهترین مسیر است. اگر به TCP نیاز دارید دستگاه را با adb tcpip 5555 در حالت شنیدن بگذارید و به نشانی و درگاه دستگاه وصل شوید، adb connect 192.0.2.10:5555. درگاه 5037 درگاه سرور میزبان است نه درگاهی که دستگاه روی آن گوش میدهد.
شبیهساز را از درون آزمایش کنید
شبیهساز از 10.0.2.3 به DNS پاسخ میدهد و آن حلکننده از فرایند میزبان تغذیه میشود. وقتی کلاینت VPN حلکننده میزبان را تغییر میدهد شبیهساز میتواند آن را به ارث ببرد؛ وقتی کلاینت فرایند شبیهساز را فیلتر میکند یا فهرست کارتهای میزبان پس از شروع شبیهساز تغییر میکند، نمیتواند. این دو را با یک هدف عددی و یک نام از همان پوسته جدا کنید. adb shell ping -c 2 10.0.2.2 ثابت میکند شبکه مجازی به سمت میزبان میرسد. جستجوی نام پس از آن نشان میدهد آیا تفکیک از مرز گذشته است.
سپس همان جستجوی نام را روی میزبان اجرا کنید. میزبان تفکیک میکند و شبیهساز نه یعنی شکست میان حلکننده میزبان و شبکه مجازی شبیهساز است نه در خود تونل. هر دو شکست بخورند یعنی باید حلکننده میزبان را دید. راهاندازی دوباره شبیهساز پس از اتصال VPN یک تلاش میارزد، چون برخی کلاینتها وضعیت حلکنندهای نصب میکنند که فرایند شبیهساز در حال اجرا آن را نمیگیرد.
حلکننده میزبان و فیلترهای کلاینت را بررسی کنید
کلاینت تونل کامل حلکننده میزبان را با خودش جایگزین میکند و کلاینت split-DNS دامنههای جستجو و ارسالکنندههای شرطی اضافه میکند. نامهای داخلی اغلب به همان پیکربندی split-DNS وابستهاند، پس ببینید میزبان در حالت اتصال چه استفاده میکند: نشانی حلکننده، دامنه جستجو و اینکه آیا ناحیه داخلی به DNS شرکت مسیریابی میشود. حلکنندهای که به نامهای عمومی پاسخ میدهد ولی به داخلی نه، پرسش سیاست است نه تونل خراب.
برخی کلاینتهای شرکتی ترافیک کارتهای مجازی را هم مسدود میکنند. برای درایور فیلتر شبیهساز مانند یک کارت مجازی دیده میشود، پس میزبان میتواند بیعیب کار کند در حالی که سیاست شبیهساز را رد میکند. آن سیاست از ایستگاه کاری دیده نمیشود و حدس زدن تنظیمات پروکسی آن را آشکار نمیکند. اگر میزبان تفکیک میکند و شبیهساز مستقل از تنظیمات حلکننده مسدود است، تشدید درست به تیمی است که مالک سیاست کلاینت است.
ترتیب بررسیها و معنای هر نتیجه
از بالا به پایین کار کنید و در نخستین سطر شکستخورده بایستید. هر نتیجه به مالک متفاوتی اشاره میکند و هیچکدام با نصب دوباره Android Studio درست نمیشود.
| Result | Likely owner | Next check |
|---|---|---|
| adb devices is empty with USB attached | USB, driver or adb server | cable, authorization prompt, adb kill-server |
| adb start-server hangs | mDNS discovery | ADB_MDNS_OPENSCREEN=0 |
| Emulator reaches 10.0.2.2, names fail | Host resolver to emulator boundary | host lookup of the same name |
| Host resolves, emulator still fails | Emulator process or client filter | restart emulator, ask IT about virtual adapters |
| Both fail for internal names only | Split DNS or search domain | resolver and zone configuration |
تنها دو سطر آخر پرسشهای VPN به معنای معمولاند و تنها سطر آخر درباره محتوای DNS است. مستندات adb درگاه سرور و متغیرهای محیطی نامبرده در اینجا را پوشش میدهد، که برای صادق نگه داشتن سمت انتقال هنگام آزمایش بقیه کافی است.