Android'de WIFI Tethering'in (Hotspot) DHCP ayarlarını nasıl yapılandırabilirim?


27

Bilgisayarımı Android Wi-Fi ortak erişim noktasına bağlarken, bilgisayarıma bir 192.168.42.xadres atadı . İş alt ağlarımızdan biriyle çakıştığı için bunu gerçekten değiştirmem gerekiyor - bu mümkün mü?


2
Cep telefonum köklü. Gerekirse sistem dosyalarını değiştirmeyi umursamıyorum.
VVK

Tıpkı yukarıdaki büyük cevapların bazılarındaki nüanslara verilen yanıt gibi, benim uygulamamda 192.168.43.0/24 aralığı WiFi bağlantısı için atanan Android / satıcı varsayılanı ve 192.168.42.0/24 ise USB bağlantısı içindir.
Jim Klimov

Yanıtlar:


25

Ne yazık ki, yerleşik bağlama desteği için IP adres aralığını, hatta CyanogenMod'da bile değiştirmenin bir yolu yoktur. Wi-Fi etkin nokta IP'si android.net.wifi.WifiStateMachine.startTethering () içinde kodlanmıştır . USB bağlantısı IP'si com.android.server.connectivity.Tethering'de kodlanmıştır .

Bununla birlikte, telefonunuz köklü ise, IP adres aralığını değiştirme seçeneğine sahip olan birleşme için üçüncü taraf uygulamaları kullanmayı deneyebilirsiniz. Örneğin, yerleşik USB bağlantısı Samsung Galaxy W için CyanogenMod alfalarında bozulduğunda , bu seçeneğe sahip olan Kök Kullanıcıları için Kablolu Bağlantı'yı kullandım . Wi-Fi bağlantısı için , aynı adrese sahip olan ve aynı zamanda IP adres aralığını değiştirme seçeneği de bulunan Kök Kullanıcıları için Kablosuz Bağlantı uygulamasını deneyebilirsiniz .


Google Kodunun kapatıldığından yukarıdaki bağlantılar artık çalışmaz. Bazı insanlar kaynak kodunu bu depolardan GitHub'a aktardılar:

Ancak, başka bir geliştirme etkinliği olmadı ve uygulamalar artık son Android sürümlerinde çalışmaz.

Birisinin bu eski uygulamaları denemek istemesi durumunda, Google Kod Arşivi'nde bazı APK dosyalarını bulabildim :


Bilgi için +1. Cihazım köklü, ancak Kök Kullanıcıları için Kablosuz Bağlantı uygulaması mobil cihazımda çalışmıyor. Köklü telefondaki IP aralığını değiştirmenin bir yolu olmalı, C'Mon Man !, Android sonuçta açık bir işletim sistemi.
VVK

@VVK Bir yolu var. Sadece kaynağı tekrar derleyin.
Syakur Rahman

Bahsettiğiniz uygulamalar artık yok gibi görünüyor. Yayıncıların adını bildiğiniz için çevrimiçi olarak yeni sürümler bulabiliyor musunuz? Bazılarını buldum ama hiçbiri özgür değildi ...
pgr

@pgr Bazı çalışma bağlantıları bulundu, ancak daha yeni sürümler bulunamadı.
Sergey Vlasov

21

Android yerleşik wifi bağlantısı sunucu kullanarak 192.168.43.1/24 netd, kullanarak, bağlama işlemek için tasarlanmıştır dnsmasq. İlk DNS aralığı 192.168.42.1-254ve 2. DNS aralığı 192.168.43.1-254.

Netd'in değiştirilmesi kolay değildir. Onunla iletişim kurmak için bir soket gerektirir ve android bağlamaya başladığında bu soket alınır. Ancak Tethering.java(Froyo kullandım) kaynak dosyalarına göz atarken görüyoruz:

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

Ve daha sonra, BACKUPS AS olarak kullanılan bu aralıkları görüyoruz .

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

Dhcp aralıkları için ana kaynak, 42 ​​ve 43 kodlanmış kodları değildir, fakat array.config_tether_dhcp_range'den bir iç dizi dizisidir. Ancak şu anda boş.

Android çerçevesini düzenleyebilirsiniz. Benim telefonumda öyle /system/framework/framework-res.apk. Bir var tonluk öğreticiler tam tema basit dizeleri, çerçeve-res.apk düzenleme için çevrimiçi. Telefonunuz ve android versiyonunuz için bir tane bulun.

Değiştirmek istediğiniz ana şey /res/values/arrays.xml

Aramak <array name="config_tether_dhcp_range" />

Değişmek:

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

Gerektiği gibi derleyin / zip / sign (bir öğretici izleyin), sonra yeniden yükleyin.

Birden fazla aralık istiyorsanız, iki öğeyi tekrar tekrar kopyalayın. Her zaman her aralık için bir başlangıç ​​ve durdurma sağlamanız gerekir. Onu aynı / 24, yani 192.168.50.5 ve / 192.168.50.99veya her neyse tutmaya çalışın . busybox ps | grep dnsmasqÇalışmakta olduğunu onaylayabilirsiniz veya meşgul kutunuz yoksa, pidinizi ps dnsmasqkullanın cat /proc/pid/cmdline. Almalısınız (veya benzeri):

/ sistem / bin / dnsmasq - hayır - arka plan - hayır - anket - hayır - çözüm - dhcp aralığı = 192.168.50.5,192.168.50.99

FWIW, WIFI bağlantım varsayılan dnsmasqaralıkları kullanıyor , ancak bilgisayarım atandı 192.168.43.147/24ve ağ geçidi 192.168.43.1/24. Sizinki neden bir 42.xadrese varsayılan olduğundan emin değilim .


2
42 USBNET içindir 43 wifi içindir
Zibri

Güzel bul, nerede görüyorsun?
cde

1
Çünkü USB ile
bağlarsanız

5

Bunun eski bir yayın olduğunu biliyorum, ancak güncelleme sağlayabileceğimi düşündüm. Görünen o ki bazı Android üreticileri ve sürümleri artık WiFi sıcak nokta özelliğini kullanırken DHCP sunucusu için IP alt ağ aralığının UI üzerinden değiştirilmesine izin veriyor. İşte Android 6.0 çalıştıran bir HTC One M8'de nerede bulabilirim. YMMV.

Mobile Hotspot ekranından 3 nokta simgesine (daha fazlası) tıklayın, Gelişmiş'e gidin, sonra LAN ayarları. "Yerel IP" altında IP adresini istediğiniz IP olarak değiştirin. "Yerel DHCP" altında, başlangıç ​​IP adresini IP adresinizin alt ağına uyacak şekilde değiştirin.

Trent


Yeni HTC telefonlarda da bu seçeneğin olup olmadığını biliyor musunuz?
Arya

1

NOT: Kök gereklidir.

Varsayılan DHCP IP adres aralığı kodlanmış ( 1 ) , ROM'u değiştirilmiş kaynak koduyla yeniden oluşturmadan değiştiremezsiniz. Ya da küçük bir kesmek kullanın.

Bağlamayı açtığınızda, ne olur (en azından):

  • hostapd - erişim noktalarını yöneten arka plan programı - başlatıldı.
  • Ağ arayüzleri kurulur, IP adresi, Wi-Fi arabirimine eklenir (Android Pie önce kodlanmış ( 2 , 3 ) , daha sonra randomize ( 4 ) ) ve yönlendirme tablosu eklenir ( 5 ) yerel ağ için ( 6 ) .
  • dnsmasq- DHCP / DNS sunucusu (Pie'ye kadar) - kodlanmış komut satırı argümanları ( 7 ) ile başlatılır /etc/dnsmasq.conf ( başka şekilde ( 8 ) ile ayarlanabilir ).

Böylece /system/bin/dnsmasq, aradaki sürecin kontrolünü alarak özel bir kabuk betiği ile değiştirebiliriz . Orijinal ikili dosyayı başka bir şeyle yeniden adlandırın:

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

Komut dosyası oluştur /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 $*

Wi-Fi arayüzünüzün adını onaylayın ( wlan0genellikle). ip linkVeya ile kontrol edin ls /sys/class/net/.

Ayrıca yerel ağ yönlendirme tablosu olduğunu teyit 97: grep local_network /data/misc/net/rt_tables. Android'in yönlendirmesi her yeni sürümde daha karmaşık hale gelen bir karmaşa. Bu yüzden bunun kalıcı olup olmadığından emin değilim. Ayrıca, herhangi bir değişiklik yapmadan önce, kodunuza ne yazmanız gerektiğini bulmak için yönlendirme politikalarınızı ve tablolarınızı kontrol edin:

~# 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 kuralları ayrıca (tümü veya bazıları) önceden tanımlanmadıysa ve durum ise tanımlanmalıdır enforcing. Magisk’i suploicyveya benzeri bir başka araç kullanın 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 }

Yeniden doğmuş genelinde * kalıcı değildir, bazılarını kullanmak init.dsenaryoyu veya değiştirin /sepolicyiçinderamdisk

Dosyalarda izinleri ayarla:

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

Keyfini çıkarın!

Ya da kendi işlemlerinizi çalıştırarak komut satırından eksiksiz bir bağlantı kurabilirsiniz. Soru farklı olsa da bu cevap talimatları içeriyor.

İLGİLİ:

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.