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?
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?
Câu trả lời:
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 :
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 netd
xử lý việc kết nối, sử dụng dnsmasq
. Phạm vi DNS đầu tiên là 192.168.42.1-254
và 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.99
bất cứ điều gì. Bạn có thể xác nhận nó đang hoạt động với busybox ps | grep dnsmasq
hoặc nếu bạn không có busybox ps dnsmasq
thì 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 dnsmasq
phạm vi mặc định , nhưng máy tính của tôi đã được chỉ định 192.168.43.147/24
và 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ỉ.
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
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.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/dnsmasq
bằ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 ( wlan0
thường). Kiểm tra với ip link
hoặ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 suploicy
hoặ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.d
tập lệnh hoặc thay thế /sepolicy
trongramdisk
Đặ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: