Comment configurer les paramètres DHCP du partage de connexion WIFI (Hotspot) sur Android?

27

Lors de la connexion de mon PC au point d'accès Wi-Fi Android, il a attribué une 192.168.42.xadresse à mon PC. J'ai vraiment besoin de changer cela car il entre en conflit avec l'un de nos sous-réseaux de travail - est-ce possible?

VVK
la source
2
Mon mobile est enraciné. Cela ne me dérange pas de changer les fichiers système si nécessaire.
VVK
Tout comme la réponse aux nuances dans certaines des bonnes réponses ci-dessus, dans ma pratique, la plage 192.168.43.0/24 est par défaut Android / fournisseur attribuée pour le partage de connexion WiFi et 192.168.42.0/24 est pour le partage de connexion USB.
Jim Klimov

Réponses:

25

Malheureusement, il n'y a aucun moyen de modifier la plage d'adresses IP pour la prise en charge du partage de connexion intégré, même dans CyanogenMod. L'IP du hotspot Wi-Fi est codé en dur dans android.net.wifi.WifiStateMachine.startTethering () ; l'IP du partage de connexion USB est codé en dur dans com.android.server.connectivity.Tethering .

Cependant, si votre téléphone est enraciné, vous pouvez essayer d'utiliser des applications tierces pour le partage de connexion qui ont la possibilité de modifier la plage d'adresses IP. Par exemple, lorsque le partage de connexion USB intégré a été rompu dans CyanogenMod alphas pour Samsung Galaxy W, j'ai utilisé le câble câblé pour les utilisateurs root , qui a une telle option. Pour le partage de connexion Wi-Fi, vous pouvez essayer l'application Wireless Tether pour les utilisateurs racine des mêmes auteurs, qui a également la possibilité de modifier la plage d'adresses IP.


Étant donné que Google Code a été fermé, les liens ci-dessus ne fonctionnent plus. Certaines personnes ont exporté le code source de ces référentiels vers GitHub:

Cependant, il n'y a eu aucune activité de développement supplémentaire et les applications ne fonctionnent probablement plus sur les versions récentes d'Android.

Juste au cas où quelqu'un voudrait essayer ces applications obsolètes, j'ai pu trouver des fichiers APK dans Google Code Archive :

Sergey Vlasov
la source
+1 pour l'info. Mon appareil est enraciné, mais l'application Wireless Tether for Root Users ne fonctionne pas sur mon mobile. Il devrait y avoir un moyen de changer la plage IP sur le téléphone rooté, C'Mon Man !, Android est un système d'exploitation ouvert après tout.
VVK
@VVK Il y a un moyen. Recompilez simplement la source.
Syakur Rahman
Les applications que vous mentionnez semblent ne plus exister. Pouvez-vous trouver de nouvelles versions en ligne, puisque vous connaissez le nom des éditeurs? J'en ai trouvé d'autres, mais aucun n'était gratuit ...
pgr
@pgr Trouvé quelques liens de travail, mais pas de versions plus récentes.
Sergey Vlasov
21

Le partage de connexion wifi intégré à Android est conçu pour utiliser 192.168.43.1/24 comme serveur, avec la netdgestion du partage de connexion, à l'aide de dnsmasq. La première plage DNS est 192.168.42.1-254et et la deuxième plage DNS est 192.168.43.1-254.

Netd n'est pas facile à changer. Il nécessite une prise pour communiquer avec elle, et cette prise est prise lorsque Android commence à utiliser le modem. Mais en parcourant les fichiers source pour Tethering.java(j'ai utilisé Froyo), nous voyons:

// 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";

Et plus tard, nous voyons ces plages utilisées, COMME SAUVEGARDES .

    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 source principale des plages DHCP n'est pas les codes durs 42 et 43, mais lus à partir de array.config_tether_dhcp_range, un tableau de chaînes internes. Mais il est actuellement vide.

Vous pouvez modifier le cadre Android. Sur mon téléphone, ça l'est /system/framework/framework-res.apk. Il y a une tonne de tutoriels en ligne pour éditer framework-res.apk, des chaînes simples aux thèmes complets. Trouvez-en un pour votre téléphone et votre version Android.

La principale chose que vous voulez changer est la /res/values/arrays.xml

Chercher <array name="config_tether_dhcp_range" />

Changer pour:

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

compilez / zippez / signez au besoin (suivez un tutoriel), puis réinstallez.

Si vous voulez plus d'une plage, copiez simplement les deux éléments encore et encore. Vous devez toujours prévoir un départ et un arrêt pour chaque plage. Essayez de le garder dans le même / 24, c'est-à-dire 192.168.50.5 et 192.168.50.99ou autre chose. Vous pouvez confirmer qu'il fonctionne avec busybox ps | grep dnsmasqou si vous n'avez pas de boîte occupée, ps dnsmasqutilisez le pid in cat /proc/pid/cmdline. Vous devriez obtenir (ou similaire):

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

FWIW, mon partage de connexion WIFI utilise les dnsmasqplages par défaut , mais mon ordinateur a été affecté 192.168.43.147/24et une passerelle 192.168.43.1/24. Je ne sais pas pourquoi le vôtre a été transféré par défaut à une 42.xadresse.

cde
la source
2
42 est pour USBNET 43 est pour wifi
Zibri
belle trouvaille, où voyez-vous cela?
cde
1
Parce que si vous attachez par usb vous obtenez 42. Si vous attachez par wifi vous obtenez 43.
Zibri
5

Je sais que c'est un ancien message, mais j'ai pensé que je fournirais une mise à jour. Il semble que certains fabricants et versions d'Android autorisent désormais le changement de la plage de sous-réseaux IP pour le serveur DHCP via l'interface utilisateur lors de l'utilisation de la fonction de point d'accès WiFi. Voici où le trouver sur un HTC One M8 fonctionnant sous Android 6.0. YMMV.

Depuis l'écran Mobile Hotspot, cliquez sur l'icône 3 points (plus), accédez à Avancé, puis Paramètres LAN. Sous "IP locale", changez l'adresse IP en IP désirée. Sous "DHCP local", changez l'adresse IP de départ pour qu'elle corresponde au sous-réseau de votre adresse IP.

Trent

Trent
la source
Savez-vous si les nouveaux téléphones HTC ont également cette option?
Arya
1

REMARQUE: Root est requis.

La plage d'adresses IP DHCP par défaut est codée en dur ( 1 ) , vous ne pouvez pas la changer sans reconstruire la ROM avec un code source modifié. Ou utilisez un petit hack.

Lorsque vous activez le partage de connexion, que se passe-t-il (au moins):

  • hostapd - le démon qui gère les points d'accès - est démarré.
  • 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ée ensuite ( 4 ) ), et une table de routage est ajoutée ( 5 ) pour le réseau local ( 6 ) .
  • dnsmasq- le serveur DHCP / DNS (jusqu'à Pie) - est démarré avec des arguments de ligne de commande codés en dur ( 7 ) (qui peuvent être définis via /etc/dnsmasq.conf ( 8 ) sinon).

Nous pouvons donc remplacer /system/bin/dnsmasqpar un script shell personnalisé, en prenant le contrôle du processus entre les deux. Renommez le binaire d'origine en autre chose:

# 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='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 $*

Confirmez le nom de votre interface Wi-Fi ( wlan0généralement). Vérifiez avec ip linkou ls /sys/class/net/.

Assurez -vous également votre table locale de routage du réseau est 97: grep local_network /data/misc/net/rt_tables. Le routage d'Android est un gâchis, devenant plus complexe avec chaque nouvelle version. Je ne sais donc pas si cela a persisté ou non. Avant de faire des changements, vérifiez également vos politiques de routage et vos tableaux 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 (tout ou partie) ne sont pas déjà définies et si le statut l'est enforcing. Utilisez Magisk suploicyou 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 }

* Pas persistant entre les redémarrages, utilisez un init.dscript ou remplacer /sepolicydansramdisk

Définissez les autorisations sur les fichiers:

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

Prendre plaisir!

Ou vous pouvez configurer le partage de connexion 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.

EN RELATION:

Irfan Latif
la source