NOTE : Une racine est nécessaire.
La plage d'adresses IP DHCP par défaut est codée en dur. ( 1 ) vous ne pouvez pas le changer sans reconstruire la ROM avec le code source modifié. Ou utiliser un petit hack.
Lorsque vous activez le tethering, ce qui se passe (au moins) :
-
hostapd
- le démon qui gère les points d'accès - est lancé.
- Les interfaces réseau sont configurées, l'adresse IP est ajoutée à l'interface Wi-Fi (codée en dur avant Android Pie). ( 2 , 3 ) randomisé après ( 4 ) ), et la table de routage est ajoutée ( 5 ) pour le réseau local.
-
dnsmasq
- le serveur DHCP/DNS (jusqu'à Pie) - est lancé avec des arguments de ligne de commande codés en dur ( 6 ) (qui peut être défini par le biais de /etc/dnsmasq.conf
( 7 ) autrement).
Nous pouvons donc remplacer /system/bin/dnsmasq
avec un script shell personnalisé, en prenant le contrôle du processus entre les deux. Renommez le binaire original en quelque chose d'autre :
~# mv /system/bin/dnsmasq /system/bin/dnsmasq.bin
Créer un 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
# 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 $*
Confirmez le nom de votre interface Wi-Fi ( wlan0
habituellement). Vérifiez avec 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}')
Confirmez également votre local_network
( 8 , 9 ) table de routage ( 97
) est utilisé pour le hotspot. Le routage d'Android est un désordre, devenant plus complexe avec chaque nouvelle version. Je ne suis donc pas sûr que cela ait été persistant ou non. Aussi, avant de faire des changements, vérifiez vos politiques et tables de routage pour savoir ce que vous devez mettre dans votre 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
Les règles SELinux doivent également être définies si (toutes ou certaines) ne sont pas déjà définies et si le statut est enforcing
. Utilisez la fonction suploicy
ou un autre outil similaire comme 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 }
* Les règles ne sont pas persistantes à travers les redémarrages, utilisez une certaine init.d
ou remplacer /sepolicy
en ramdisk
Définir les permissions sur les fichiers :
~# 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
Profitez-en !
Une autre option consiste à modifier la valeur de config_tether_dhcp_range
( 10 ) dans le cadre d'Android comme expliqué dans cette réponse mais je ne l'ai pas testé.
Ou vous pouvez configurer le tethering complet à partir de la ligne de commande, en exécutant vos propres processus. Cette réponse comprend les instructions, bien que la question soit différente.
RELATION :
0 votes
Cela répond-il à votre question ? Comment configurer les paramètres DHCP du WIFI Tethering (Hotspot) sur Android ?