Bagaimana mengonfigurasi pengaturan DHCP dari Tethering WIFI (Hotspot) di Android?

27

Saat menghubungkan PC saya ke hotspot Wi-Fi Android, itu menetapkan 192.168.42.xalamat ke PC saya. Saya benar-benar perlu mengubah ini karena bertentangan dengan salah satu subnet kerja kami - apakah ini mungkin?

VVK
sumber
2
Ponsel saya sudah di-root. Saya tidak keberatan mengubah file sistem jika diperlukan.
VVK
Sama seperti respons terhadap nuansa dalam beberapa jawaban hebat di atas, dalam praktik saya kisaran 192.168.43.0/24 adalah dari standar Android / vendor yang ditetapkan untuk tethering WiFi dan 192.168.42.0/24 untuk tethering USB.
Jim Klimov

Jawaban:

25

Sayangnya, tidak ada cara untuk mengubah kisaran alamat IP untuk dukungan tethering bawaan, bahkan di CyanogenMod. IP hotspot Wi-Fi hardcoded di android.net.wifi.WifiStateMachine.startTethering () ; USB tethering IP di-hardcode dalam com.android.server.connectivity.Tethering .

Namun, jika ponsel Anda di-rooting, Anda dapat mencoba menggunakan aplikasi pihak ketiga untuk penarikan yang memiliki opsi untuk mengubah rentang alamat IP. Misalnya, ketika tethering USB bawaan rusak di alfa CyanogenMod untuk Samsung Galaxy W, saya menggunakan Wired Tether untuk Pengguna Root , yang memiliki opsi tersebut. Untuk tethering Wi-Fi Anda dapat mencoba aplikasi Wireless Tether for Root Users dari penulis yang sama, yang juga memiliki opsi untuk mengubah kisaran alamat IP.


Karena Google Code dimatikan, tautan di atas tidak lagi berfungsi. Beberapa orang mengekspor kode sumber dari repositori tersebut ke GitHub:

Namun, tidak ada aktivitas pengembangan lebih lanjut, dan aplikasi mungkin tidak lagi berfungsi pada versi Android terbaru.

Untuk berjaga-jaga jika seseorang ingin mencoba aplikasi yang sudah usang itu, saya dapat menemukan beberapa file APK di Google Code Archive :

Sergey Vlasov
sumber
+1 untuk info. Perangkat saya sudah di-root, tetapi aplikasi Wireless Tether for Root Users tidak berfungsi di ponsel saya. Seharusnya ada beberapa cara untuk mengubah rentang IP pada ponsel yang di-root, C'Mon Man !, lagipula Android adalah OS terbuka.
VVK
@VVK Ada caranya. Kompilasi ulang sumbernya.
Syakur Rahman
Aplikasi yang Anda sebutkan tampaknya tidak ada lagi. Dapatkah Anda menemukan versi baru daring, karena Anda tahu nama penerbit? Saya menemukan beberapa yang lain, tetapi tidak ada yang gratis ...
hal
@ pgr Menemukan beberapa tautan yang berfungsi, tetapi tidak ada versi yang lebih baru.
Sergey Vlasov
21

Android builtin wifi tethering dirancang untuk menggunakan 192.168.43.1/24 sebagai server, dengan netdmenangani tethering, menggunakan dnsmasq. Rentang DNS pertama adalah 192.168.42.1-254dan dan rentang DNS kedua adalah 192.168.43.1-254.

Netd tidak mudah diubah. Ini membutuhkan soket untuk berkomunikasi dengannya, dan soket itu diambil ketika Android mulai menambatkan. Tetapi melalui file sumber untuk Tethering.java(saya menggunakan Froyo) kita melihat:

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

Dan nanti kita melihat rentang yang digunakan, SEBAGAI 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;
    }

Sumber utama untuk rentang dhcp bukan hardcoded 42 dan 43, tetapi baca dari array.config_tether_dhcp_range, array string internal. Tetapi saat ini kosong.

Anda dapat mengedit kerangka kerja android. Di ponsel saya, itu /system/framework/framework-res.apk. Ada banyak tutorial online untuk mengedit framework-res.apk, dari string sederhana hingga tema penuh. Temukan satu untuk ponsel Anda dan versi android.

Hal utama yang ingin Anda ubah adalah /res/values/arrays.xml

Mencari <array name="config_tether_dhcp_range" />

Mengubah:

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

kompilasi / zip / tandatangani sesuai kebutuhan (ikuti tutorial), lalu instal ulang.

Jika Anda ingin lebih dari satu rentang, cukup salin dua item berulang-ulang. Anda selalu perlu memberikan awal dan berhenti untuk setiap rentang. Usahakan untuk tetap di / 24 yang sama, yaitu 192.168.50.5 dan 192.168.50.99atau apa pun. Anda dapat mengonfirmasi bahwa itu berfungsi baik busybox ps | grep dnsmasqatau jika Anda tidak memiliki busybox ps dnsmasqmaka gunakan pid di cat /proc/pid/cmdline. Anda harus mendapatkan (atau serupa):

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

FWIW, tethering WIFI saya menggunakan dnsmasqrentang default , namun komputer saya ditugaskan 192.168.43.147/24dan gateway 192.168.43.1/24. Tidak yakin mengapa alamat Anda default ke 42.xalamat.

cde
sumber
2
42 untuk USBNET 43 untuk wifi
Zibri
Temuan yang bagus, di mana Anda melihat itu?
cde
1
Karena jika Anda menambatkan dengan usb Anda mendapatkan 42. Jika Anda menambatkan dengan wifi Anda mendapatkan 43.
Zibri
5

Saya tahu ini adalah posting lama, tetapi saya pikir saya akan memberikan pembaruan. Tampaknya beberapa produsen dan versi Android sekarang DO memungkinkan untuk perubahan rentang subnet IP untuk server DHCP melalui UI saat menggunakan fitur hotspot WiFi. Di sinilah tempat menemukannya pada HTC One M8 yang menjalankan Android 6.0. YMMV.

Dari layar Hotspot Seluler, klik ikon 3 titik (selengkapnya), pergi ke Tingkat Lanjut, lalu pengaturan LAN. Di bawah "IP Lokal", ubah alamat IP ke IP yang Anda inginkan. Di bawah "DHCP Lokal" ubah IP awal agar cocok dengan subnet alamat IP Anda.

Trent

Trent
sumber
Apakah Anda tahu jika ponsel HTC baru juga memiliki opsi ini?
Arya
1

CATATAN: Diperlukan root.

Rentang alamat DHCP DHCP adalah hard-coded ( 1 ) , Anda tidak dapat mengubahnya tanpa membangun kembali ROM dengan kode sumber yang dimodifikasi. Atau gunakan sedikit retasan.

Ketika Anda mengaktifkan tethering, apa yang terjadi (setidaknya):

  • hostapd - daemon yang mengelola titik akses - dimulai.
  • Antarmuka jaringan diatur, alamat IP ditambahkan ke antarmuka Wi-Fi (kode-keras sebelum Android Pie ( 2 , 3 ) , acak setelahnya ( 4 ) ), dan tabel routing ditambahkan ( 5 ) untuk jaringan lokal ( 6 ) .
  • dnsmasq- DHCP / DNS server (hingga Pie) - dimulai dengan argumen baris perintah yang dikodekan dengan keras ( 7 ) (yang dapat diatur melalui /etc/dnsmasq.conf ( 8 ) jika tidak).

Jadi kita bisa mengganti /system/bin/dnsmasqdengan skrip shell khusus, mengendalikan proses di antaranya. Ganti nama biner asli dengan yang lain:

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

Buat skrip /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 $*

Konfirmasikan nama antarmuka Wi-Fi Anda ( wlan0biasanya). Periksa dengan ip linkatau ls /sys/class/net/.

Juga pastikan tabel routing jaringan lokal Anda adalah 97: grep local_network /data/misc/net/rt_tables. Perutean Android berantakan, semakin kompleks dengan setiap rilis baru. Jadi saya tidak yakin apakah ini persisten atau tidak. Juga sebelum melakukan perubahan, periksa kebijakan perutean dan tabel untuk mencari tahu apa yang harus Anda masukkan ke dalam skrip Anda:

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

Aturan SELinux juga perlu didefinisikan jika (semua atau beberapa) belum ditetapkan dan jika statusnya enforcing. Gunakan Magisk suploicyatau alat serupa lainnya seperti 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 }

* Tidak terus-menerus di reboot, menggunakan beberapa init.dnaskah atau mengganti /sepolicydiramdisk

Tetapkan izin pada file:

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

Nikmati!

Atau Anda dapat mengatur tethering lengkap dari commandline, menjalankan proses Anda sendiri. Jawaban ini mencakup instruksi, meskipun pertanyaannya berbeda.

TERKAIT:

Irfan Latif
sumber