Làm cách nào để định cấu hình cài đặt DHCP của WIFI Tethering (Hotspot) trên Android?


27

Khi kết nối PC của tôi với điểm phát sóng Wi-Fi Android, nó đã gán một 192.168.42.xđịa chỉ cho PC của tôi. Tôi thực sự cần phải thay đổi điều này vì nó mâu thuẫn với một trong các mạng con công việc của chúng tôi - điều này có thể không?


2
Điện thoại di động của tôi đã được root. Tôi không ngại thay đổi tập tin hệ thống nếu cần thiết.
VVK

Cũng giống như phản ứng với các sắc thái trong một số câu trả lời tuyệt vời ở trên, trong thực tế của tôi, phạm vi 192.168.43.0/24 là do Android / nhà cung cấp mặc định được gán cho kết nối WiFi và 192.168.42.0/24 dành cho kết nối USB.
Jim Klimov

Câu trả lời:


25

Thật không may, không có cách nào để thay đổi phạm vi địa chỉ IP cho hỗ trợ chia sẻ kết nối, ngay cả trong CyanogenMod. IP hotspot Wi-Fi được mã hóa cứng trong android.net.wifi.WifiStateMachine.startTethering () ; IP tethering USB được mã hóa cứng trong com.android.server.connectivity.Tethering .

Tuy nhiên, nếu điện thoại của bạn đã được root, bạn có thể thử sử dụng các ứng dụng của bên thứ ba để chia sẻ, có tùy chọn thay đổi dải địa chỉ IP. Ví dụ: khi tính năng chia sẻ kết nối USB tích hợp bị hỏng trong bảng chữ cái CyanogenMod cho Samsung Galaxy W, tôi đã sử dụng Wired Tether cho Người dùng Root , có tùy chọn như vậy. Để kết nối Wi-Fi, bạn có thể dùng thử ứng dụng Tether không dây cho người dùng gốc từ cùng các tác giả, cũng có tùy chọn thay đổi dải địa chỉ IP.


Vì Google Code đã ngừng hoạt động, các liên kết trên không còn hoạt động. Một số người đã xuất mã nguồn từ các kho lưu trữ đó sang GitHub:

Tuy nhiên, không có hoạt động phát triển nào nữa và các ứng dụng có thể không còn hoạt động trên các phiên bản Android gần đây.

Chỉ trong trường hợp ai đó muốn dùng thử những ứng dụng lỗi thời đó, tôi đã có thể tìm thấy một số tệp APK trong Lưu trữ Google Code :


+1 cho thông tin. Thiết bị của tôi đã được root, nhưng ứng dụng Wireless Tether cho Root Users không hoạt động trên điện thoại di động của tôi. Cần có một số cách để thay đổi dải IP trên điện thoại đã được root, C'Mon Man!, Android là một hệ điều hành mở.
VVK

@VVK Có một cách. Chỉ cần biên dịch lại nguồn.
Syakur Rahman

Các ứng dụng bạn đề cập dường như không còn tồn tại. Bạn có thể tìm thấy bất kỳ phiên bản mới trực tuyến nào không, vì bạn biết tên của các nhà xuất bản? Tôi đã tìm thấy một số người khác, nhưng không ai trong số họ miễn phí ...
pgr

@pgr Tìm thấy một số liên kết làm việc, nhưng không có phiên bản mới hơn.
Serge Vlasov

21

Tethering wifi tích hợp Android được thiết kế để sử dụng 192.168.43.1/24 làm máy chủ, với việc netdxử lý việc kết nối, sử dụng dnsmasq. Phạm vi DNS đầu tiên là 192.168.42.1-254và phạm vi DNS thứ hai là 192.168.43.1-254.

Netd không dễ thay đổi. Nó đòi hỏi một ổ cắm để giao tiếp với nó và ổ cắm đó được lấy khi Android bắt đầu kết nối. Nhưng đi qua các tệp nguồn cho Tethering.java(tôi đã sử dụng Froyo), chúng ta thấy:

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

Và sau này chúng ta thấy những phạm vi được sử dụng, NHƯ SAU .

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

Nguồn chính cho các phạm vi dhcp không phải là mã hóa cứng 42 và 43, nhưng đọc từ mảng.config_tether_dhcp_range, một mảng chuỗi bên trong. Nhưng nó hiện đang trống.

Bạn có thể chỉnh sửa khung Android. Trên điện thoại của tôi, nó là /system/framework/framework-res.apk. Có một tấn của hướng dẫn trực tuyến để chỉnh sửa khuôn khổ-res.apk, từ chuỗi đơn giản để theming đầy đủ. Tìm một cho điện thoại và phiên bản Android của bạn.

Điều chính bạn muốn thay đổi là /res/values/arrays.xml

Tìm kiếm <array name="config_tether_dhcp_range" />

Thay đổi thành:

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

biên dịch / zip / ký khi cần thiết (làm theo hướng dẫn), sau đó cài đặt lại.

Nếu bạn muốn nhiều hơn một phạm vi, chỉ cần sao chép hai mục nhiều lần. Bạn luôn cần cung cấp một điểm bắt đầu và điểm dừng cho mỗi phạm vi. Cố gắng giữ nó ở cùng / 24, tức là 192.168.50.5 và 192.168.50.99bất cứ điều gì. Bạn có thể xác nhận nó đang hoạt động với busybox ps | grep dnsmasqhoặc nếu bạn không có busybox ps dnsmasqthì hãy sử dụng pid in cat /proc/pid/cmdline. Bạn sẽ nhận được (hoặc tương tự):

/ system / bin / dnsmasq --no-daemon --no-poll -no-decv --dhcp-Range = 192.168.50.5,192.168.50.99,1h

FWIW, tính năng chia sẻ WIFI của tôi sử dụng các dnsmasqphạm vi mặc định , nhưng máy tính của tôi đã được chỉ định 192.168.43.147/24và cổng 192.168.43.1/24. Không chắc chắn lý do tại sao bạn mặc định một 42.xđịa chỉ.


2
42 dành cho USBNET 43 dành cho wifi
Zibri

Tìm thấy tốt đẹp, bạn thấy ở đâu?
cde

1
Bởi vì nếu bạn kết nối bằng usb, bạn sẽ nhận được 42. Nếu bạn kết nối bằng wifi, bạn sẽ nhận được 43.
Zibri

5

Tôi biết đây là một bài viết cũ, nhưng nghĩ rằng tôi sẽ cung cấp một bản cập nhật. Hiện tại, có vẻ như một số nhà sản xuất và phiên bản Android cho phép thay đổi phạm vi mạng con IP cho máy chủ DHCP thông qua giao diện người dùng khi sử dụng tính năng WiFi hotspot. Đây là nơi để tìm thấy nó trên HTC One M8 chạy Android 6.0. YMMV.

Từ màn hình Hotspot di động, nhấp vào biểu tượng 3 chấm (thêm), đi đến Nâng cao, sau đó cài đặt LAN. Trong "IP cục bộ" thay đổi địa chỉ IP thành IP mong muốn của bạn. Trong "DHCP cục bộ" thay đổi IP bắt đầu để khớp với mạng con của địa chỉ IP của bạn.

Trent


Bạn có biết điện thoại HTC mới cũng có tùy chọn này không?
Arya

1

LƯU Ý: Cần có root.

Phạm vi địa chỉ IP DHCP mặc định được mã hóa cứng ( 1 ) , bạn không thể thay đổi nó mà không cần xây dựng lại ROM với mã nguồn được sửa đổi. Hoặc sử dụng một chút hack.

Khi bạn bật tính năng chia sẻ kết nối, điều gì sẽ xảy ra (ít nhất):

  • hostapd - trình nền quản lý các điểm truy cập - được bắt đầu.
  • Giao diện mạng được thiết lập, địa chỉ IP được thêm vào giao diện Wi-Fi (được mã hóa cứng trước Android Pie ( 2 , 3 ) , ngẫu nhiên sau đó ( 4 ) ) và bảng định tuyến được thêm ( 5 ) cho mạng cục bộ ( 6 ) .
  • dnsmasq- máy chủ DHCP / DNS (tối đa Pie) - được bắt đầu với các đối số dòng lệnh được mã hóa cứng ( 7 ) (có thể được đặt qua /etc/dnsmasq.conf ( 8 ) nếu không).

Vì vậy, chúng ta có thể thay thế /system/bin/dnsmasqbằng một tập lệnh shell tùy chỉnh, kiểm soát quá trình ở giữa. Đổi tên nhị phân ban đầu thành một cái khác:

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

Tạo tập lệnh /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 $*

Xác nhận tên của giao diện Wi-Fi của bạn ( wlan0thường). Kiểm tra với ip linkhoặc ls /sys/class/net/.

Cũng xác nhận bảng định tuyến mạng cục bộ của bạn là 97: grep local_network /data/misc/net/rt_tables. Định tuyến của Android là một mớ hỗn độn, trở nên phức tạp hơn với mỗi bản phát hành mới. Vì vậy, tôi không chắc chắn nếu điều này đã được kiên trì hay không. Ngoài ra trước khi thực hiện bất kỳ thay đổi nào, hãy kiểm tra các chính sách và bảng định tuyến của bạn để tìm ra những gì bạn nên đặt trong tập lệnh của mình:

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

Các quy tắc SELinux cũng cần được xác định nếu (tất cả hoặc một số) chưa được xác định và nếu trạng thái là enforcing. Sử dụng Magisk's suploicyhoặc một số công cụ tương tự khác như 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 }

* không liên tục trong quá trình khởi động lại, sử dụng một số init.dtập lệnh hoặc thay thế /sepolicytrongramdisk

Đặt quyền trên tệp:

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

Thưởng thức!

Hoặc bạn có thể thiết lập kết nối hoàn chỉnh từ dòng lệnh, chạy các quy trình của riêng bạn. Câu trả lời này bao gồm các hướng dẫn, mặc dù câu hỏi là khác nhau.

LIÊN QUAN:

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.