Quando si collega il mio PC all'hotspot Wi-Fi Android, ha assegnato un 192.168.42.x
indirizzo al mio PC. Devo davvero cambiarlo perché è in conflitto con una delle nostre sottoreti di lavoro - è possibile?
Quando si collega il mio PC all'hotspot Wi-Fi Android, ha assegnato un 192.168.42.x
indirizzo al mio PC. Devo davvero cambiarlo perché è in conflitto con una delle nostre sottoreti di lavoro - è possibile?
Risposte:
Sfortunatamente, non è possibile modificare l'intervallo di indirizzi IP per il supporto di tethering incorporato, anche in CyanogenMod. L'IP dell'hotspot Wi-Fi è codificato in android.net.wifi.WifiStateMachine.startTethering () ; l'IP tethering USB è codificato in com.android.server.connectivity .
Tuttavia, se il tuo telefono è rootato, puoi provare a utilizzare app di terze parti per il tethering che hanno l'opzione per modificare l'intervallo di indirizzi IP. Ad esempio, quando il tethering USB incorporato è stato interrotto in CyanogenMod alfa per Samsung Galaxy W, ho usato Wether Tether per gli utenti root , che ha tale opzione. Per il tethering Wi-Fi puoi provare l' app Wireless Tether for Root Users degli stessi autori, che ha anche la possibilità di modificare l'intervallo di indirizzi IP.
Poiché il codice di Google è stato chiuso, i collegamenti sopra non funzionano più. Alcune persone hanno esportato il codice sorgente da quei repository su GitHub:
Tuttavia, non ci sono state ulteriori attività di sviluppo e le app probabilmente non funzionano più con le recenti versioni di Android.
Nel caso in cui qualcuno volesse provare quelle app obsolete, sono stato in grado di trovare alcuni file APK nell'Archivio codici di Google :
Il tethering wifi integrato di Android è progettato per utilizzare 192.168.43.1/24 come server, con la netd
gestione del tethering tramite dnsmasq
. Il primo intervallo DNS è 192.168.42.1-254
e il secondo intervallo DNS è 192.168.43.1-254
.
Netd non è facile da cambiare. Richiede un socket per comunicare con esso e quel socket viene preso quando Android inizia il tethering. Ma esaminando i file di origine per Tethering.java
(ho usato Froyo) vediamo:
// 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";
E più avanti vediamo quelle gamme utilizzate, COME 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 fonte principale per gli intervalli dhcp non sono gli hardcoded 42 e 43, ma letti da array.config_tether_dhcp_range, un array di stringhe interno. Ma al momento è vuoto.
È possibile modificare il framework Android. Sul mio telefono, lo è /system/framework/framework-res.apk
. Ci sono un sacco di tutorial online per l'editing quadro-res.apk, dalle stringhe semplici a pieno tematizzazione. Trova uno per il tuo telefono e la versione Android.
La cosa principale che vuoi cambiare è la /res/values/arrays.xml
Cercare <array name="config_tether_dhcp_range" />
Passare a:
<string-array name="config_tether_dhcp_range">
<item>192.168.x.y</item>
<item>192.168.x.z</item>
</string-array>
compilare / zip / sign secondo necessità (seguire un tutorial), quindi reinstallare.
Se si desidera più di un intervallo, è sufficiente copiare i due elementi più e più volte. È sempre necessario fornire un inizio e una fine per ciascun intervallo. Cerca di mantenerlo nella stessa / 24, ovvero 192.168.50.
5 e 192.168.50.99
quant'altro. Puoi confermare che funziona con busybox ps | grep dnsmasq
o se non hai busybox ps dnsmasq
quindi usa il pid in cat /proc/pid/cmdline
. Dovresti ottenere (o simili):
/ system / bin / dnsmasq --no-daemon --no-poll -no-resolv --dhcp-range = 192.168.50.5.192.168.50.99,1h
FWIW, il mio tethering WIFI utilizza gli dnsmasq
intervalli predefiniti , ma il mio computer è stato assegnato 192.168.43.147/24
e gateway 192.168.43.1/24
. Non sono sicuro del motivo per cui il tuo è impostato automaticamente su un 42.x
indirizzo.
So che questo è un vecchio post, ma ho pensato di fornire un aggiornamento. Sembra che alcuni produttori e versioni di Android ora consentano la modifica dell'intervallo di sottorete IP per il server DHCP attraverso l'interfaccia utente quando si utilizza la funzionalità hotspot WiFi. Ecco dove trovarlo su un HTC One M8 con Android 6.0. YMMV.
Dalla schermata Hotspot mobile, fai clic sull'icona a 3 punti (altro), vai su Avanzate, quindi su Impostazioni LAN. In "IP locale" cambia l'indirizzo IP nell'IP desiderato. In "DHCP locale" modifica l'IP iniziale in modo che corrisponda alla sottorete del tuo indirizzo IP.
Trent
NOTA: è richiesto il root.
L'intervallo di indirizzi IP DHCP predefinito è hardcoded ( 1 ) , non è possibile modificarlo senza ricostruire la ROM con il codice sorgente modificato. O usa un piccolo trucco.
Quando si attiva il tethering, cosa succede (almeno):
hostapd
- il demone che gestisce i punti di accesso - viene avviato.dnsmasq
- il server DHCP / DNS (fino a Pie) - viene avviato con argomenti a riga di comando codificati ( 7 ) (che possono essere impostati tramite /etc/dnsmasq.conf
( 8 ) in caso contrario).Quindi possiamo sostituire /system/bin/dnsmasq
con uno script di shell personalizzato, prendendo il controllo del processo tra. Rinomina il file binario originale in qualcos'altro:
# mv /system/bin/dnsmasq /system/bin/dnsmasq.bin
Crea 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
# 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 $*
Conferma il nome della tua interfaccia Wi-Fi (di wlan0
solito). Verificare con ip link
o ls /sys/class/net/
.
Anche confermare la tabella di routing di rete locale è 97
: grep local_network /data/misc/net/rt_tables
. Il routing di Android è un casino, diventando più complesso con ogni nuova versione. Quindi non sono sicuro che sia stato persistente o meno. Inoltre, prima di apportare qualsiasi modifica, controlla le politiche e le tabelle di routing per capire cosa dovresti inserire nel tuo 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
Le regole di SELinux devono anche essere definite se (tutte o alcune) non sono già state definite e se lo è enforcing
. Usa Magisk suploicy
o altri strumenti simili come 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 }
* Non è persistente dopo il riavvio, utilizzare alcuni init.d
script o sostituire /sepolicy
inramdisk
Imposta le autorizzazioni sui file:
~# chown 0.0 /system/bin/dnsmasq*
~# chmod 0755 /system/bin/dnsmasq*
~# chcon u:object_r:dnsmasq_exec:s0 /system/bin/dnsmasq*
Godere!
Oppure puoi impostare il tethering completo dalla riga di comando, eseguendo i tuoi processi. Questa risposta include le istruzioni, sebbene la domanda sia diversa.
RELAZIONATO: