我正在尝试让 Android 设备使用 LAN 上的 DNS 服务器将服务器主机名解析为本地地址,但是它不起作用。
我以某种方式欺骗了路由器 (*),让它在分发 DHCP 地址时传递 DNS 服务器的本地 IP 地址 (192.168.1.99)。从运行 Windows 10 的设备中,我看到了这种情况,因为当我查看网络属性时,我看到它正在使用我想要的主 DNS IP 地址和辅助 DNS IP 地址,并且它正确地将本地服务器从全球可见的主机名解析为本地地址。
(*)基本上,路由器不允许我设置 DNS 服务器,单选框无法选择。检查 javascript 允许我设置一个断点,这样我就可以绕过逻辑,该逻辑显然只允许在具有静态 IP 地址的情况下设置 DNS 服务器,而我没有静态 IP 地址(而且设置静态 IP 的单选框根本无法选择!)。当我提交表单时,似乎更改没有生效,但有些设备现在获得了正确的 DNS 服务器!更新:我找到了另一个路由器,在分配 DHCP 地址时不需要任何技巧就可以传递 DNS 服务器,但 Android仍然不使用它返回的 DNS 服务器!
但在 Android 上,它不起作用,它将主机名解析为世界可见的 IP 地址,这表明它没有使用 DHCP 分发的 DNS 服务器。(并且令人费解的是,通过外部 IP 地址访问服务器停止工作,这就是需要将主机名解析为内部地址的全部原因!)
我在用着特尔姆克斯尝试解决问题,发现getprop net.dns1
并getprop net.dns2
返回了 IPv6 地址,进一步挖掘显示路由器中的这些地址是 ISP 提供的 DNS 地址。所以我想也许出于某种原因,我在路由器上使用的技巧在 Android 上不起作用。
因此,我尝试手动配置设备的 DNS 服务器。Settings -> WiFi -> (long press network name) -> Modify network -> IP settings: Static
我输入了与设备通过 DHCP 获取的网络配置相同的网络配置,例如
IP address: 192.168.1.2
Gateway: 192.16.8.1.1
Network prefix length: 24
DNS 1: 192.168.1.99
DNS 2: 8.8.8.8
但是,通过这种手动配置,我无法访问 LAN 上的任何东西!例如,我无法访问 192.168.1.1 上的本地路由器网页,浏览器显示无法访问。我无法在 Termux 中 ping 相同的 IP 地址,它显示“网络无法访问”。如果我在 termux 中运行ifconfig wlan0
,route
输出看起来与我将 IP 设置设置为通过 DHCP 配置时的输出相同。但是,getprop net.dns1
仍然返回 IPv6 地址,所以现在我不确定我是否相信该命令会返回有效数据。更新:好的,实际上有四个 DNS 地址:前两个是来自我的 ISP 的 IPv6 地址,它们以某种方式泄漏了,后两个是我设置的两个 IPv4 地址。
这似乎特定于较新的 Android 版本,较旧的 Android 4.3 设备没有问题(它甚至不需要静态 IP 配置来正确解析主机名)。
我还能尝试哪些方法来解决此问题并使 DNS 正常工作?
更新:我发现这个帖子指的是以下情况:
- 有两个 DNS 服务器,一个是本地 IPv4 服务器(192.168.1.230),另一个是 ISP IPv6 服务器(2a01:e00::1)
- IPv4 DNS 服务器知道本地域,而 IPv6 DNS 服务器不知道。
- Android 恰好使用 IPv6 DNS 服务器,因此无法解析本地网络中的主机。
这与我的配置相符。但随后发帖者声称“这是按设计运行的”,而我对此有疑问。然后它列出了四种可能的解决方法:
- 将 IPv6 地址添加到本地 DNS 服务器,并配置路由器以将该地址宣布为 IPv6 DNS 服务器(如果可能)。 这不起作用,因为路由器不允许我为 DNS 指定 IPv6 地址。
- 如果可能的话,在路由器上配置本地名称。 我不确定这是什么意思。路由器本身不提供任何 DNS 功能
- 使用公共域,以便 ISP 路由器能够解析内部名称。我也不确定这是什么意思——公共域名如何能够引用内部 IP 地址???
- 在路由器上禁用 IPv6 DNS(或禁用 IPv6)。 路由器不提供任何方法来禁用或以其他方式配置与 IPv6 相关的任何内容
因此,我仍然被困在一个实际上是 DOA 的系统上,因为网络上的某些设备无法看到它们运行所需的资源。
更新:我设置了一个单独的 DHCP 服务器,并禁用了路由器上的 DHCP 服务器,但 Android 设备仍然在其列表中获取两个 IPv6 DNS 服务器 - 似乎在 DHCP 服务器报告的 DNS 服务器出现在 IPv6 服务器出现之前有一两秒的延迟,并且它们总是插入在...前面服务器报告的地址。我曾尝试增加报告的 DNS 服务器数量,以尝试填满 Android 可能拥有的任何表格,但即使有 32 个其他 DNS 服务器,它仍然会在开头插入两个,总共 34 个!Android 如何获取这些地址,我如何才能强制它停止这些地址?!这让我抓狂了!
更新:我发现了一款名为“DNS Changer”的应用程序,它似乎可以解决这个问题,尽管我有些怀疑,在找到真正的解决方案之前,它是否能成为一种权宜之计。它似乎创建了某种 VPN,但我想进一步了解它的工作原理。它是否将流量路由到防火墙之外?路由到哪里?我想知道它是否将所有内容路由出去,因为与使用 IP 地址而不是主机名运行相同测试相比,对我自己的服务器进行速度测试会产生大约 20% 的平均传输速率。我使用了另一个应用程序,它报告了大约 7 个不同的外部主机名,并声称整个传输都通过了每个主机名。此外,如果网络中断,此解决方法将失败!
更新:我也在运行 Android 5.1 的 root 设备上看到了这个问题...我已经设置了指向内部服务器的静态 IP 地址和 DNS,甚至还设置setprop
了每一个DNS 服务器到我的内部 DNS 服务器的 IP 地址...但在 termux 中当我使用 nslookup 时它仍然坚持使用 8.8.8.8 来查找名称。我如何让 Android 真正使用我指定的 DNS 服务器?
答案1
阻止路由器中除您要使用的 DNS 之外的所有其他出站端口 53(DNS)流量,而 Android 设备将使用您在 dhcp 中为其分配的 DNS,似乎将它们添加到列表的底部,因此这会导致其他流量失败并使用您想要的流量,不确定谷歌为什么这样做
答案2
自 Android 6.1.x 起,您只能更改绑定设备的 DNS,而不能更改其他任何内容。无论您设置了什么或使用了哪个应用,其他所有内容都会被忽略
从DNS 问题。
(其中 Android 6.1.x,我认为是 Android 6.0.x)
答案3
以下是我发现的适用于 Android 5.1 的解决方案。有关更多信息,请参阅本文 [https://developer.mozilla.org/en-US/docs/Archive/B2G_OS/Developing_Firefox_OS/Customizing_DNS][1]
adb pull /system/etc/dhcpcd/dhcpcd-hooks/20-dns.conf 20-dns.conf
将第 22-26 行更改为您需要的内容。在我的设备上,我删除了第 22-26 行,并将第 17-20 行更改为:
count=1
for i in 1 2 3 4; do
setprop dhcp.${intf}.dns${i} ""
done
到
count=1
for i in 1 2 3 4; do
setprop dhcp.${intf}.dns${i} "192.168.7.8"
done
将该 IP 更改为您需要的任何 IP
更改文件后,卸载系统并用刚刚更改的文件覆盖默认文件:
adb shell shell mount -o rw,remount /system
adb push /yourpath/20_dns.conf /system/etc/dhcpcd/dhcpcd-hooks/20-dns.conf
adb shell chmod 644 /system/etc/dhcpcd/dhcpcd-hooks/20-dns.conf
adb shell mount -o ro,remount /system
我发现重新安装可能不像这里这样,所以运行adb shell mount
查看所有安装点并在您的设备上找到正确的安装点
重新安装后重新启动。通过 adb 进入设备 shell 并运行tcpdump udp port 53
以查看是否正常工作
答案4
我找到了一个可行的解决方案。这个应用程序https://play.google.com/store/apps/details?id=com.frostnerd.dnschanger即“开源”(仅引用)https://git.frostnerd.com/PublicAndroidApps/DnsChanger创建与设备的 VPN 连接以重定向所有 DNS 请求。
我不太喜欢它,因为它托管在内部 Gitlab 上,在那里所有事情都可以完成和撤消。
正在研究如何创建临时 openvpn 隧道来实现相同目的。