เมื่อเชื่อมต่อพีซีของฉันกับฮอตสปอต Android Wi-Fi มันกำหนดที่192.168.42.x
อยู่ให้กับพีซีของฉัน ฉันต้องการเปลี่ยนแปลงสิ่งนี้เนื่องจากขัดแย้งกับหนึ่งในเครือข่ายย่อยงานของเรา - เป็นไปได้หรือไม่
เมื่อเชื่อมต่อพีซีของฉันกับฮอตสปอต Android Wi-Fi มันกำหนดที่192.168.42.x
อยู่ให้กับพีซีของฉัน ฉันต้องการเปลี่ยนแปลงสิ่งนี้เนื่องจากขัดแย้งกับหนึ่งในเครือข่ายย่อยงานของเรา - เป็นไปได้หรือไม่
คำตอบ:
น่าเสียดายที่ไม่มีวิธีใดในการเปลี่ยนช่วงที่อยู่ IP สำหรับการสนับสนุนการแชร์อินเทอร์เน็ตในตัวแม้ใน CyanogenMod IP ฮอตสปอต Wi-Fi ถูกฮาร์ดโค้ดในandroid.net.wifi.WifiStateMachine.startTethering () ; สาย USB tethering IP จะ hardcoded ในcom.android.server.connectivity.Tethering
อย่างไรก็ตามหากโทรศัพท์ของคุณได้รับการรูทคุณสามารถลองใช้แอปของบุคคลที่สามในการปล่อยสัญญาณซึ่งมีตัวเลือกในการเปลี่ยนช่วงที่อยู่ IP เช่นเมื่อการแชร์อินเทอร์เน็ต USB ในตัวใน CyanogenMod alphas สำหรับ Samsung Galaxy W ฉันใช้Wired Tether สำหรับผู้ใช้รูทซึ่งมีตัวเลือกดังกล่าว สำหรับการปล่อยสัญญาณ Wi-Fi คุณสามารถลองใช้แอพWireless Tether สำหรับผู้ใช้รูทจากผู้เขียนคนเดียวกันซึ่งมีตัวเลือกในการเปลี่ยนช่วงที่อยู่ IP
เนื่องจาก Google Code ถูกปิดการทำงานลิงก์ข้างต้นจึงใช้งานไม่ได้อีกต่อไป บางคนส่งออกซอร์สโค้ดจากที่เก็บเหล่านั้นไปยัง GitHub:
อย่างไรก็ตามไม่มีกิจกรรมการพัฒนาเพิ่มเติมและแอพอาจไม่ทำงานบน Android เวอร์ชันล่าสุดอีกต่อไป
ในกรณีที่มีคนต้องการลองใช้แอปที่ล้าสมัยเหล่านั้นฉันสามารถค้นหาไฟล์ APK บางไฟล์ในGoogle Code Archive ได้ :
หุ่นยนต์เชื่อมต่ออินเทอร์เน็ตผ่าน Wi-Fi ในตัวถูกออกแบบมาเพื่อใช้ 192.168.43.1/24 เป็นเซิร์ฟเวอร์ที่มีการจัดการการเชื่อมต่ออินเทอร์เน็ตที่ใช้netd
dnsmasq
ช่วงแรกคือ DNS 192.168.42.1-254
และ DNS และช่วงที่ 2 192.168.43.1-254
คือ
Netd ไม่ใช่เรื่องง่ายที่จะเปลี่ยน มันต้องใช้ซ็อกเก็ตเพื่อสื่อสารกับมันและซ็อกเก็ตนั้นจะถูกใช้เมื่อ Android เริ่มทำการปล่อยสัญญาณ แต่จะผ่านไฟล์ต้นฉบับสำหรับTethering.java
(ฉันใช้ Froyo) เราเห็น:
// 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";
และต่อมาเมื่อเราเห็นช่วงที่ใช้, การสำรองข้อมูล
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 ไม่ใช่ hardcoded 42 และ 43 แต่อ่านจาก array.config_tether_dhcp_range ซึ่งเป็นอาร์เรย์สตริงภายใน แต่ตอนนี้มันว่างเปล่า
คุณสามารถแก้ไขกรอบของ android /system/framework/framework-res.apk
บนโทรศัพท์มือถือของฉันมันเป็น มีเป็นตันของบทเรียนออนไลน์สำหรับการแก้ไขกรอบ res.apk จากสตริงชุดรูปแบบที่ง่ายต่อการเต็มรูปแบบ ค้นหาหนึ่งรุ่นสำหรับโทรศัพท์และ Android ของคุณ
สิ่งสำคัญที่คุณต้องการเปลี่ยนคือ /res/values/arrays.xml
มองหา <array name="config_tether_dhcp_range" />
เปลี่ยนไป:
<string-array name="config_tether_dhcp_range">
<item>192.168.x.y</item>
<item>192.168.x.z</item>
</string-array>
รวบรวม / zip / sign ตามต้องการ (ทำตามบทช่วยสอน) จากนั้นติดตั้งใหม่
หากคุณต้องการมากกว่าหนึ่งช่วงให้คัดลอกสองรายการซ้ำไปซ้ำมา คุณจำเป็นต้องให้การเริ่มต้นและหยุดสำหรับแต่ละช่วง พยายามเก็บไว้ใน / 24 เหมือนกันคือ192.168.50.
5 และ192.168.50.99
อะไรก็ตาม คุณสามารถยืนยันว่ามันจะทำงานร่วมกับbusybox ps | grep dnsmasq
หรือถ้าคุณไม่ได้มี busybox ps dnsmasq
แล้วใช้ pid cat /proc/pid/cmdline
ใน คุณควรได้รับ (หรือคล้ายกัน):
/ system / bin / dnsmasq --no-daemon - no-poll -no-resolv --dhcp-range = 192.168.50.5,192.168.50.99,1h
FWIW, การเชื่อมต่ออินเทอร์เน็ตไร้สายของฉันใช้เริ่มต้นdnsmasq
ช่วงยังคอมพิวเตอร์ของฉันได้รับมอบหมายและเกตเวย์192.168.43.147/24
192.168.43.1/24
ไม่แน่ใจว่าทำไมคุณตั้งค่าเริ่มต้นเป็น42.x
ที่อยู่
ฉันรู้ว่านี่เป็นโพสต์เก่า แต่คิดว่าฉันจะให้การปรับปรุง ดูเหมือนว่าผู้ผลิตและรุ่นของ Android ในตอนนี้จะอนุญาตให้มีการเปลี่ยนแปลงช่วง IP ซับเน็ตสำหรับเซิร์ฟเวอร์ DHCP ผ่าน UI เมื่อใช้คุณสมบัติ WiFi hotspot ที่นี่จะหาได้จาก HTC One M8 ที่ใช้ Android 6.0 YMMV
จากหน้าจอ Mobile Hotspot ให้คลิกที่ไอคอน 3 จุด (เพิ่มเติม) ไปที่ขั้นสูงแล้วเลือกการตั้งค่า LAN ภายใต้ "Local IP" ให้เปลี่ยนที่อยู่ IP เป็น IP ที่คุณต้องการ ภายใต้ "Local DHCP" เปลี่ยน IP เริ่มต้นให้ตรงกับซับเน็ตของที่อยู่ IP ของคุณ
เทรนต์
หมายเหตุ:จำเป็นต้องใช้รูท
ช่วงที่อยู่ IP DHCP เริ่มต้นนั้นเป็นรหัสตายตัว( 1 )คุณไม่สามารถเปลี่ยนแปลงได้หากไม่มีการสร้าง ROM ใหม่ด้วยรหัสต้นฉบับที่ได้รับการแก้ไข หรือใช้แฮ็คเล็กน้อย
เมื่อคุณเปิดการแชร์อินเทอร์เน็ตจะเกิดอะไรขึ้น (อย่างน้อย):
hostapd
- daemon ซึ่งจัดการจุดเชื่อมต่อ - เริ่มต้นแล้วdnsmasq
- เซิร์ฟเวอร์ DHCP / DNS (สูงสุดถึงพาย) - เริ่มต้นด้วยอาร์กิวเมนต์บรรทัดคำสั่งฮาร์ดโค้ด( 7 ) (ซึ่งสามารถตั้งค่าผ่าน/etc/dnsmasq.conf
( 8 ) เป็นอย่างอื่น)ดังนั้นเราจึงสามารถแทนที่/system/bin/dnsmasq
ด้วยเชลล์สคริปต์ที่กำหนดเองโดยควบคุมกระบวนการระหว่างนั้น เปลี่ยนชื่อไบนารีเดิมเป็นอย่างอื่น:
# mv /system/bin/dnsmasq /system/bin/dnsmasq.bin
สร้างสคริปต์/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 ของคุณ ( wlan0
ปกติ) ตรวจสอบกับหรือip link
ls /sys/class/net/
นอกจากนี้ยังยืนยันตารางเครือข่ายเส้นทางท้องถิ่นของคุณคือ:97
grep local_network /data/misc/net/rt_tables
การกำหนดเส้นทางของ Android นั้นยุ่งเหยิงทำให้มีความซับซ้อนมากขึ้นในทุก ๆ รุ่นใหม่ ดังนั้นฉันไม่แน่ใจว่าสิ่งนี้จะขัดขืนหรือไม่ นอกจากนี้ก่อนทำการเปลี่ยนแปลงใด ๆ ให้ตรวจสอบนโยบายการกำหนดเส้นทางและตารางของคุณเพื่อหาว่าคุณควรใส่อะไรลงในสคริปต์ของคุณ:
~# 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 กฎยังจะต้องมีการกำหนดไว้ถ้า (บางส่วนหรือทั้งหมด) enforcing
ไม่ได้กำหนดไว้แล้วและถ้าสถานะเป็น ใช้ Magisk suploicy
หรือเครื่องมือที่คล้ายกันอื่น ๆ เช่น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 }
* ไม่ถาวรทั่วเรียบใช้บางinit.d
สคริปต์หรือเปลี่ยน/sepolicy
ในramdisk
ตั้งค่าการอนุญาตสำหรับไฟล์:
~# chown 0.0 /system/bin/dnsmasq*
~# chmod 0755 /system/bin/dnsmasq*
~# chcon u:object_r:dnsmasq_exec:s0 /system/bin/dnsmasq*
สนุก!
หรือคุณสามารถตั้งค่าการปล่อยสัญญาณทั้งหมดจาก commandline เพื่อเรียกใช้กระบวนการของคุณเอง คำตอบนี้รวมถึงคำแนะนำแม้ว่าคำถามจะแตกต่างกัน
ที่เกี่ยวข้อง: