CLOUSD
Создать аккаунт
Разработчикам

ADB через интернет, безопасно

Четыре способа дотянуть adb с ноутбука до телефона, который стоит где-то ещё, команды для каждого и привычки, которые не дают отладочному мосту превратиться в открытую дверь.

adb создавался для USB-кабеля, а позже для локальной сети. Через интернет он тоже работает, и многие команды на это полагаются: CI-раннер в одном регионе общается с телефонами в другом, разработчик из дома дотягивается до офисной стойки, набор тестов управляет облачными телефонами. Но настройки по умолчанию рассчитаны на доверенную сеть. Ошибитесь в настройке, и отладочный мост станет удалённой оболочкой для любого, кто его найдёт.

В этом гайде разберём, как общается adb, четыре безопасных способа протянуть его через интернет с точными командами и чек-лист, который держит его закрытым.

Как общается adb

Участвуют три компонента. Клиент adb — это команда, которую вы вводите. Сервер adb — фоновый процесс на той же машине, который слушает 127.0.0.1:5037 и следит за устройствами. adbd — демон на телефоне. Сервер подключается к adbd по USB, по обычному TCP после adb tcpip или по TLS через беспроводную отладку на Android 11 и новее.

Работать удалённо значит протянуть одно из этих звеньев через интернет: от клиента к серверу или от сервера к adbd. Какое звено вы растягиваете, такой и способ.

Картину безопасности определяют два факта. adbd один раз просит пользователя подтвердить RSA-ключ каждого компьютера, и это не пускает чужих, которых телефон никогда не видел. Но классический режим TCP ничего не шифрует: вывод shell, logcat и каждый файл, который вы отправляете, идут открытым текстом.

Чего не делать никогда

Не пробрасывайте порты 5555 и 5037 в интернет на роутере и не открывайте их в облачном файрволе. В 2018 году червь, известный как ADB.Miner, распространялся по Android-устройствам с открытым adb на порту 5555, в основном по ТВ-приставкам, и превращал их в майнеры криптовалюты. Сканеры постоянно ищут открытые порты adb.

Не запускайте сервер adb с ключом -a: так он слушает все интерфейсы. Любой, кто доберётся до этого порта, управляет всеми устройствами на хосте, и никакого диалога подтверждения ключа не будет.

Способ 1: SSH-туннель к удалённому серверу adb

Подходит, когда телефоны подключены по USB к хосту, на который у вас есть SSH: офисная стойка, лабораторная машина, CI-сервер. Пробросьте локальный порт на adb-сервер хоста и направьте на него клиента:

ssh -N -L 15037:127.0.0.1:5037 user@lab-host
adb -P 15037 devices
ADB_SERVER_SOCKET=tcp:127.0.0.1:15037 adb -s SERIAL logcat -d

Берите локальный порт, отличный от 5037, чтобы ваш собственный adb-сервер не конфликтовал с туннелем. Установка, push, shell и logcat работают, потому что клиент гонит всё через своё подключение к серверу.

Один сюрприз: adb forward теперь открывает порт на лабораторном хосте, а не на вашем ноутбуке. Чтобы достать проброшенный порт со своей машины, добавьте для него второй -L в команду SSH.

SSH даёт ключи и шифрование, которым вы уже доверяете, а один туннель покрывает целую полку. Цена — хост, который нужно держать, и учётная запись на нём, причём любой с этой учётной записью управляет всеми подключёнными телефонами.

Способ 2: SSH-туннель к adbd

Подходит, когда телефон находится в сети, куда можно попасть через jump-хост, а USB-доступа ни к одной машине там нет. Один раз переведите телефон в режим TCP по USB или через беспроводную отладку, затем пробросьте туннель:

adb tcpip 5555
ssh -N -L 15555:192.168.1.50:5555 user@jump-host
adb connect 127.0.0.1:15555

Выбирайте локальный порт вне диапазона от 5555 до 5585, потому что adb-сервер считает локальные порты из этого диапазона эмуляторами. Телефон должен оставаться в режиме TCP, а большинство сборок сбрасывают его после перезагрузки, и при первом подключении на телефоне всё равно появится диалог ключа, так что кому-то придётся один раз его подтвердить.

Способ 3: беспроводная отладка через VPN

В Android 11 появилась беспроводная отладка: сопряжение по коду, затем соединение по TLS. Она рассчитана на локальную сеть, но работает и через VPN вроде WireGuard или Tailscale, если ноутбук и телефон видят приватные адреса друг друга. Включите «Отладку по Wi-Fi» в параметрах разработчика, выберите сопряжение по коду и выполните:

adb pair 100.64.0.12:37099
adb connect 100.64.0.12:41235

adb pair попросит шестизначный код. Порт сопряжения и порт подключения разные, и оба меняются, когда беспроводную отладку выключают и включают. Обнаружение через mDNS через большинство VPN не проходит, поэтому вводите адрес, который показывает телефон. Кроме того, настройка выключается сама, когда телефон уходит из своей сети Wi-Fi, так что для работы без присмотра она подходит плохо.

Способ 4: реле облака устройств

Облака устройств ставят перед adbd реле и дают каждому телефону свой адрес. Детали зависят от провайдера. Вот как реле устроено в Clousd по документации по ADB:

  • ADB по умолчанию выключен. Вы включаете его для каждого телефона со списком разрешённых адресов: до 20 IP или диапазонов.
  • Доступ истекает сам: по умолчанию через 24 часа, максимум через 7 дней. Неактивные сессии закрываются через 30 минут.
  • Вход выполняется по одноразовому коду, который показывается один раз. Неверные коды закрывают сессию, а повторные ошибки выключают реле.
  • Root, remount, reverse, reboot и похожие команды всегда отклоняются, а каждая сессия записывается в журнал.
adb connect HOST:PORT
adb -s HOST:PORT shell clousd-login CODE
adb -s HOST:PORT install app-debug.apk
adb -s HOST:PORT logcat -d

Ничего не нужно держать у себя и ничего не нужно открывать в своей сети. Цена в том, что несколько команд недоступны. Сценариям, которые полагаются на adb reverse, например приложению на React Native, которое ходит к серверу Metro на вашем ноутбуке, нужен другой путь, скажем, dev-сервер, до которого телефон дотягивается по URL. Если у вас вообще нет железа, к которому нужно подключаться, удалённый Android-телефон в облаке сразу идёт с реле перед ним.

Четыре способа в сравнении

SSH к серверу adbSSH к adbdБеспроводная отладка через VPNРеле облака устройств
Где телефонпо USB на хосте, который вы контролируетев сети за jump-хостомв сети, куда достаёт ваш VPNв дата-центре провайдера
Что вы обслуживаетехост и доступ по SSHjump-хост и режим TCPVPN и телефон в Wi-Fiничего
Контроль доступаSSH-ключиSSH-ключи плюс ключ adbVPN плюс сопряжениесписок адресов, срок действия, одноразовый код
Переживает перезагрузку телефонадаобычно нетнетда
adb reverseдададачасто отклоняется
Подходит дляофисных стоек, CI-хостовразового доступа в лабораториюличного телефонакоманд и CI без железа

Задержка и пропускная способность

adb болтлив, но к расстоянию терпим. Интерактивным adb shell можно пользоваться при задержке 200 мс туда и обратно, а logcat передаётся без проблем. Установка и push упираются в скорость вашей отдачи, поэтому APK на 150 МБ по медленному домашнему каналу заливается минутами.

Больше всего страдают инструментальные тесты, потому что каждое действие в интерфейсе ждёт ответа. Поднимите таймауты и замените фиксированные sleep на ожидание условия, а не удлиняйте sleep. Для зеркалирования экрана через scrcpy в SSH-туннеле снизьте битрейт и размер командой scrcpy --video-bit-rate=2M --max-size=1024. У облачного телефона эту работу обычно делает экран в браузере.

Удалённое тестирование на Android-устройствах в CI

Задача CI, которая тестирует на удалённых телефонах, состоит из четырёх шагов: подключиться, дождаться устройства, прогнать тесты, отключиться. Добавьте шаг входа, если он есть у вашего реле.

adb connect "$DEVICE"
adb -s "$DEVICE" wait-for-device
adb -s "$DEVICE" install -r app-debug.apk
adb -s "$DEVICE" install -r app-debug-androidTest.apk
adb -s "$DEVICE" shell am instrument -w com.example.app.test/androidx.test.runner.AndroidJUnitRunner
adb disconnect "$DEVICE"

Храните адреса устройств и коды входа в секретах CI, а не в репозитории. Как тот же прогон выглядит через REST API, показано на странице о тестировании приложений, а smoke-проход и команды logcat подробно разобраны в гайде о тестировании Android-приложения онлайн. Если вы решаете, держать ли собственную стойку вообще, загляните в статью о ферме Android-устройств.

Чек-лист безопасности

  • Никогда не открывайте порты 5037 и 5555 в интернет.
  • Относитесь к ~/.android/adbkey как к учётным данным. Это ваша личность для каждого телефона, который ему доверился, так что не копируйте его на общие машины.
  • На лабораторных телефонах время от времени отзывайте авторизации USB-отладки в параметрах разработчика.
  • Выбирайте доступ, который истекает сам и ограничен известными адресами.
  • Закончив, отключайтесь и останавливайте сервер командами adb disconnect и adb kill-server, а беспроводную отладку выключайте.
  • Ведите учёт, кто, когда и к какому телефону подключался.

Читайте также

Все гайды

Готовы запустить
свой первый облачный телефон?

Попробовать 30 минут бесплатно

Карта не нужна