Jak skonfigurować ustawienia DHCP usługi Tethering WIFI (Hotspot) na Androidzie?

27

Podczas podłączania komputera do hotspotu Wi-Fi w Androidzie, przypisano mu 192.168.42.xadres do mojego komputera. Naprawdę muszę to zmienić, ponieważ powoduje to konflikt z jedną z naszych podsieci roboczych - czy to możliwe?

VVK
źródło
2
Mój telefon jest zrootowany. Nie przeszkadza mi zmienianie plików systemowych w razie potrzeby.
VVK
Podobnie jak odpowiedź na niuanse w niektórych z powyższych świetnych odpowiedzi, w mojej praktyce zakres 192.168.43.0/24 jest domyślnie przypisany Androidowi / dostawcy do modemu Wi-Fi, a 192.168.42.0/24 do modemu USB.
Jim Klimov

Odpowiedzi:

25

Niestety nie ma możliwości zmiany zakresu adresów IP dla wbudowanej obsługi modemu, nawet w CyanogenMod. Adres IP hotspotu Wi-Fi jest zakodowany na stałe w android.net.wifi.WifiStateMachine.startTethering () ; adres IP tetheringu przez USB jest zakodowany na stałe w com.android.server.connectivity.Tethering .

Jeśli jednak telefon jest zrootowany, możesz spróbować użyć aplikacji innych firm do tetheringu, które mają opcję zmiany zakresu adresów IP. Na przykład, kiedy wbudowane tethering USB został zerwany w CyanogenMod alfa dla Samsunga Galaxy W, użyłem Wired Tether dla użytkowników root , który ma taką opcję. W przypadku modemu Wi-Fi możesz wypróbować aplikację Wireless Tether for Root Users od tych samych autorów, która ma również opcję zmiany zakresu adresów IP.


Ponieważ kod Google został zamknięty, powyższe linki już nie działają. Niektóre osoby wyeksportowały kod źródłowy z tych repozytoriów do GitHub:

Jednak nie było dalszych działań programistycznych, a aplikacje prawdopodobnie nie działają już w najnowszych wersjach Androida.

Na wypadek, gdyby ktoś chciał wypróbować te przestarzałe aplikacje, udało mi się znaleźć niektóre pliki APK w Archiwum Google Code :

Siergiej Własow
źródło
+1 za informację. Moje urządzenie jest zrootowane, ale aplikacja Wireless Tether dla użytkowników root nie działa na moim telefonie komórkowym. Powinien istnieć sposób na zmianę zakresu adresów IP w zrootowanym telefonie, C'Mon Man !, Android to w końcu otwarty system operacyjny.
VVK
@VVK Istnieje sposób. Po prostu ponownie skompiluj źródło.
Syakur Rahman
Wspomniane aplikacje wydają się już nie istnieć. Czy możesz znaleźć jakieś nowe wersje online, skoro znasz nazwisko wydawców? Znalazłem kilka innych, ale żaden z nich nie był darmowy ...
str.
@pgr Znaleziono kilka działających linków, ale nie ma nowszych wersji.
Sergey Vlasov
21

Wbudowane tethering Wi-Fi w Androidzie został zaprojektowany tak, aby używać 192.168.43.1/24 jako serwera, z netdobsługą tetheringu dnsmasq. Pierwszy zakres DNS to 192.168.42.1-254i drugi zakres DNS to 192.168.43.1-254.

Netd nie jest łatwy do zmiany. Wymaga gniazda, aby się z nim komunikować, i to gniazdo jest pobierane, gdy Android zaczyna tethering. Ale przeglądając pliki źródłowe dla Tethering.java(użyłem Froyo) widzimy:

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

Później widzimy używane zakresy, JAKO BACKUP .

    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;
    }

Głównym źródłem zakresów dhcp nie są zapisane na stałe 42 i 43, ale odczytane z array.config_tether_dhcp_range, wewnętrznej tablicy ciągów. Ale obecnie jest pusty.

Możesz edytować system Android. Tak jest na moim telefonie /system/framework/framework-res.apk. Istnieje mnóstwo samouczków online do edycji framework-res.apk, od prostych ciągów po pełne motywy. Znajdź jedną dla swojego telefonu i wersji na Androida.

Najważniejsze, co chcesz zmienić, to /res/values/arrays.xml

Szukać <array name="config_tether_dhcp_range" />

Zmień na:

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

w razie potrzeby skompiluj / zip / sign (postępuj zgodnie z samouczkiem), a następnie zainstaluj ponownie.

Jeśli chcesz mieć więcej niż jeden zakres, po prostu skopiuj dwa elementy w kółko. Zawsze musisz zapewnić start i stop dla każdego zakresu. Postaraj się zachować to w tym samym / 24, tj. 192.168.50.5 i tym podobne 192.168.50.99. Możesz potwierdzić, że działa busybox ps | grep dnsmasqlub jeśli nie masz busyboksa, ps dnsmasqużyj pid w cat /proc/pid/cmdline. Powinieneś otrzymać (lub podobny):

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

FWIW, moje tethering WIFI używa domyślnych dnsmasqzakresów, ale mój komputer został przypisany 192.168.43.147/24i brama 192.168.43.1/24. Nie jestem pewien, dlaczego domyślnie ustawiony jest 42.xadres.

cde
źródło
2
42 jest dla USBNET 43 jest dla wifi
Zibri
fajne znalezisko, gdzie to widzisz?
cde
1
Bo jeśli tetherujesz przez usb, dostajesz 42. Jeśli
tetherujesz
5

Wiem, że to stary post, ale pomyślałem, że dostarczy aktualizację. Wygląda na to, że niektórzy producenci i wersje Androida teraz pozwalają na zmianę zakresu podsieci IP dla serwera DHCP przez interfejs użytkownika podczas korzystania z funkcji hotspotu WiFi. Oto, jak go znaleźć na telefonie HTC One M8 z systemem Android 6.0. YMMV.

Na ekranie mobilnego punktu aktywnego kliknij ikonę 3 kropek (więcej), przejdź do Zaawansowane, a następnie Ustawienia sieci LAN. W obszarze „Lokalny adres IP” zmień adres IP na żądany adres IP. W obszarze „Lokalny DHCP” zmień początkowy adres IP, tak aby pasował do podsieci twojego adresu IP.

Trent

Trent
źródło
Czy wiesz, czy nowe telefony HTC również mają tę opcję?
Arya
1

UWAGA: root jest wymagany.

Domyślny zakres adresów IP DHCP jest zakodowany na stałe ( 1 ) , nie można go zmienić bez odbudowy pamięci ROM ze zmodyfikowanym kodem źródłowym. Lub użyj małego hacka.

Gdy włączysz tethering, co się stanie (przynajmniej):

  • hostapd - uruchamiany jest demon zarządzający punktami dostępu.
  • Konfigurowane są interfejsy sieciowe, adres IP jest dodawany do interfejsu Wi-Fi (zakodowany na stałe przed Android Pie ( 2 , 3 ) , później losowo ( 4 ) ) i dodawana jest tabela routingu ( 5 ) dla sieci lokalnej ( 6 ) .
  • dnsmasq- serwer DHCP / DNS (do Pie) - uruchamiany jest z zakodowanymi argumentami wiersza poleceń ( 7 ) (które można ustawić za pomocą /etc/dnsmasq.conf ( 8 ) w przeciwnym razie).

Możemy więc zastąpić /system/bin/dnsmasqniestandardowym skryptem powłoki, przejmując kontrolę nad procesem pomiędzy nimi. Zmień nazwę oryginalnego pliku binarnego na coś innego:

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

Utwórz skrypt /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 $*

Potwierdź nazwę interfejsu Wi-Fi ( wlan0zwykle). Sprawdź za pomocą ip linklub ls /sys/class/net/.

Również potwierdzić swoją sieć lokalna tabela routingu jest 97: grep local_network /data/misc/net/rt_tables. Rutowanie w Androidzie to bałagan, który staje się coraz bardziej skomplikowany z każdą nową wersją. Więc nie jestem pewien, czy to było trwałe, czy nie. Przed wprowadzeniem jakichkolwiek zmian sprawdź zasady i tabele routingu, aby dowiedzieć się, co powinieneś umieścić w skrypcie:

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

Reguły SELinuksa również muszą zostać zdefiniowane, jeśli (wszystkie lub niektóre) nie są jeszcze zdefiniowane i jeśli status ma wartość enforcing. Użyj narzędzia Magisk suploicylub innego podobnego narzędzia, takiego jak 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 }

* Nie trwała podczas ponownego uruchamiania, należy użyć jakiś init.dskrypt lub wymienić /sepolicywramdisk

Ustaw uprawnienia do plików:

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

Cieszyć się!

Lub możesz skonfigurować pełne tethering z wiersza poleceń, uruchamiając własne procesy. Ta odpowiedź zawiera instrukcje, choć pytanie jest inne.

ZWIĄZANE Z:

Irfan Latif
źródło