V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
susandownes
V2EX  ›  DNS

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

  •  2
     
  •   susandownes · 8 天前 · 3614 次点击

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

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

    路由器有控制权

    • 在 OpenWrt 上,对来自手机的 MAC 地址的 114 DNS 请求全部 DNAT 到网关本身
    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

    • 使用私人 DNS
    • 使用 VPN 接管 DNS

    (不喜欢 VPN 通道被占用

    手机已 root

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

    • iptables 丢弃

    (治标

    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
    
    
    • 反编译 service-wifi.jar 或者 hook ClientModeImpl 让 addBackupDnsServerIfNeeded() 返回空

    (治本

    罪魁祸首↓

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

    第 1 条附言  ·  7 天前

    补一个效果图

    第 2 条附言  ·  7 天前
    29 条回复    2025-08-25 17:20:40 +08:00
    fuzzsh
        1
    fuzzsh  
       8 天前 via Android   ❤️ 2
    2025 才发现?国产品牌只用过 vivo 的评论下,2020 就已经这样做了,强行追加公共 dns 。于是我直接在出口将常见公共 dns 整段引入 null0
    你的方法只针对 114 ,还有 cnnic dnspod 等一大堆公共 dns
    NICEghost
        2
    NICEghost  
       8 天前
    国行安卓系统有哪个是没加料的
    povsister
        3
    povsister  
       8 天前
    网关直接劫持全部 udp53 就行了
    frankilla
        4
    frankilla  
       8 天前
    为啥要这样做?和各个公共 DNS 有合作?
    docx
        5
    docx  
       8 天前 via iPhone   ❤️ 1
    特色是这样的……选择权不重要,当开发收到一堆无脑小白反馈网络问题,排查一顿发现是用户设置错了 DNS……
    docx
        6
    docx  
       8 天前 via iPhone
    另外,既然都用 Moto ,刷个同型号的国际版就好了
    lovekernel
        7
    lovekernel  
       8 天前
    @frankilla 你所有的请求都被 114 劫持了。不注意的话你访问的所有网站 114 都能知道
    strobber16
        8
    strobber16  
       8 天前 via Android
    moto 现在也是国产品牌了,再正常不过
    frankilla
        9
    frankilla  
       8 天前
    @lovekernel #7 国内安卓这样做的目的是啥啊,我就有点一脑袋问号。
    1423
        10
    1423  
       8 天前
    https://us.v2ex.com/t/838579
    重复造轮子之重复发现 bug
    lovekernel
        11
    lovekernel  
       8 天前
    @frankilla 我也不知道处于何目的。可能是爱吧
    slack
        12
    slack  
       8 天前 via Android
    @strobber16 对,现在是联想旗下的品牌。
    susandownes
        13
    susandownes  
    OP
       8 天前
    > 你的方法只针对 114
    @fuzzsh 前面提的是通用方案,最后反编译删逻辑已经根治了
    Danswerme
        14
    Danswerme  
       8 天前
    现在还可以在网关上通过劫持 53 端口来实现屏蔽,如果未来有一天厂商强制使用 DoL or DoH 的话应该怎么办呢?
    Danswerme
        15
    Danswerme  
       8 天前
    @Danswerme 手误,DoL -> DoT
    susandownes
        16
    susandownes  
    OP
       8 天前
    > 重复造轮子之重复发现 bug
    @1423 是同一个现象,不过不同厂商的实现不一样,小米的插入在另一个 jar 包里
    frankilla
        17
    frankilla  
       8 天前
    @lovekernel #11 好的,谢谢。
    guanzhangzhang
        18
    guanzhangzhang  
       8 天前
    op 上的 dns server 都有劫持 53 端口的选项,也就是你添加 iptables 的那个,但是是全匹配 port53 direct 的
    MacsedProtoss
        19
    MacsedProtoss  
       8 天前 via iPhone
    剔除所有的国产就行了
    我就只有 Apple 全家桶和 win Linux 以及 aosp based 的 Android
    重灾区国产安卓完全不碰
    mscsky
        20
    mscsky  
       8 天前
    不是因为开了私人 dns?
    mscsky
        21
    mscsky  
       8 天前
    这个可以手动关掉
    RobinHuuu
        22
    RobinHuuu  
       8 天前 via iPhone
    多说一句,手机都有隐私保护功能,Mac 地址可能是动态的
    Hephaistos
        23
    Hephaistos  
       8 天前
    因为都不相信运营商的 dns 了……被投诉多了就想办法解决呗
    johnjiang85
        24
    johnjiang85  
       7 天前
    原因很多,这里有冰山一角,https://lovelyping.com/?p=338
    yanxu4780
        25
    yanxu4780  
       7 天前
    安卓 10 还是 11 就已经开始这样做了。不过首选还是自己的 DNS ,备选会加上 114
    yanxu4780
        26
    yanxu4780  
       7 天前
    我自己用的时候,基本都是在路由器端进行 DNS 劫持,除非微信这种把加密 DNS 直接写进程序的,其他基本都会进行劫持处理。
    BanShe
        27
    BanShe  
       7 天前
    网关直接劫持+1
    jackOff
        28
    jackOff  
       7 天前
    这不是 openwrt 里默认的 dnsmasq 就能拦截的吗?现在拦截不了的是手机软件自带 doh 查询
    jackOff
        29
    jackOff  
       7 天前
    而且退一万步,当厂商把 dns 查询,广告业务,反炸查询,正常业务查询,全部使用一个 api ,你也没办法,最好还是手机物理隔离
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3393 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 04:48 · PVG 12:48 · LAX 21:48 · JFK 00:48
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.