如何在Android KitKat上更改移动连接的DNS?


24

我想避免来自本地移动ISP的审查(例如,出于某些未知原因,它会阻止imgur)。

屏幕截图
屏幕截图(点击图片可查看大图)

我敢肯定,可以通过将DNS更改为Google DNS或OpenDNS来解决此问题,但是我不确定如何在KitKat上完成此操作。

Info:
Device: Nexus 5
Android version: 4.4.2
Device status: rooted

Answers:


18

好的,首先要完全公开:我是一个应用程序的作者,该应用程序现在在Google Play商店中,可让您更改Android 4.4上任何移动连接的DNS。该应用程序需要root用户,花费几美元,并且被称为Override DNS。有人告诉我,在一个现已删除的答案上,只要我明确公开它,就可以链接到我的应用程序。

我发现此版本的Android(4.4)存在的问题是,显然是出于缓存原因,系统行为已更改为将所有DNS查询重定向到一个称为“系统守护程序” netd链接(这是与4.4之前的Android网络相关的演示文稿的链接,但是,涵盖了这些主题的一部分)。

getprop/ setprop方法行不通了。更改后,这些值将被netd守护程序简单地忽略。

必须通过/dev/socket/netd套接字与守护程序直接通信。在Android中,现在提供了一个名为的工具ndc,可以完成这项工作。

与DNS相关的东西的语法是这样的:

# ndc resolver flushif <iface>
# ndc resolver flushdefaultif
# ndc resolver setifdns <iface> <domains> <dns1> <dns2>
# ndc resolver setdefaultif <iface>

应用程序会自动猜测网络设备名称,并在每次激活移动网络时应用这些命令。


setifdns的正确语法为:ndc resolver setifdns <iface> <domains> <dns1> <dns2> ...。示例:ndc resolver setifdns eth0 "" 8.8.8.8 8.8.4.4
Christian d'Heureuse

@ Christiand'Heureuse,您说的对,我更新了答案,谢谢。
MaxChinni 2015年

13

我通过使用iptables规则将所有端口53连接转发到目标DNS服务器来“解决”了该问题;我在Android 4.4.2上尝试在连接3G时尝试修改DNS设置的经验与Leo完全相同;getprop | grep dns [0-9] \]:和dhcpd.conf中的值不了解。

iptables -t nat -A OUTPUT -p udp --dport 53 -j DNAT --to-destination 8.8.8.8:53

原因如下所述:http : //forum.xda-developers.com/showpost.php?p= 44722857&postcount =6所有应用程序都通过/ dev / socket / dnsproxyd UNIX套接字通过netd进行DNS查找。此线程还描述了为什么忽略系统属性。

要撤消此操作,请执行

iptables -t nat -L OUTPUT -n -v --line-numbers

,找到与udp dpt:53对应的行号:: xxx.xxx.xxx.xxx:53并执行

iptables -t nat -D OUTPUT *linenumber*

2
谢谢!此外,原因摘要:Google正在与广告拦截器进行军备竞赛。他们试图禁用当前意味着广告拦截器正常工作,并将广告拦截器转移到另一个广告拦截器,而所有用户(无论是否使用广告拦截器)都将永远被Google的举动所困扰。...我以为每个人现在都知道与广告拦截器作斗争是愚蠢的举动。傻谷歌。(同样,开源应用AFWALL是轻松添加此自定义规则的便捷方法)
gcb 2014年

关于如何应用自定义iptables规则的AfWall + Wiki
betatester07 2016年

1

遗憾的是,目前可能无法执行此操作,但是可以尝试使用DNS Changer。如果您已扎根,这可能会起作用,但不能保证。

可以使用的一种不错的DNS服务是Google的公共DNS服务。在这里,对于这些类型的问题,它的效果往往很好。

如果这些都不起作用,请继续寻找答案。XDA Developers是一个很好的解决这类问题的网站。他们倾向于在Android方面有很多答案。


1

我在KitKat Cyanogenmod 11上,这意味着我默认是扎根的。尽管如此,我只能报告失败:

第一种方法:

当我尝试adb shell

setprop net.rmnet0.dns1 208.67.222.222
setprop net.rmnet0.dns2 208.67.222.222
setprop net.rmnet1.dns1 208.67.222.222
setprop net.rmnet1.dns2 208.67.222.222
setprop net.rmnet2.dns1 208.67.222.222
setprop net.rmnet2.dns2 208.67.222.222
setprop net.dns1 208.67.222.222
setprop net.dns1 208.67.222.222

然后测试要解析到哪个IP hjfdkhfjkyuiwnwetbyebvtwgqwdi.tk解决的问题。我收到NXDOMAIN响应,这意味着它不是来自我设置的OpenDNS名称服务器(它将返回一个替代IP的答案,以为您服务)。

做的时候

getprop | grep dns

我只会看到自己配置的内容。但是,从WiFi切换到移动设备(3G或4G / LTE)时,我看到了我认为已分配给我的移动运营商的IP。诸如“ DNSwitch”或“ DNS Changer”之类的应用程序可以在网络更改时自动重置这些解析器。但是,getprop报告给我的仍然不是真正解决问题的方法。

第二种方法[a]:

我尝试的另一种方法是在其中修改/system/etc/dhcpcd/dhcpcd-hooks/20-dns.conf一组固定的东西(但要注意网络名称和解析器的数量可以不同)。没有成功。

第二种方法[b]:

然后/system/etc/dhcpcd/dhcpcd.conf我删除了在DHCP协商中接受解析器的参数。也没有成功。

第三种方法:

到目前为止,唯一可行的方法是使用“穷人VPN”,使用应用程序“ SSH隧道”,使用SOCKS4,但使用该工具并没有取得很好的效果。

恢复:

似乎是在其他地方设置了DNS,或者在网络移动后立即转发(劫持)了所有DNS。

那么,怎么会呢?为运营商提供消除网络中立性的工具是另一种肮脏的方式吗?

在您的情况下,您的问题就是因为这一点。您是否拥有SSH来尝试SSHTunnel是否是解决运营商审查问题的替代解决方案?


我找到了一种规避障碍的方法,但是它很麻烦,而且要视具体情况而定。我已经扎根,因此可以访问hosts文件。接下来,我查找了imgur的直接IP地址,然后将这些值手动输入到hosts文件中。现在问题解决了。
user51893 2014年

1

今天,由于输血,我遇到了同样的问题。我试图开发一个应用程序“ DNS转发器 r”来解决它。它不会更改系统上的dns服务器,但会将dns查询转发到另一台服务器。这种解决方法对我在Kitkat(Nexus 5 / 4.4.3和Moto Razr / CM11)上正常工作。希望它也能帮助其他人。


这实际上有效,不确定您为什么被否决了
warsong 2014年

0

目前,我不认为有任何方法可以更改移动数据上的DNS。但是,如果您的手机已扎根,则可以使用Set DNS之类的应用程序。


可悲的是,该应用程序似乎不支持Android 4.3及更高版本:(摘自该应用程序的描述:“请不要立即安装ANDROID 4.3,该内核存在DNS处理方式问题。我已经从市场上购买了4.3种设备。”
user51893 2014年

您的问题是说,对于Android KitKat(Android 4.4。*)需要它,而Android 4.3是Jellybean。
卡兰·拉吉·巴鲁

我已经在设备上的Play商店上打开了该应用程序的页面,它在最上方显示:“您的设备与此版本不兼容。” 因此,我确定问题仍然存在,从4.3版到KitKat。
user51893 2014年

根据常见问题解答,推荐应用程序实际上并不是该网站的一部分。我回答了Android是否可以原生执行的问题。我建议您自己搜索Play商店。
Karan Raj Baruah 2014年

提示:访问AppBrain上的apps页面列出了几种选择(右侧顶部4)。但是请注意,该部门中的大多数解决方案都需要root访问。
伊兹
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.