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
Запустите adb devices прежде чем трогать VPN. Пустой список — это проблема транспорта, а не маршрутизации, и никакая настройка туннеля не починит устройство, которое сервер так и не перечислил. Перезапустите сервер начисто: сначала 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 — это порт сервера хоста, а не порт, на котором слушает устройство.
Проверьте эмулятор изнутри
Эмулятор отвечает на DNS с 10.0.2.3, и этот резолвер питается процессом хоста. Когда клиент 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 покрывает порт сервера и упомянутые здесь переменные окружения, чего достаточно, чтобы держать транспортную сторону честной, пока вы проверяете остальное.