กำหนดค่าการตั้งค่า DHCP ของ WiFi Tethering (Hotspot) บน Android อย่างไร


27

เมื่อเชื่อมต่อพีซีของฉันกับฮอตสปอต Android Wi-Fi มันกำหนดที่192.168.42.xอยู่ให้กับพีซีของฉัน ฉันต้องการเปลี่ยนแปลงสิ่งนี้เนื่องจากขัดแย้งกับหนึ่งในเครือข่ายย่อยงานของเรา - เป็นไปได้หรือไม่


2
มือถือของฉันหยั่งราก ฉันไม่รังเกียจที่จะเปลี่ยนไฟล์ระบบหากจำเป็น
VVK

ในทางปฏิบัติของฉันช่วง 192.168.43.0/24 นั้นเป็นค่าเริ่มต้นของ Android / ผู้จำหน่ายที่กำหนดไว้สำหรับการปล่อยสัญญาณ WiFi และ 192.168.42.0/24 สำหรับการปล่อยสัญญาณผ่าน USB
จิม Klimov

คำตอบ:


25

น่าเสียดายที่ไม่มีวิธีใดในการเปลี่ยนช่วงที่อยู่ 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 ได้ :


+1 สำหรับข้อมูล อุปกรณ์ของฉันถูกรูท แต่แอพ Wireless Tether สำหรับผู้ใช้รูทไม่ทำงานบนมือถือของฉัน ควรมีวิธีในการเปลี่ยนช่วง IP บนโทรศัพท์ที่รูต C'Mon Man !, Android เป็นระบบปฏิบัติการแบบเปิดหลังจากทั้งหมด
VVK

@VVK มีวิธีหนึ่งคือ เพียงคอมไพล์ต้นฉบับอีกครั้ง
Syakur Rahman

แอพที่คุณพูดถึงดูเหมือนจะไม่มีอยู่อีกต่อไป คุณสามารถหาเวอร์ชั่นใหม่ ๆ ทางออนไลน์ได้หรือไม่เนื่องจากคุณรู้จักชื่อของผู้เผยแพร่? ฉันพบคนอื่น ๆ แต่ไม่มีพวกเขาฟรี ...
pgr

@pgr พบลิงก์ที่ใช้งานได้ แต่ไม่มีเวอร์ชันที่ใหม่กว่า
Sergey Vlasov

21

หุ่นยนต์เชื่อมต่ออินเทอร์เน็ตผ่าน 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ที่อยู่


2
42 สำหรับ USBNET 43 สำหรับ wifi
Zibri

หาที่ดีที่คุณเห็นว่า?
CDE

1
เพราะถ้าคุณโยงผ่าน usb คุณจะได้ 42 ถ้าคุณ wifi โดยคุณจะได้ 43
Zibri

5

ฉันรู้ว่านี่เป็นโพสต์เก่า แต่คิดว่าฉันจะให้การปรับปรุง ดูเหมือนว่าผู้ผลิตและรุ่นของ 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 ของคุณ

เทรนต์


คุณรู้หรือไม่ว่าโทรศัพท์ HTC รุ่นใหม่มีตัวเลือกนี้ด้วยหรือไม่
Arya

1

หมายเหตุ:จำเป็นต้องใช้รูท

ช่วงที่อยู่ IP DHCP เริ่มต้นนั้นเป็นรหัสตายตัว( 1 )คุณไม่สามารถเปลี่ยนแปลงได้หากไม่มีการสร้าง ROM ใหม่ด้วยรหัสต้นฉบับที่ได้รับการแก้ไข หรือใช้แฮ็คเล็กน้อย

เมื่อคุณเปิดการแชร์อินเทอร์เน็ตจะเกิดอะไรขึ้น (อย่างน้อย):

  • hostapd - daemon ซึ่งจัดการจุดเชื่อมต่อ - เริ่มต้นแล้ว
  • การเชื่อมต่อเครือข่ายมีการตั้งค่าที่อยู่ IP ถูกเพิ่มลงในอินเตอร์เฟซ Wi-Fi (ยากรหัสก่อน Android พาย( 2 , 3 ) , สุ่มหลังจากนั้น( 4 ) ) และตารางกำหนดเส้นทางจะมีการเพิ่ม( 5 )สำหรับเครือข่ายท้องถิ่น( 6 )
  • 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 linkls /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 เพื่อเรียกใช้กระบวนการของคุณเอง คำตอบนี้รวมถึงคำแนะนำแม้ว่าคำถามจะแตกต่างกัน

ที่เกี่ยวข้อง:

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.