Nob ~/notas/apagar-el-radio

~/notas

El comando que sí apaga el radio

Por qué cambiar la IP de un celular por ADB parecía imposible, y por qué el problema siempre fue el comando

publicada 1 oct 20265 min de lecturaNob

resumen

pregunta
¿Se puede cambiar la IP pública de un celular Android solo desde el PC, por ADB y sin root?
método
Medir la IP pública, cambiar el estado de la red por ADB, esperar la reconexión, volver a medir, y guardar los registros del radio de cada intento
resultado
Con settings put global airplane_mode_on no; con cmd connectivity airplane-mode sí. Prueba real: IP nueva al primer intento, en 20 s
límites
Un celular (Redmi Note 13 Pro+, Android 16) y un operador (Claro Colombia). Con CGNAT, una IP nueva no está garantizada en cada ciclo

La pregunta era concreta: ¿se puede cambiar la IP pública de un celular Android solo desde el PC, por ADB y sin root? Mucha gente da por hecho que activar el modo avión siempre trae una IP nueva, y yo quería comprobarlo con evidencia

Lo que se cree

La idea circula mucho: si quieres otra IP, activa el modo avión unos segundos y vuelve a desactivarlo. Y muchas veces funciona, por eso se repite. El problema está en el «siempre»: a veces la IP sale igual, y no siempre por la misma razón

Qué pasa de verdad

Para entenderlo hay que separar dos IP que se suelen confundir. Cuando el celular usa datos móviles, abre una sesión de datos con la red del operador (en LTE se llama conexión PDN), y el núcleo de esa red le asigna una IP. Con muchos operadores esa IP es privada: el celular no sale a internet con ella, sino a través de un CGNAT, un NAT del operador que reparte unas pocas IP públicas entre muchísimos usuarios

cómo funciona
celular
 │ sesión de datos
 ▼
torre ──► núcleo del operador
            │ asigna una IP privada (por ejemplo 10.x.x.x o 100.64.x.x)
            ▼
          CGNAT
            │ la traduce a una IP pública compartida
            ▼
          lo que ve internet: 190.130.xxx.204

El rango 100.64.0.0/10 existe justamente para esto: el RFC 6598 lo reservó para el espacio entre el operador y su CGNAT. Y el RFC 6888 pide que, por defecto, un CGNAT mantenga la misma IP pública para una misma IP interna mientras dure su uso («paired pooling»), así las conexiones de un usuario no salen por direcciones distintas

Cuando el modo avión apaga el radio de verdad, esa sesión se cierra. Al volver, el celular abre una sesión nueva y el operador le vuelve a asignar una IP, que normalmente es otra. Pero lo que ve internet depende de qué dirección pública le toque en el CGNAT: puede ser otra, o puede repetirse la de antes

Por eso el resultado no es seguro. Hay al menos tres razones para que la IP salga igual:

  • El radio no se apagó de verdad. Si solo cambia un ajuste, la sesión sigue abierta y el operador no tiene por qué darte otra IP. Es justo lo que pasó en mi primer intento
  • El CGNAT te vuelve a dar la misma IP pública. La sesión es nueva, pero la dirección compartida que te toca puede repetirse
  • Lo que se mide no es la red móvil. Si el Wi-Fi sigue encendido, el tráfico sale por el internet de la casa, y esa IP no cambia por más veces que actives el modo avión

ideaEn resumen: el modo avión no es lo que cambia la IP. Lo que la puede cambiar es que la sesión de datos se cierre y se abra otra; el modo avión es solo una forma de provocarlo, y no siempre lo logra

El primer intento

Los modos A y B del IP Rotator usaban esto:

terminal
$ adb shell settings put global airplane_mode_on 1

Parecía funcionar, porque el ajuste cambiaba. Pero los registros del radio (logcat -b radio) contaban otra historia: el radio nunca soltaba la torre. El comando solo cambiaba un valor guardado, así que el operador mantenía la misma sesión de CGNAT y la misma IP

En diciembre de 2025 la conclusión quedó escrita en el README de la v0.1.0: ADB no podía hacerlo sin permisos de sistema

El comando correcto

Seis meses después, mientras armaba Goket (mi panel de red), Claude encontró otro camino:

terminal
$ adb shell cmd connectivity airplane-mode enable
$ adb shell cmd connectivity airplane-mode disable

La diferencia está en por dónde pasa. Este comando va por ConnectivityService, el mismo camino que usa el botón del sistema, y sí apaga el radio de verdad. Funciona sin root desde Android 12. En Android 16, en cambio, el aviso viejo de AIRPLANE_MODE ya ni siquiera se puede mandar desde ADB: lanza SecurityException

Los detalles que hicieron falta

El comando solo no alcanzaba. Hicieron falta tres cosas más:

  • El Wi-Fi del celular se apaga durante la prueba (svc wifi disable). Si no, el tethering sale por el internet de la casa y la IP que se mide no es la del operador
  • Con CGNAT no hay garantía de IP nueva al primer intento, así que se repiten ciclos cortos: 7 s apagado, 12 s para estabilizarse, hasta 5 veces
  • La IP se mide por la interfaz del tethering (curl --interface), así el PC no pierde su propio internet en ningún momento

En la prueba real del 30 de septiembre de 2026 la IP cambió al primer intento, en 20 s. Salió como la v0.2.0

Otras ideas, sin probar

Si lo que cambia la IP es que la sesión de datos se cierre y se abra otra, el modo avión no debería ser el único camino. Dos ideas que quedan anotadas, todavía sin probar:

  • Apagar y prender solo los datos móviles. Cerraría la sesión de datos sin apagar todo el radio, y quizás sería más rápido que un ciclo completo de modo avión
  • Cambiar el tipo de red preferida. Pasar de 5G o 4G a 3G y volver obligaría al celular a registrarse de nuevo en la red, y con eso a abrir otra sesión

Si alguna funciona, habría que comprobarla igual que el modo avión: medir la IP antes y después, y mirar los registros del radio

Límites

  • Lo medido sale de un solo celular y un solo operador. Otro operador puede asignar las IP de otra forma, o incluso dar una IP fija por línea
  • Cuántos ciclos hacen falta para una IP nueva depende del CGNAT del operador; los 5 intentos son un tope práctico, no un número medido en general
  • Las dos ideas de arriba son hipótesis: no hay datos todavía

Lo que me quedó

La conclusión de diciembre era cierta para ese comando: con él, de verdad no se podía. Lo que estaba mal era dar la pregunta por cerrada cuando lo que había fallado era la herramienta. Y fueron los registros del radio, no la intuición, los que mostraron dónde estaba el problema

Preguntas frecuentes

¿Activar el modo avión cambia la IP?

A veces. Si el radio se apaga de verdad, la sesión de datos se cierra y al volver el operador asigna otra IP, pero con CGNAT la IP pública que ve internet puede repetirse. Y si el Wi-Fi está encendido, lo que se mide es la IP de la casa, que no cambia

¿Por qué mi IP no cambia aunque active el modo avión?

Las causas más comunes son tres: el Wi-Fi seguía conectado, el CGNAT del operador te volvió a dar la misma IP pública, o el método usado no apagó el radio de verdad (por ejemplo, cambiar el ajuste airplane_mode_on por ADB)

¿Qué es CGNAT?

Un NAT que pone el operador: muchos clientes reciben una IP privada y salen a internet compartiendo unas pocas IP públicas. Por eso la IP que ve una página web no es la que tiene tu celular

¿Cómo cambiar la IP de un celular Android desde el PC sin root?

Por ADB, con cmd connectivity airplane-mode enable y luego disable, que pasa por el servicio de conectividad del sistema y sí apaga el radio. Conviene apagar el Wi-Fi del celular durante la prueba y repetir el ciclo si la IP sale igual

¿Qué formas hay de rotar la IP de un celular?

La probada en esta nota es un ciclo real de modo avión por ADB. Otras ideas, sin probar todavía, son apagar y prender solo los datos móviles o cambiar el tipo de red preferida para forzar un registro nuevo

Referencias

  1. RFC 6888 · Common Requirements for Carrier-Grade NATs (CGNs) · rfc-editor.org/rfc/rfc6888
  2. RFC 6598 · IANA-Reserved IPv4 Prefix for Shared Address Space (100.64.0.0/10) · rfc-editor.org/rfc/rfc6598
  3. 3GPP TS 23.401 · GPRS enhancements for E-UTRAN access (PDN connections in LTE)
  4. Android Debug Bridge (adb) · official documentation · developer.android.com/tools/adb
  5. Nuulz/android-ip-rotator-adb · source code and v0.2.0 · github.com/Nuulz/android-ip-rotator-adb

¿Algo para corregir o agregar? Escríbeme →