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:
0 votos
¿Esta respuesta responde a tu pregunta? ¿Cómo configurar la configuración de DHCP de Tethering WIFI (Hotspot) en Android?