Moto Edge 国行系统强行追加 114 DNS 的探究

13 天前
 susandownes

最近折腾 Moto Edge 60 Pro (XT2507-5 ,国行) 时,发现连接任意 WiFi 系统都会强制追加 114 DNS (不管 DHCP 下发了一个还是两个 DNS ,亦或使用静态 IP 手填 DNS 都免不了),这直接破坏了我在 OpenWrt 上的 ADG 和 Mosdns 策略。

经过一番排查和实验,总结出这些应对方法。

路由器有控制权

iptables -t nat -A prerouting_lan_rule -m mac --mac-source <手机 MAC> -p udp -d 114.114.114.114 --dport 53 -j DNAT --to-destination 192.168.X.1
iptables -t nat -A prerouting_lan_rule -m mac --mac-source <手机 MAC> -p tcp -d 114.114.114.114 --dport 53 -j DNAT --to-destination 192.168.X.1

(最无感

手机无 root

(不喜欢 VPN 通道被占用

手机已 root

一开始以为是 overlay 配置,结果 cmd overlay 验证并不涉及 DNS 。 抓 dumpsys connectivity ,确认是 ClientModeImpl 里往 LinkProperties 里强加的。 最终在 /apex/com.android.wifi/javalib/service-wifi.jar 找到关键方法:addBackupDnsServerIfNeeded()。

(治标

iptables -I OUTPUT -d 114.114.114.114 -p udp --dport 53 -j REJECT
iptables -I OUTPUT -d 114.114.114.114 -p tcp --dport 53 -j REJECT

(治本

罪魁祸首↓

private void addBackupDnsServerIfNeeded() {
    Iterator<InetAddress> it = this.mLinkProperties.getDnsServers().iterator();
    int i = 0;
    while (it.hasNext()) {
        if (it.next() instanceof Inet4Address) {
            i++;
        }
    }
    if (i == 1) {
        try {
            this.mLinkProperties.addDnsServer(InetAddress.getByName("114.114.114.114"));
        } catch (UnknownHostException unused) {
            if (this.mVerboseLoggingEnabled) {
                log("Adding 114 DNS Server Fails");
            }
        }
    }
}

吐槽

AOSP 已经有 Fallback 机制了,在无任何可用 DNS 时才会追加 8.8.8.8 。 小米一加、Moto 搞这种骚操作,看似提升了小白的网络体验,实际上剥夺了用户选择权,都是傻*

3847 次点击
所在节点    DNS
29 条回复
fuzzsh
13 天前
2025 才发现?国产品牌只用过 vivo 的评论下,2020 就已经这样做了,强行追加公共 dns 。于是我直接在出口将常见公共 dns 整段引入 null0
你的方法只针对 114 ,还有 cnnic dnspod 等一大堆公共 dns
NICEghost
13 天前
国行安卓系统有哪个是没加料的
povsister
13 天前
网关直接劫持全部 udp53 就行了
frankilla
13 天前
为啥要这样做?和各个公共 DNS 有合作?
docx
13 天前
特色是这样的……选择权不重要,当开发收到一堆无脑小白反馈网络问题,排查一顿发现是用户设置错了 DNS……
docx
13 天前
另外,既然都用 Moto ,刷个同型号的国际版就好了
lovekernel
13 天前
@frankilla 你所有的请求都被 114 劫持了。不注意的话你访问的所有网站 114 都能知道
strobber16
13 天前
moto 现在也是国产品牌了,再正常不过
frankilla
13 天前
@lovekernel #7 国内安卓这样做的目的是啥啊,我就有点一脑袋问号。
1423
13 天前
https://us.ex.noerr.eu.org/t/838579
重复造轮子之重复发现 bug
lovekernel
13 天前
@frankilla 我也不知道处于何目的。可能是爱吧
slack
13 天前
@strobber16 对,现在是联想旗下的品牌。
susandownes
13 天前
> 你的方法只针对 114
@fuzzsh 前面提的是通用方案,最后反编译删逻辑已经根治了
Danswerme
13 天前
现在还可以在网关上通过劫持 53 端口来实现屏蔽,如果未来有一天厂商强制使用 DoL or DoH 的话应该怎么办呢?
Danswerme
13 天前
@Danswerme 手误,DoL -> DoT
susandownes
13 天前
> 重复造轮子之重复发现 bug
@1423 是同一个现象,不过不同厂商的实现不一样,小米的插入在另一个 jar 包里
frankilla
13 天前
@lovekernel #11 好的,谢谢。
guanzhangzhang
12 天前
op 上的 dns server 都有劫持 53 端口的选项,也就是你添加 iptables 的那个,但是是全匹配 port53 direct 的
MacsedProtoss
12 天前
剔除所有的国产就行了
我就只有 Apple 全家桶和 win Linux 以及 aosp based 的 Android
重灾区国产安卓完全不碰
mscsky
12 天前
不是因为开了私人 dns?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://ex.noerr.eu.org/t/1154563

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX