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

9 天前
 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 搞这种骚操作,看似提升了小白的网络体验,实际上剥夺了用户选择权,都是傻*

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

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

https://www.v2ex.com/t/1154563

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

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

© 2021 V2EX