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

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

  •  2
     
  •   susandownes · 11 天前 · 3759 次点击

    最近折腾 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 条附言  ·  10 天前

    补一个效果图

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