2 votos

¿Cómo cambiar la máscara de subred para el hotspot de Wi-Fi sin acceso de root?

Si inicio un punto de acceso Wi-Fi, los dispositivos se conectan con direcciones IP en el rango 192.168.43.xxx. ¿Cómo puedo cambiar eso al rango 192.168.1.xxx?

He leído la respuesta a ¿Cómo cambiar el rango de direcciones IP DHCP predeterminado en Android 7.1.2? pero requiere un dispositivo con acceso de administrador y quiero hacer esto sin acceso de administrador.

2 votos

0 votos

Eso ciertamente lo haría (upvote), PERO requiere root, el cual no tengo en mi 'teléfono :-(

0voto

Jack Wade Puntos 231

NOTA: Root es requerido.

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, esto es lo que sucede (al menos):

  • hostapd - el daemon 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 (predeterminada antes de Android Pie (2, 3), aleatoria después (4)), y se añade una tabla de enrutamiento (5) para la red local (6).
  • dnsmasq - el servidor DHCP/DNS (hasta Pie) - se inicia con argumentos de línea de comandos codificados en duro (7) (que se pueden configurar a través de /etc/dnsmasq.conf (8) de lo contrario).

Por lo tanto, podemos reemplazar /system/bin/dnsmasq con un script shell personalizado, tomando el control del proceso intermedio. Cambia el nombre del archivo binario original por otro:

~# 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='97'

export PATH=/system/bin

# eliminar la ruta antigua, agregar la 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 la nueva dirección IP en la interfaz Wi-Fi
ip address add ${NEW_SUBNET}.1/24 dev $WIFI_INTERFACE

# inyectar una nueva 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 de Wi-Fi (wlan0 por lo general). Verifica con ip link o ls /sys/class/net/.

También confirma que la tabla de enrutamiento de tu red local es 97: grep local_network /data/misc/net/rt_tables. El enrutamiento de Android es un lío, cada vez más complejo con cada nueva versión. Así que no estoy seguro si esto ha sido persistente o no. También antes de hacer cualquier cambio, verifica tus políticas y tablas de enrutamiento para saber qué debes poner 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 de SELinux también deben estar definidas si (todas o algunas) aún no están definidas y si el estado es enforcing. Utiliza el 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 }

* no es persistente en los reinicios, utiliza un script init.d o reemplaza /sepolicy en ramdisk

Establece permisos en los archivos:

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

¡Disfruta!

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

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:

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