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:
2 votos
Posible duplicado de ¿Cómo cambiar el rango de direcciones IP DHCP predeterminado en Android 7.1.2?
0 votos
Eso ciertamente lo haría (upvote), PERO requiere root, el cual no tengo en mi 'teléfono :-(