Wie konfiguriere ich die DHCP-Einstellungen von WIFI Tethering (Hotspot) auf Android?

27

Wenn ich meinen PC mit einem Android Wi-Fi-Hotspot verbinde, wird 192.168.42.xmeinem PC eine Adresse zugewiesen . Ich muss das wirklich ändern, da es mit einem unserer Arbeitssubnetze in Konflikt steht - ist das möglich?

VVK
quelle
2
Mein Handy ist verwurzelt. Es macht mir nichts aus, Systemdateien bei Bedarf zu ändern.
VVK
Genau wie bei einigen der oben genannten guten Antworten auf Nuancen wird in meiner Praxis der Bereich 192.168.43.0/24 standardmäßig für Android / Vendor für WiFi-Tethering und 192.168.42.0/24 für USB-Tethering zugewiesen.
Jim Klimov

Antworten:

25

Leider kann der IP-Adressbereich für die integrierte Tethering-Unterstützung auch in CyanogenMod nicht geändert werden. Die Wi-Fi-Hotspot-IP ist in android.net.wifi.WifiStateMachine.startTethering () fest codiert . Die USB-Tethering-IP ist in com.android.server.connectivity.Tethering fest codiert .

Wenn Ihr Telefon jedoch gerootet ist, können Sie versuchen, Apps von Drittanbietern für das Tethering zu verwenden, bei denen der IP-Adressbereich geändert werden kann. ZB als das eingebaute USB-Tethering in CyanogenMod-Alphas für Samsung Galaxy W unterbrochen war, habe ich Kabelgebundenes Tethering für Root-Benutzer verwendet , das über eine solche Option verfügt. Für Wi-Fi-Tethering können Sie die App Wireless Tether for Root Users von denselben Autoren verwenden. Sie bietet auch die Möglichkeit, den IP-Adressbereich zu ändern.


Da Google Code heruntergefahren wurde, funktionieren die oben genannten Links nicht mehr. Einige Leute haben den Quellcode aus diesen Repositories nach GitHub exportiert:

Es gab jedoch keine weiteren Entwicklungsaktivitäten und die Apps funktionieren wahrscheinlich nicht mehr auf den neuesten Android-Versionen.

Nur für den Fall, dass jemand diese veralteten Apps ausprobieren möchte, habe ich im Google Code Archive einige APK-Dateien gefunden :

Sergey Vlasov
quelle
+1 für die Info. Mein Gerät ist gerootet, aber die App Wireless Tether für Root-Benutzer funktioniert auf meinem Handy nicht. Es sollte eine Möglichkeit geben, den IP-Bereich des verwurzelten Telefons C'Mon Man! Zu ändern. Android ist schließlich ein offenes Betriebssystem.
VVK
@VVK Es gibt einen Weg. Kompilieren Sie einfach die Quelle neu.
Syakur Rahman
Die von Ihnen erwähnten Apps scheinen nicht mehr zu existieren. Können Sie neue Versionen online finden, da Sie den Namen des Herausgebers kennen? Ich fand einige andere, aber keiner von ihnen war frei ...
pgr
@pgr Einige funktionierende Links gefunden, aber keine neueren Versionen.
Sergey Vlasov
21

Das in Android integrierte WLAN-Tethering verwendet 192.168.43.1/24 als Server, wobei netddas Tethering mithilfe von ausgeführt wird dnsmasq. Der erste DNS-Bereich ist 192.168.42.1-254und und der zweite DNS-Bereich ist 192.168.43.1-254.

Netd ist nicht leicht zu ändern. Es ist ein Socket erforderlich, um mit ihm zu kommunizieren. Dieser Socket wird verwendet, wenn Android mit dem Tethering beginnt. Aber Tethering.javawenn wir die Quelldateien für (ich habe Froyo verwendet) durchgehen, sehen wir:

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

Und später sehen wir diese Bereiche als 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;
    }

Die Hauptquelle für die DHCP-Bereiche ist nicht der fest codierte Wert 42 und 43, sondern der Wert array.config_tether_dhcp_range, ein internes String-Array. Aber es ist derzeit leer.

Sie könnten das Android-Framework bearbeiten. Auf meinem Handy ist es /system/framework/framework-res.apk. Es gibt eine Tonne von Online - Tutorials für die Bearbeitung von Rahmen-res.apk, von einfachen Strings voll Thematisierung. Finden Sie eine für Ihr Handy und Android-Version.

Hauptsache du willst das ändern /res/values/arrays.xml

Suchen <array name="config_tether_dhcp_range" />

Ändern:

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

kompiliere / zip / signiere nach Bedarf (folge einem Tutorial) und installiere es neu.

Wenn Sie mehr als einen Bereich wünschen, kopieren Sie einfach die beiden Elemente immer wieder. Sie müssen immer einen Start und einen Stopp für jeden Bereich angeben. Versuchen Sie, es in der gleichen / 24, dh 192.168.50.5 und 192.168.50.99was auch immer zu halten. Sie können bestätigen, dass es funktioniert, busybox ps | grep dnsmasqoder wenn Sie keine Busybox haben, verwenden Sie die PID ps dnsmasqin cat /proc/pid/cmdline. Sie sollten erhalten (oder ähnlich):

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

FWIW, mein WIFI-Tethering verwendet die Standardbereiche dnsmasq, aber mein Computer wurde zugewiesen 192.168.43.147/24und das Gateway 192.168.43.1/24. Ich weiß nicht, warum Sie standardmäßig eine 42.xAdresse angegeben haben.

cde
quelle
2
42 ist für USBNET 43 ist für WiFi
Zibri
schön zu finden, wo siehst du das?
cde
1
Denn wenn Sie per USB anbinden, erhalten Sie 42. Wenn Sie per WLAN
anbinden, erhalten
5

Ich weiß, dass dies ein alter Beitrag ist, dachte aber, ich würde ein Update bereitstellen. Es scheint, dass einige Hersteller und Versionen von Android jetzt die Änderung des IP-Subnetzbereichs für den DHCP-Server über die Benutzeroberfläche zulassen, wenn die WiFi-Hotspot-Funktion verwendet wird. Hier erfahren Sie, wo es auf einem HTC One M8 mit Android 6.0 zu finden ist. YMMV.

Klicken Sie im Bildschirm "Mobiler Hotspot" auf das 3-Punkte-Symbol (mehr), wählen Sie "Erweitert" und dann "LAN-Einstellungen". Ändern Sie unter "Lokale IP" die IP-Adresse auf Ihre gewünschte IP. Ändern Sie unter "Local DHCP" die Start-IP so, dass sie mit dem Subnetz Ihrer IP-Adresse übereinstimmt.

Trent

Trent
quelle
Wissen Sie, ob neue HTC-Telefone diese Option auch haben?
Arya
1

HINWEIS: Root ist erforderlich.

Der standardmäßige DHCP-IP-Adressbereich ist fest codiert ( 1 ) . Sie können ihn nicht ändern, ohne das ROM mit geändertem Quellcode neu zu erstellen. Oder benutze einen kleinen Hack.

Wenn Sie das Tethering einschalten, was passiert (zumindest):

  • hostapd - Der Daemon, der die Access Points verwaltet - wird gestartet.
  • Netzwerkschnittstellen werden eingerichtet, die IP-Adresse wird der Wi-Fi-Schnittstelle hinzugefügt (vor Android Pie fest codiert ( 2 , 3 ) , anschließend nach dem Zufallsprinzip sortiert ( 4 ) ) und für das lokale Netzwerk wird eine Routing-Tabelle hinzugefügt ( 5 ) ( 6 ) .
  • dnsmasq- Der DHCP / DNS-Server (bis zu Pie) - wird mit fest codierten Befehlszeilenargumenten ( 7 ) gestartet (die ansonsten über /etc/dnsmasq.conf ( 8 ) festgelegt werden können).

So können wir durch /system/bin/dnsmasqein benutzerdefiniertes Shell-Skript ersetzen , das die Kontrolle über den Prozess zwischenzeitlich übernimmt. Benennen Sie die ursprüngliche Binärdatei in etwas anderes um:

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

Skript erstellen /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 $*

Bestätigen Sie den Namen Ihrer Wi-Fi-Schnittstelle ( wlan0normalerweise). Überprüfen Sie mit ip linkoder ls /sys/class/net/.

Bestätigen Sie auch Ihre lokale Netzwerk - Routing - Tabelle ist 97: grep local_network /data/misc/net/rt_tables. Das Routing von Android ist ein Chaos, das mit jeder neuen Version komplexer wird. Ich bin mir also nicht sicher, ob dies beständig war oder nicht. Bevor Sie Änderungen vornehmen, überprüfen Sie Ihre Routing-Richtlinien und -Tabellen, um herauszufinden, was Sie in Ihr Skript einfügen sollten:

~# 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

SELinux-Regeln müssen auch definiert werden, wenn (alle oder einige) noch nicht definiert sind und der Status lautet enforcing. Verwenden Sie Magisk suploicyoder ein ähnliches Tool wie 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 }

* Nicht persistent über Neustarts verwenden einige init.dSkript oder ersetzen /sepolicyinramdisk

Festlegen von Berechtigungen für Dateien:

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

Genießen!

Sie können das vollständige Tethering auch über die Befehlszeile einrichten und Ihre eigenen Prozesse ausführen. Diese Antwort enthält die Anweisungen, obwohl die Frage anders ist.

VERBUNDEN:

Irfan Latif
quelle