3 votos

¿Cómo cambiar el rango de direcciones IP DHCP de hotspot predeterminado en Android?

Como dice el título, busco una manera de cambiar permanentemente el rango de dirección IP predeterminado de 192.168.43.xxx a 192.168.1.xxx.

Motivo: En mi enrutador, algunos de mis dispositivos obtienen una IP estática a través de DHCP, en el rango 192.168.1.xxx. Al usar el hotspot en la carretera, me gustaría tener la misma configuración.

He intentado cambiar el rango siguiendo estos pasos, pero no funcionó en ninguno de mis dispositivos. Están enraizados y tienen instalado Lineage OS. La última respuesta sugiere una manera fácil de hacerlo, pero no es posible en Lineage OS.

También esta publicación de androidpolice.com sugiere que es posible con una aplicación, busco una solución para hacer esto con adb. No tengo acceso a Google Play y no lo quiero.

0 votos

8voto

Jack Wade Puntos 231

NOTA: Se requiere ser superusuario.


El rango de direcciones IP de DHCP predeterminado está codificado en duro (1), no se puede cambiar sin reconstruir el ROM con el código fuente modificado. O usar un pequeño truco.

Cuando activas el tethering, ocurre lo siguiente:

  • hostapd - el demonio que gestiona los puntos de acceso - se inicia.
  • Se configuran las interfaces de red, se añade una dirección IP a la interfaz Wi-Fi (codificada en duro antes de Android Pie (2, 3), aleatoria después (4)), y se añade una tabla de enrutamiento (5) para la red local.
  • dnsmasq - el servidor DHCP/DNS (hasta Pie) - se inicia con argumentos de línea de comandos codificados en duro (6) (que se pueden configurar a través de /etc/dnsmasq.conf (7) de lo contrario).

Por lo tanto, podemos reemplazar /system/bin/dnsmasq con un script de shell personalizado, tomando el control del proceso intermedio. Renombra el binario original a algo más:

~# mv /system/bin/dnsmasq /system/bin/dnsmasq.bin

Crea el script /system/bin/dnsmasq:

#!/system/bin/sh

OLD_SUBNET='192.168.43'
NEW_SUBNET='192.168.1'
WIFI_INTERFACE='wlan0'
LOCAL_TABLE=$(awk '$2=="local_network" {print $1}' /data/misc/net/rt_tables)

export PATH=/system/bin

# eliminar ruta antigua, añadir nueva
ip route del ${OLD_SUBNET}.0/24 dev ${WIFI_INTERFACE} table $LOCAL_TABLE
ip route add ${NEW_SUBNET}.0/24 dev ${WIFI_INTERFACE} table $LOCAL_TABLE

# establecer nueva dirección IP en la interfaz Wi-Fi
ip address add ${NEW_SUBNET}.1/24 dev $WIFI_INTERFACE

# inyectar nuevo subred en los argumentos codificados en duro recibidos de netd
set -- $(printf '%s' "$*" | sed 's/'"${OLD_SUBNET}"'/'"${NEW_SUBNET}"'/g')
unset OLD_SUBNET NEW_SUBNET WIFI_INTERFACE LOCAL_TABLE

# ejecutar el binario original con los nuevos argumentos
exec dnsmasq.bin $*

Confirma el nombre de tu interfaz Wi-Fi (wlan0 usualmente). Verifica con ip link o ls /sys/class/net/ o iw:

WIFI_INTERFACE=$(iw dev | grep -E 'ssid |Interface ' | grep -B1 ssid | awk '$1=="Interface" {print $2}')

Confirma también que tu tabla de enrutamiento local_network (8, 9) (97) se esté utilizando para el hotspot. El enrutamiento de Android es un lío, se vuelve más complejo con cada nueva versión. Así que no estoy seguro si esto ha sido persistente o no. Antes de realizar cualquier cambio, verifica tus políticas y tablas de enrutamiento para saber qué debes incluir en tu script:

~# RULES="$(ip rule | grep -vE 'unreachable|local')"
~# echo "$RULES"
~# for t in $(echo "$RULES" | awk '{print $NF}' | uniq); do ip r s table $t; done

Las reglas SELinux también deben estar definidas si (todas o algunas) aún no están definidas y si el estado es enforcing. Utiliza suploicy de Magisk u otra herramienta similar como sepolicy-inject:

# ejecutar binarios desde /system/bin
allow netd system_file dir { read open getattr search }
allow netd system_file file { read gettattr open execute execute_no_trans }

# ejecutar /system/bin/sh
allow netd shell_exec file { read getattr open execute execute_no_trans }

# ejecutar /system/bin/toolbox y sus applets
allow netd toolbox_exec file { read gettattr open execute execute_no_trans }

# configurar reglas RPDB / tablas de enrutamiento
allow netd netd capability { sys_admin }

* Las reglas no son persistentes a través de reinicios, usa algún script init.d o reemplaza /sepolicy en el ramdisk

Establece permisos en los archivos:

~# chown 0.0 /system/bin/dnsmasq*; chmod 0755 /system/bin/dnsmasq*
~# chcon u:object_r:system_file:s0 /system/bin/dnsmasq
~# chcon u:object_r:dnsmasq_exec:s0 /system/bin/dnsmasq.bin

¡Disfruta!

Otra opción es modificar el valor de config_tether_dhcp_range (10) en el framework de Android como se explica en esta respuesta, pero no he probado esto.

O puedes configurar todo el tethering desde la línea de comandos, ejecutando tus propios procesos. Esta respuesta incluye las instrucciones, aunque la pregunta es diferente.


RELACIONADO:

1 votos

OP, ¿hay alguna razón por la que no aceptaste esta gran respuesta? Hacerlo ayudaría a otros que lean esto en el futuro.

0 votos

@Irfan Latif esto ya no funciona en LineageOS 17.1 alias android 10. ¿Podrías ayudar a configurarlo allí?

0 votos

@kocj sí, ya mencionado: "dnsmasq - el servidor DHCP/DNS (hasta Pie) ". Hasta ahora no he probado nada en Android 10+. Utilizan la implementación de servidor DHCP en Java, que no es tan fácil de modificar como una herramienta de línea de comandos. Posiblemente la única forma sería parchear algún archivo de sistema, o recompilar todo el ROM después de parchear el código fuente.

PreguntAndroid.com

PreguntAndroid es una comunidad de usuarios de Android en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X