¿Cómo configurar los ajustes de DHCP de WIFI Tethering (Hotspot) en Android?

27

Al conectar mi PC al punto de acceso Wi-Fi de Android, asignó una 192.168.42.xdirección a mi PC. Realmente necesito cambiar esto, ya que entra en conflicto con una de nuestras subredes de trabajo. ¿Es esto posible?

VVK
fuente
2
Mi móvil está rooteado. No me importa cambiar los archivos del sistema si es necesario.
VVK
Al igual que la respuesta a los matices en algunas de las excelentes respuestas anteriores, en mi práctica, el rango 192.168.43.0/24 está asignado por Android / proveedor por defecto para la conexión WiFi y 192.168.42.0/24 es para la conexión USB.
Jim Klimov

Respuestas:

25

Desafortunadamente, no hay forma de cambiar el rango de direcciones IP para el soporte de anclaje incorporado, incluso en CyanogenMod. La IP del punto de acceso Wi-Fi está codificada en android.net.wifi.WifiStateMachine.startTethering () ; la IP de conexión USB está codificada en com.android.server.connectivity.Tethering .

Sin embargo, si su teléfono está rooteado, puede intentar usar aplicaciones de terceros para la conexión que tengan la opción de cambiar el rango de direcciones IP. Por ejemplo, cuando la conexión USB incorporada se rompió en CyanogenMod alphas para Samsung Galaxy W, utilicé Wired Tether para usuarios root , que tiene esa opción. Para la conexión Wi-Fi, puede probar la aplicación Wireless Tether for Root Users de los mismos autores, que también tiene la opción de cambiar el rango de direcciones IP.


Debido a que Google Code se cerró, los enlaces anteriores ya no funcionan. Algunas personas exportaron el código fuente de esos repositorios a GitHub:

Sin embargo, no hubo más actividad de desarrollo, y las aplicaciones probablemente ya no funcionen en las versiones recientes de Android.

En caso de que alguien quiera probar esas aplicaciones obsoletas, he podido encontrar algunos archivos APK en el Archivo de códigos de Google :

Sergey Vlasov
fuente
+1 para la información. Mi dispositivo está rooteado, pero la aplicación Wireless Tether for Root Users no funciona en mi dispositivo móvil. Debería haber alguna forma de cambiar el rango de IP en el teléfono rooteado, C'Mon Man !, Android es un sistema operativo abierto después de todo.
VVK
@VVK Hay una manera. Solo recompila la fuente.
Syakur Rahman
Las aplicaciones que mencionas parecen no existir más. ¿Puedes encontrar nuevas versiones en línea, ya que sabes el nombre de los editores? Encontré algunos otros, pero ninguno de ellos era gratis ...
pgr
@pgr Se encontraron algunos enlaces de trabajo, pero no hay versiones más nuevas.
Sergey Vlasov
21

El anclaje a red incorporado de Android está diseñado para usar 192.168.43.1/24 como servidor, con el netdmanejo del anclaje a red dnsmasq. El primer rango de DNS es 192.168.42.1-254y y el segundo rango de DNS es 192.168.43.1-254.

Netd no es fácil de cambiar. Requiere un socket para comunicarse con él, y ese socket se toma cuando Android comienza a conectarse. Pero revisando los archivos fuente de Tethering.java(usé Froyo) vemos:

// usb client will be provided 192.168.42.129
private static final String USB_NEAR_IFACE_ADDR      = "192.168.42.129";
private static final String USB_NETMASK              = "255.255.255.0";

// FYI - the default wifi is 192.168.43.1 and 255.255.255.0

private String[] mDhcpRange;
private static final String DHCP_DEFAULT_RANGE1_START = "192.168.42.2";
private static final String DHCP_DEFAULT_RANGE1_STOP  = "192.168.42.254";
private static final String DHCP_DEFAULT_RANGE2_START = "192.168.43.2";
private static final String DHCP_DEFAULT_RANGE2_STOP  = "192.168.43.254";

Y más adelante vemos esos rangos utilizados, COMO BACKUPS .

    mDhcpRange = context.getResources().getStringArray(
            com.android.internal.R.array.config_tether_dhcp_range);
    if ((mDhcpRange.length == 0) || (mDhcpRange.length % 2 ==1)) {
        mDhcpRange = new String[4];
        mDhcpRange[0] = DHCP_DEFAULT_RANGE1_START;
        mDhcpRange[1] = DHCP_DEFAULT_RANGE1_STOP;
        mDhcpRange[2] = DHCP_DEFAULT_RANGE2_START;
        mDhcpRange[3] = DHCP_DEFAULT_RANGE2_STOP;
    }

La fuente principal de los rangos dhcp no son los codificados 42 y 43, sino que se leen desde array.config_tether_dhcp_range, una matriz de cadenas interna. Pero actualmente está vacío.

Podrías editar el marco de Android. En mi teléfono, lo es /system/framework/framework-res.apk. Hay un montón de tutoriales en línea para editar framework-res.apk, desde cadenas simples hasta temas completos. Encuentre uno para su teléfono y versión de Android.

Lo principal que desea cambiar es el /res/values/arrays.xml

Buscar <array name="config_tether_dhcp_range" />

Cambiar a:

<string-array name="config_tether_dhcp_range">
     <item>192.168.x.y</item>
     <item>192.168.x.z</item>
</string-array>

compile / zip / sign según sea necesario (siga un tutorial), luego reinstale.

Si desea más de un rango, simplemente copie los dos elementos una y otra vez. Siempre debe proporcionar un inicio y una parada para cada rango. Trate de mantenerlo en el mismo / 24, es decir, 192.168.50.5 192.168.50.99o lo que sea. Puede confirmar que está funcionando busybox ps | grep dnsmasqo si no tiene busybox ps dnsmasq, use el pid in cat /proc/pid/cmdline. Deberías obtener (o similar):

/ system / bin / dnsmasq --no-daemon --no-poll -no-resolv --dhcp-range = 192.168.50.5,192.168.50.99,1h

FWIW, mi conexión WIFI utiliza los dnsmasqrangos predeterminados , pero mi computadora fue asignada 192.168.43.147/24y puerta de enlace 192.168.43.1/24. No estoy seguro de por qué el tuyo se omitió en una 42.xdirección.

cde
fuente
2
42 es para USBNET 43 es para wifi
Zibri
bonito hallazgo, ¿dónde ves eso?
cde
1
Porque si conectas por usb obtienes 42. Si conectas por wifi obtienes 43.
Zibri
5

Sé que esta es una publicación antigua, pero pensé que podría proporcionar una actualización. Parece que algunos fabricantes y versiones de Android ahora sí permiten el cambio del rango de subred IP para el servidor DHCP a través de la interfaz de usuario cuando se utiliza la función de punto de acceso WiFi. Aquí es donde encontrarlo en un HTC One M8 con Android 6.0. YMMV.

Desde la pantalla Mobile Hotspot, haga clic en el ícono de 3 puntos (más), vaya a Avanzado y luego a Configuración de LAN. En "IP local", cambie la dirección IP a su IP deseada. En "DHCP local", cambie la IP de inicio para que coincida con la subred de su dirección IP.

Trent

Trent
fuente
¿Sabes si los nuevos teléfonos HTC también tienen esta opción?
Arya
1

NOTA: Se requiere root.

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

Cuando activas el anclaje, lo que sucede (al menos):

  • hostapd - se inicia el demonio que gestiona los puntos de acceso.
  • Se configuran las interfaces de red, se agrega la dirección IP a la interfaz Wi-Fi (codificada antes de Android Pie ( 2 , 3 ) , aleatorizada después ( 4 ) ) y se agrega la 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 ( 7 ) (que de lo contrario se pueden configurar mediante /etc/dnsmasq.conf ( 8 ) ).

Por lo tanto, podemos reemplazarlo /system/bin/dnsmasqcon un script de shell personalizado, tomando el control del proceso intermedio. Cambie el nombre del binario original a otra cosa:

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

Crear guión /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

# delete old route, add new
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

# set new IP address on Wi-Fi interface
ip address add ${NEW_SUBNET}.1/24 dev $WIFI_INTERFACE

# inject new subnet in hard-coded arguments received from netd
set -- $(printf '%s' "$*" | sed 's/'${OLD_SUBNET}'/'${NEW_SUBNET}'/g')
unset OLD_SUBNET NEW_SUBNET WIFI_INTERFACE LOCAL_TABLE

# execute original binary with new arguments
exec dnsmasq.bin $*

Confirme el nombre de su interfaz Wi-Fi ( wlan0generalmente). Consulte con ip linko ls /sys/class/net/.

También confirmar su tabla de enrutamiento de red local es 97: grep local_network /data/misc/net/rt_tables. El enrutamiento de Android es un desastre, que se vuelve más complejo con cada nueva versión. Así que no estoy seguro de si esto ha sido persistente o no. Además, antes de realizar cualquier cambio, verifique sus políticas y tablas de enrutamiento para averiguar qué debe incluir en su 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 definirse si (todas o algunas) aún no están definidas y si el estado sí lo está enforcing. Utilice Magisk suploicyu otra herramienta similar como sepolicy-inject:

# execute binaries from /system/bin
allow netd system_file dir { read open getattr search }
allow netd system_file file { read gettattr open execute execute_no_trans }

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

# execute /system/bin/toolbox and its applets
allow netd toolbox_exec file { read gettattr open execute execute_no_trans }

# configure RPDB rules / routing tables
allow netd netd capability { sys_admin }

* no es persistente en todos los reinicios, usa algún init.dscript o reemplaza /sepolicyenramdisk

Establecer permisos en archivos:

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

¡Disfrutar!

O puede configurar la conexión completa desde la línea de comandos, ejecutando sus propios procesos. Esta respuesta incluye las instrucciones, aunque la pregunta es diferente.

RELACIONADO:

Irfan Latif
fuente