CLOUSD
Crear cuenta
Desarrolladores

ADB por internet, de forma segura

Cuatro formas de llevar adb desde tu computadora hasta un teléfono que está en otro lugar, los comandos de cada una y los hábitos que evitan que un puente de depuración se convierta en una puerta abierta.

adb nació para un cable USB y, más tarde, para la red local. También funciona por internet, y muchos equipos dependen de eso: un runner de CI en una región que habla con teléfonos en otra, un desarrollador que desde casa llega al rack de la oficina, una suite de pruebas que maneja teléfonos en la nube. Pero la configuración por defecto da por hecho una red de confianza. Si se configura mal, un puente de depuración se convierte en una shell remota para cualquiera que lo encuentre.

Esta guía explica cómo se comunica adb, cuatro formas seguras de llevarlo por internet con los comandos exactos y una lista de verificación para mantenerlo cerrado.

Cómo se comunica adb

Intervienen tres piezas. El cliente adb es el comando que escribes. El servidor adb es un proceso en segundo plano en la misma máquina, que escucha en 127.0.0.1:5037 y lleva el registro de los dispositivos. adbd es el daemon del teléfono. El servidor llega a adbd por USB, por TCP sin cifrar después de adb tcpip o por TLS con la depuración inalámbrica de Android 11 en adelante.

Trabajar en remoto significa estirar uno de esos tramos por internet: del cliente al servidor o del servidor a adbd. El tramo que estires define el método.

Dos hechos marcan el panorama de seguridad. adbd pide al usuario que autorice una vez la clave RSA de cada computadora, lo que deja fuera a los desconocidos que el teléfono nunca ha visto. Pero el modo TCP clásico no cifra nada: la salida de la shell, el logcat y cada archivo que envías viajan en texto plano.

Lo que nunca hay que hacer

No redirijas los puertos 5555 o 5037 a internet en tu router ni los abras en un firewall de la nube. En 2018 un gusano conocido como ADB.Miner se propagó por dispositivos Android que exponían adb en el puerto 5555, sobre todo TV boxes, y los convirtió en mineros de criptomonedas. Los escáneres buscan puertos de adb abiertos todo el tiempo.

Evita también iniciar el servidor adb con -a, que lo pone a escuchar en todas las interfaces. Cualquiera que llegue a ese puerto maneja todos los dispositivos conectados al host, sin ningún diálogo de clave de por medio.

Forma 1: túnel SSH hasta un servidor adb remoto

Úsala cuando los teléfonos están conectados por USB a un host al que puedes entrar por SSH: un rack de oficina, una máquina de laboratorio, un servidor de CI. Redirige un puerto local al servidor adb del host y apunta tu cliente a él:

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

Usa un puerto local distinto de 5037 para que tu propio servidor adb no choque con el túnel. Instalaciones, envíos de archivos, shell y logcat funcionan, porque el cliente transmite todo a través de su conexión con el servidor.

Una sorpresa: adb forward ahora abre su puerto en el host del laboratorio, no en tu computadora. Para llegar a un puerto redirigido desde tu máquina, agrega para él un segundo -L al comando SSH.

SSH te da claves y un cifrado en los que ya confías, y un solo túnel cubre un estante entero. El costo es un host que mantener y una cuenta en él, y quien tenga esa cuenta controla todos los teléfonos conectados.

Forma 2: túnel SSH hasta adbd

Úsala cuando un teléfono está en una red a la que llegas a través de un host de salto y no tienes acceso USB a ninguna máquina de esa red. Pon el teléfono en modo TCP una vez, por USB o con depuración inalámbrica, y luego abre el túnel hasta él:

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

Elige un puerto local fuera del rango de 5555 a 5585, porque el servidor adb trata los puertos locales de ese rango como emuladores. El teléfono tiene que seguir en modo TCP, algo que la mayoría de las compilaciones pierde al reiniciar, y la primera conexión sigue mostrando el diálogo de la clave en el teléfono, así que alguien tiene que aceptarlo una vez.

Forma 3: depuración inalámbrica por VPN

Android 11 incorporó la depuración inalámbrica: emparejamiento con un código y después una conexión TLS. Está pensada para una red local, pero funciona a través de una VPN como WireGuard o Tailscale, siempre que tu computadora y el teléfono puedan llegar a las direcciones privadas del otro. Activa Depuración inalámbrica en Opciones para desarrolladores, elige vincular el dispositivo con un código de vinculación y ejecuta:

adb pair 100.64.0.12:37099
adb connect 100.64.0.12:41235

adb pair pide el código de seis dígitos. El puerto de emparejamiento y el de conexión son distintos, y ambos cambian cada vez que se activa o desactiva la depuración inalámbrica. La detección por mDNS no atraviesa la mayoría de las VPN, así que escribe la dirección que muestra el teléfono. Además, el ajuste se desactiva solo cuando el teléfono sale de su red Wi-Fi, lo que lo hace poco adecuado para cualquier cosa desatendida.

Forma 4: el relé de una nube de dispositivos

Las nubes de dispositivos ponen un relé delante de adbd y dan a cada teléfono su propia dirección. Los detalles cambian según el proveedor. Así funciona el relé en Clousd, según la documentación de ADB:

  • ADB viene desactivado. Lo activas por teléfono para una lista de hasta 20 direcciones IP o rangos permitidos.
  • El acceso caduca solo: a las 24 horas por defecto, a los 7 días como máximo. Las sesiones inactivas se cierran a los 30 minutos.
  • Inicias sesión con un código de un solo uso que se muestra una vez. Los códigos incorrectos cierran la sesión, y los fallos repetidos desactivan el relé.
  • Root, remount, reverse, reboot y comandos similares siempre se rechazan, y cada sesión queda registrada.
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

No hay nada que alojar ni nada que abrir en tu propia red. A cambio, algunos comandos quedan fuera. Los flujos de trabajo que dependen de adb reverse, como una app de React Native que se conecta al servidor Metro de tu computadora, necesitan otro camino, por ejemplo un servidor de desarrollo al que el teléfono llegue por URL. Si de entrada no tienes hardware al que conectarte, un teléfono Android remoto en la nube ya viene con el relé delante.

Las cuatro formas, comparadas

SSH al servidor adbSSH a adbdDepuración inalámbrica por VPNRelé de una nube de dispositivos
Dónde está el teléfonopor USB en un host que controlasen una red detrás de un host de saltoen una red a la que llega tu VPNen el centro de datos del proveedor
Qué mantienes túel host y el acceso SSHel host de salto y el modo TCPla VPN y el teléfono en Wi-Finada
Control de accesoclaves SSHclaves SSH más la clave de adbVPN más emparejamientolista de IP, caducidad, código de un solo uso
Sobrevive a un reinicio del teléfonosícasi nuncanosí
adb reversesísísía menudo rechazado
Ideal pararacks de oficina, hosts de CIacceso puntual a un laboratorioun teléfono personalequipos y CI sin hardware

Latencia y ancho de banda

adb conversa mucho, pero tolera bien la distancia. Una adb shell interactiva se puede usar con 200 ms de ida y vuelta, y el logcat se transmite sin problemas. Las instalaciones y los envíos de archivos dependen de tu velocidad de subida, así que un APK de 150 MB por una conexión doméstica lenta tarda minutos.

Las pruebas de instrumentación son las que más sufren, porque cada acción de la interfaz espera una respuesta. Sube los tiempos de espera y cambia las pausas fijas por esperas a una condición, en lugar de alargar las pausas. Para duplicar la pantalla con scrcpy por un túnel SSH, baja la tasa de bits y el tamaño con scrcpy --video-bit-rate=2M --max-size=1024. En un teléfono en la nube, la pantalla en el navegador suele cubrir esa necesidad.

Pruebas en dispositivos Android remotos desde CI

Un job de CI que prueba en teléfonos remotos tiene cuatro pasos: conectar, esperar al dispositivo, ejecutar y desconectar. Agrega el paso de inicio de sesión si tu relé lo tiene.

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"

Guarda las direcciones de los dispositivos y los códigos de acceso en los secretos de CI, no en el repositorio. La página de pruebas de apps muestra cómo se ve la misma ejecución con una API REST, y probar una app Android online explica en detalle la prueba de humo y los comandos de logcat. Si estás decidiendo si te conviene mantener tu propio rack, lee granja de dispositivos Android.

Lista de verificación de seguridad

  • Nunca expongas los puertos 5037 o 5555 a internet.
  • Trata ~/.android/adbkey como una credencial. Es tu identidad ante cada teléfono que confió en ella, así que no la copies a máquinas compartidas.
  • En los teléfonos del laboratorio, usa de vez en cuando Revocar autorizaciones de depuración USB en Opciones para desarrolladores.
  • Prefiere accesos que caduquen solos y estén limitados a direcciones conocidas.
  • Al terminar, desconéctate y detén el servidor con adb disconnect y adb kill-server, y desactiva la depuración inalámbrica.
  • Lleva un registro de quién se conectó a qué teléfono y cuándo.

Sigue leyendo

Todas las guías

¿Listo para lanzar
tu primer teléfono en la nube?

Prueba gratis 30 minutos

Sin tarjeta