如何在Android上配置WIFI共享(热点)的DHCP设置?


27

将我的电脑连接到Android Wi-Fi热点时,它192.168.42.x为我的电脑分配了一个地址。我真的需要更改它,因为它与我们的工作子网之一冲突-这可能吗?


2
我的手机已经扎根。如果需要,我不介意更改系统文件。
VVK

就像上面的一些好答案中对细微差别的回应一样,在我的实践中,192.168.43.0 / 24范围是由Android /供应商默认分配给WiFi网络共享,而192.168.42.0/24则是针对USB网络共享。
吉姆·克里莫夫

Answers:


25

不幸的是,即使在CyanogenMod中,也无法更改内置网络共享支持的IP地址范围。Wi-Fi热点IP硬编码在android.net.wifi.WifiStateMachine.startTethering()中;USB绑定IP硬编码在com.android.server.connectivity.Tethering中

但是,如果您的手机已扎根,则可以尝试使用第三方网络共享应用程序,这些应用程序可以更改IP地址范围。例如,当内置的USB绑定在Samsung Galaxy W的CyanogenMod alpha中被破坏时,我使用了适用于Root Users的有线绑定。对于Wi-Fi网络共享,您可以尝试使用同一作者的“ 无线Root用户”应用程序,该应用程序还可以更改IP地址范围。


由于Google代码已关闭,因此以上链接不再起作用。有人将源代码从这些存储库导出到GitHub:

但是,没有进一步的开发活动,这些应用程序可能不再能在最新的Android版本上运行。

万一有人想尝试那些过时的应用程序,我已经能够在Google Code存档中找到一些APK文件:


+1的信息。我的设备已植根,但“根用户无线束缚”应用程序无法在我的手机上运行。应该有一些方法可以更改植根电话C'Mon Man!上的IP范围,毕竟Android是开放式操作系统。
VVK

@VVK有办法。只需重新编译源即可。
Syakur Ra​​hman

您提到的应用似乎不再存在。您知道发布者的名字,可以在网上找到任何新版本吗?我找到了其他一些,但没有一个是免费的……
pgr

@pgr找到了一些有效的链接,但没有更新的版本。
谢尔盖·弗拉索夫

21

Android内置的wifi网络共享设计为使用192.168.43.1/24作为服务器,并使用来netd处理网络共享dnsmasq。第一个DNS范围是192.168.42.1-254和,第二个DNS范围是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";

稍后我们将看到使用的范围,如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;
    }

dhcp范围的主要来源不是硬编码的42和43,而是从内部字符串数组array.config_tether_dhcp_range中读取的。但目前为空。

您可以编辑android框架。在我的手机上是/system/framework/framework-res.apk。在线上有大量用于编辑framework-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 /签名(遵循教程),然后重新安装。

如果要使用多个范围,只需一遍又一遍地复制两个项目。您始终需要为每个范围提供起点和终点。尝试将其保持在相同的/ 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守护程序--no-poll -no-resolv --dhcp-range = 192.168.50.5,192.168.50.99,1h

FWIW,我的WIFI网络共享使用默认dnsmasq范围,但已为我的计算机分配了192.168.43.147/24网关192.168.43.1/24。不确定为什么您的默认42.x地址。


2
42用于USBNET 43用于WiFi
Zibri

很高兴找到您在哪里看到的?
cde

1
因为如果你系绳通过USB你如果系绳通过无线网络获得42你43
Zibri

5

我知道这是一篇旧文章,但以为我会提供更新。似乎某些制造商和Android版本现在确实允许在使用WiFi热点功能时通过UI更改DHCP服务器的IP子网范围。在运行Android 6.0的HTC One M8上可以找到它。YMMV。

在“移动热点”屏幕上,单击3点图标(更多),转到“高级”,然后单击“局域网设置”。在“本地IP”下,将IP地址更改为所需的IP。在“本地DHCP”下,更改起始IP以匹配您IP地址的子网。

特伦特


您知道新的HTC手机是否也有此选项吗?
艾莉亚

1

注意:根是必需的。

默认的DHCP IP地址范围是硬编码的1,如果不使用修改后的源代码重建ROM,就无法更改它。或使用一点技巧。

开启网络共享时,至少会发生以下情况:

  • hostapd -管理访问点的守护程序-已启动。
  • 网络接口设置,IP地址被添加到Wi-Fi接口(Android的饼图之前硬编码23,然后随机化4),并加入路由表5用于本地网络6
  • dnsmasq-DHCP / DNS服务器(最多Pie)-从硬编码的命令行参数7)启动(否则可以通过/etc/dnsmasq.conf 8设置)。

因此,我们可以/system/bin/dnsmasq用一个自定义的shell脚本替换它,从而控制两者之间的过程。将原始二进制文件重命名为其他名称:

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

另外,请确认您的本地网络的路由表是97grep 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

如果(全部或部分)尚未定义并且status为,则还需要定义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脚本或替换/sepolicyramdisk

设置文件权限:

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

请享用!

或者,您可以从命令行设置完整的网络共享,运行自己的进程。该答案包括说明,尽管问题有所不同。

有关:

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.