V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
xuxiake
V2EX  ›  宽带症候群

DNS 分流方案

  •  
  •   xuxiake · 7 天前 · 4260 次点击

    之前使用 OpenClash 自带的分流,总感觉打开国内网站很慢,例如京东经常加载半天,微信图片也加载半天,遂在网上研究了下,得到现在的 DNS 分流方案 AdGuardHome+OpenClash+MosDNS ,现在完全不会影响国内网站,上网体验非常丝滑

    网络环境

    目前我是使用的旁路由方案,主路由是爱快,负责拨号上网,旁路由是 OpenWrt ,负责科学以及 DNS 服务器。IPv4 这边网关以及 DNS 都指向 OpenWrt ,打开 IPv6 ,开启 DHCPv6 ,但是不开启 IPv6 DNS ,DNS 复用 IPv4 的,IPv6 的网关使用默认配置,也就是指向爱快。

    DNS 服务器

    数据流向是 AdGuardHome -> OpenClash -> MosDNS

    1. DNS 主入口直接用 AdGuardHome ,彻底弃用 OpenWrt 自带的 dnsmasq ,具体配置是使用 53 端囗替换 dnsmasq ,这样广告拦截效率更高,广告可以在第一道关卡就被拦截,不用流转多道

    2. OpenClash 的 NameServer 、FallBack 、Default-NameServer 都只设置一个上游,就是 MosDNS

    3. MosDNS 负责最终的分流以及 DSN 缓存,配置好国内 DNS 服务器以及远程 DNS 服务器,有一个关键选项要开启,远程 DNS 首选 IPv4 ,这样对于需要代理的国外域名就只会返回 IPv4

    总结

    这套配置的核心思想是对于国内域名使用 IPv6 进行访问,网关直接就到爱快主路由,摆脱 OpenClash 对于国内网站的影响,目前国内主流网站 IPv6 建设基本已经非常完善,使用 IPv6 完全没有问题,如果没有 IPv6 也会自动 fallback 到 IPv4 。需要代理的国外域名,由于只有 IPv4 ,网关指向 OpenWrt ,就会被 OpenClash 代理到。

    不足

    虽然是分流了,但是 DNS 泄露检测不通过,这个目前还在研究

    第 1 条附言  ·  7 天前
    AdGuardHome 需要关闭缓存,确保每次 DNS 查询都能到 OpenClash
    73 条回复    2025-07-03 11:00:03 +08:00
    Ipsum
        1
    Ipsum  
       7 天前 via Android
    我感觉 ADG-Mos-clash 更好点。或者自己写个 gfw2adg 软件,mos 都可以扔了。
    EGOISTK21
        2
    EGOISTK21  
       7 天前
    我是这样的,ADG-Mos-tun2socks-代理客户端
    chinni
        3
    chinni  
       7 天前
    其实 dns 没必要这么复杂, 最上游用 udpme 直接转发到 8.8.8.8 就可以了。 然后 要去广告的话前面套一层任意支持全广告的 dns 上游设置为 udpme 。
    xuxiake
        4
    xuxiake  
    OP
       7 天前
    @Ipsum 这样会有点小问题,mos 如果开启缓存,dns 到不了 clash ,无法匹配域名规则
    Laoz666
        5
    Laoz666  
       7 天前
    现在 op 都是 fake ip 了 你多转一道都没必要 你觉得慢只是你没设置好 和 dns 没关系
    lqu3j
        6
    lqu3j  
       7 天前
    @xuxiake 现在一般都是 https , 可以开启 sniff 的呀
    Ipsum
        7
    Ipsum  
       7 天前
    @xuxiake adg 就有缓存,mos 再开有啥用呀。
    xuxiake
        8
    xuxiake  
    OP
       7 天前
    @Laoz666 fake ip 感觉问题还是比较多
    xuxiake
        9
    xuxiake  
    OP
       7 天前
    @Ipsum #7 adg 开缓存也有一样的问题
    Ipsum
        10
    Ipsum  
       7 天前
    @xuxiake #9 过 clash 的不是 fake ip ? real ip 多少有点小问题,比如同时挂在 cf 下面的网站。现在比较完美点的方案是 fakeip 持久化,过 clash 的都是 fakeip 返回,主路由做个 198 的静态就行了。
    Xopher
        11
    Xopher  
       7 天前 via iPhone
    open clash 太难用,用 nikiniki ,自己写的配置文件,感觉够用
    terrancesiu
        12
    terrancesiu  
       7 天前
    其实 adh 就够了,前提是你去境外 dns 都走的是隧道,然后使用 8.8.8.8 或者其他支持 edns 的公共 dns ,最后在 adh 里填写一个你的 isp 的 ip ,基本上解析就非常好了。比如我在阿里云广州配置的 adh ,使用 8.8.8.8 解析的 taobao 就是广州电信的,jd 也是,腾讯也是广东省内,但是 google 都是解析到 sea 了,最后改成 surfshark 的境外 dns 后,国内依旧非常近,google 都解析到了 hkg 。
    docx
        13
    docx  
       7 天前 via iPhone
    套娃这是……代理环境就解决了 DNS ,其它都不需要
    crysislinux
        14
    crysislinux  
       7 天前 via Android
    @terrancesiu 确实,我感觉 Google 的 edns 还是挺准的,作为一个 fallback 还是够用了。
    MYDB
        15
    MYDB  
       7 天前 via iPhone
    dns 泄漏管它干啥,虽然苍蝇不叮无缝的蛋了,但是人总会优先吃无缝的蛋或者处理腐烂的蛋
    xuxiake
        16
    xuxiake  
    OP
       7 天前
    @MYDB 我不是太在意这个,所以就这样吧😂
    sxwsuieyqwe11
        17
    sxwsuieyqwe11  
       7 天前 via iPhone
    我只用 AdGuardHome ,其实它也能分流国内外 dns 请求。
    Mystery0
        18
    Mystery0  
       6 天前
    我之前是用 adh -> mosdns 的方案,但是 mosdns 每次要改分流都要登路由器去修改(自定义配置文件的方案无法启动,不知道为什么),现在换成了 adh -> singbox 的方案,singbox 单独开了个端口入站用来配置出站规则,dns 如果有需要调整的直接远程改 singbox 模板( openwrt 、mac 、Android 我用的模板不一样但是里面大部分规则一样,区别主要是包名、进程名这些不同平台的支持差异)然后拉了自动重启就行了
    因为我自己要用公司的 vpn ,(相关请求理论上不走 singbox ,如果走了 singbox 就指定网卡出去)所以不能用 fakeip ,其他还有一些就是在家访问公司 vpn (公司我放了个树莓派,与家里组网,在家里就让 singbox 走 tailscale 网卡走到树莓派然后代理出去)
    383394544
        19
    383394544  
       6 天前
    怎麼不在 iKuai 上做 dns 分流,只把需要代理的流量交給 openwrt ?這樣國內上網會更快
    SenLief
        20
    SenLief  
       6 天前
    其实 dns 分流没必要那么详细,因为大部分人使用的网站就那么多,大部分在访问一次缓存后就就非常快了,全部代理都没什么问题的。
    TossPig
        21
    TossPig  
       6 天前
    我也分享一下我的方案
    `agh 192.168.1.53:53 -> mosdns 192.168.1.53:5353 -> clash 192.168.1.8:53`
    我是旁路由模式

    需要翻墙的域名会被解析为 22.0.0.0/8,这样除了 tg 其他设备都可以局域网内透明翻墙
    dhcp 下发静态路由 22.0.0.0/8 gw 192.168.1.8
    路由器中也配置静态路由 22.0.0.0/8 到 192.168.1.8 (主要是 andriod 不支持 dhcp 下发路由)

    agh 总体分两路
    1. 127.0.0.1,192.168.1.1 、192.168.1.8 、192.168.1.53 来源的直接用公共上游 doh 或者 dot
    2. 其他上游用 127.0.0.1:5353 也就是 mosdns

    mosdns 的规则比较多总体思路就是
    需要特殊处理的的域名丢给 clash 或者其他一些解析器
    不用特殊的丢给 agh 因为来源是 127.0.0.1 ,所有 agh 会用公共上游
    mosdns 的主要作用是读取各种域名规则,还有就是 ros 不支持内网的 ptr 反查,也靠 mosdns ,要不然每次 nslookup 的时候`服务器`显示个 unkown 我就很难受
    ```
    PS C:\Users\ts> nslookup baidu.com
    服务器: dns.ts.internal
    Address: 192.168.1.53

    名称: baidu.com
    Addresses: 182.61.244.181
    182.61.201.211
    ```

    用了快一年了,很方便,临时要控制某个域名的出口 agh 网页里面调整一下就好
    agh 的日志功能也能很方便的找到某个域名走的哪个远程地址,不用去路由器上慢慢抓包,统计功能也可靠了

    室友打游戏的延迟也只有 18~23 了

    对路由器系统没要求特别要求,支持 dhcp option 配置和绑定静态 IP 就行。很方便我在 ros ,openwrt 、爱快之间来回切换
    weicools
        22
    weicools  
       6 天前
    openwrt 一个搞定,嫌旁路由麻烦
    sentivcn
        23
    sentivcn  
       6 天前
    一个 ADG 就搞定了,干嘛还要套来套去
    miaomiao888
        24
    miaomiao888  
       6 天前
    太复杂了,一个 MOS 就搞定,兼顾去广告、分流、防污染。
    fengyaochen
        25
    fengyaochen  
       6 天前
    装那么多怎么可能快
    wm5d8b
        26
    wm5d8b  
       6 天前 via Android
    用 MosDNS ,域名清单怎么维护更新呢?
    全部指向一个 upstream ,又有 cdn 问题
    DAPTX4869
        27
    DAPTX4869  
       6 天前
    个人方案是 adg -> smartdns, adg 的分流麻烦, 还没法设置代理
    Ch3n4y
        28
    Ch3n4y  
       6 天前
    跟我方案完全一致,哈哈
    vitoegg
        29
    vitoegg  
       6 天前
    因为 openclash 或者 nikki 都是通过 fake ip filter 来实现绕过中国大陆了,感觉更简单的玩法是 dnsmasq - mosdns - openclash/nikki 。
    Dnsmasq 转发到 MosDNS ,MosDNS 根据域名分流不同的 DNS (需要代理的域名分配 openclash/nikki dns ),OpenClash/Nikki 设置成绕过中国大陆且取消掉 DNS 劫持。

    这样都是使用自带的配置,操作简单,数据流清晰。
    xuxiake
        30
    xuxiake  
    OP
       6 天前
    @Ch3n4y 🤝
    xuxiake
        31
    xuxiake  
    OP
       6 天前
    @weicools 爱快的流控、IPv6 还是方便很多
    xuxiake
        32
    xuxiake  
    OP
       6 天前
    @miaomiao888 AdGuardHome 广告过滤、可视化查询日志还是方便些
    Serino
        33
    Serino  
       6 天前
    dns:
    enable: true
    prefer-h3: true
    listen: :53053
    ipv6: true
    enhanced-mode: redir-host
    proxy-server-nameserver:
    - 国内 DNS
    nameserver:
    - 国内 DNS
    nameserver-policy:
    'geosite:private,microsoft@cn,category-games@cn,geolocation-cn':
    - 运营商 DNS
    'geosite:!cn':
    - 国外 DNS

    我猜楼主估计用了 fallback 什么的。

    不用搞那么复杂啊。去看下 Mihimo 的文档 ( https://wiki.metacubex.one/config/dns/diagram/#_3 ),就会发现,命中了需要代理的规则的网址,是直接发送域名到代理服务器的,不是发送解析到的 IP 。解析 IP ,主要是为了后面判断是走直连还是代理,如果是走代理,就把域名(是的,还是发送域名而不是解析出来的 IP )发送给远端代理服务器。

    网上好些做教程的估计都没看过官方文档,各种半桶水,我还见过说不用 fake-ip 肯定 DNS 泄露的,简直一派胡言。基本上我看到说有 DNSleak 的,都是因为不看文档只看各种半桶水教程并且 DNS 用了 fallback 。

    按我上面这个简单的 DNS 设置,就能有很好的分流效果,那些 DNSleak 也不会检测出国内旗子。
    如果要进阶一点,建议起 3 个 agh 的 docker ,分别做国内、运营商、国外 DNS ,而不是把 agh 放在 clash 之前。
    本地缓存做好了,甚至都不需要追求 fake-ip ,还能避免很多奇奇怪怪的问题。
    xuxiake
        34
    xuxiake  
    OP
       6 天前
    @sxwsuieyqwe11 AdGuardHome 分流好像还是稍微有点麻烦
    xuxiake
        35
    xuxiake  
    OP
       6 天前
    @wm5d8b OpenWrt 里面的 MosDNS 插件可以设置定时更新广告规则、GeoIP & GeoSite 数据库
    xuxiake
        36
    xuxiake  
    OP
       6 天前
    @vitoegg 这样设置也挺清晰的,但是 mosdns 最好不要开启缓存
    xuxiake
        37
    xuxiake  
    OP
       6 天前
    @Mystery0 我也发现了,OpenWrt 里的 MosDNS 用自定义配置好像没法启动
    xuxiake
        38
    xuxiake  
    OP
       6 天前
    @383394544 iKuai 咋做分流
    xiaoke
        39
    xiaoke  
       6 天前
    我用 dae+adguard+mosdns
    Laoz666
        41
    Laoz666  
       6 天前
    @xuxiake #8 出了 ping 和 trace 的时候 我感觉没什么问题
    yangfan1999
        42
    yangfan1999  
       6 天前   ❤️ 1
    用 ikuai + openwrt 做透明代理,即使旁路由故障也不影响国内网络访问。参考的是这篇文档: https://www.jackiewu.top/article/best-alternative-solution-for-transparent-gateway
    vitoegg
        43
    vitoegg  
       6 天前
    @xuxiake MosDNS 可以控制哪些结果缓存,哪些结果不缓存的,只要让 Fake IP 不缓存就可以了(不要经过 cache ,并且 ttl 指定为 1 )
    sxwsuieyqwe11
        44
    sxwsuieyqwe11  
       6 天前 via iPhone
    @xuxiake 配置 upstream_dns_file 就可以了,具体参考 https://github.com/Leev1s/FAK-DNS
    huizai2022
        45
    huizai2022  
       6 天前
    我直接 2 个 AdGuardHome 一个国内 一个国外
    BlackSas
        46
    BlackSas  
       6 天前
    我是用 surge 实现的。clash 在这方面确实有问题,openwrt 里又复杂而且修改验证也比较麻烦。
    NGUTHONG
        47
    NGUTHONG  
       6 天前
    我觉得有点太复杂了,流量路径上设这么多关卡还都是全局配置,但凡一个插件出问题家里网络不就炸了吗
    bclerdx
        48
    bclerdx  
       6 天前
    @Laoz666 那应该设置与和 DNS 的关系是啥?
    GotKiCry
        49
    GotKiCry  
       6 天前
    现在是 SmartDNS <- MosDNS <- Adh <- ShellCrash
    之前用 MosDNS <- Adh <- ShellCrash 总是会遇到网页加载慢或者第一次打不开第二次刷新就打开的情况,一直找不到什么问题,换成 SmartDNS 请求 MosDNS 做分流后就没啥问题了
    EGOISTK21
        50
    EGOISTK21  
       6 天前
    @NGUTHONG 我用了 OSPF 来解决这个问题,除了节点维修的时候 fallback 了一次,已经稳定运行了两年了
    xuxiake
        51
    xuxiake  
    OP
       6 天前
    @NGUTHONG 反正是 allinboom ,问题不大[狗头]
    likeflower
        52
    likeflower  
       6 天前
    C 规则前面插入
    - GEOSITE,CN,DIRECT
    - GEOIP,CN,DIRECT,no-resolve
    hiyoi
        53
    hiyoi  
       6 天前 via Android
    目前用 agh -> paopaodns ,自建的 paopaodns 内部就有 mosdns 分流了,这样保证无污染。代理使用 nikki ,关闭 dns 劫持,开启 ipv4 代理,按需选要代理的设备,模式用 tproxy ,不用 fakeip(问题太多),mihomo 配置只保留一组 nameserver 指向 agh 就行了。

    稳定运行 1 年多了。
    hjj0529
        54
    hjj0529  
       6 天前
    之前我也用这个方案,后来发现 docker 容器里面部署的 vpn 不好使,技术太菜,没找出原因,干脆不搞了。
    lozt
        55
    lozt  
       6 天前 via Android
    我自己家里现在用的是 adguardhome -> mihomo(redir-host),mihomo 里配置的上游 dns 默认国外的,policy 里配置 cn 的域名就走国内。似乎也还行- -,没太关注性能
    linhongjun
        56
    linhongjun  
       6 天前
    不知道你们天天都在干嘛 搞这么复杂
    starrys
        57
    starrys  
       5 天前
    @Serino #33 dns.fallback 具体是有什么问题?
    我的理解是,clash 会并发地向 dns.nameserver 与 dns.fallback 这两组 DNS 服务器发出 DNS 请求,关键问题来了,『需要等待 dns.fallback 中的服务器返回 DNS 结果后,才能决定使用哪一组 DNS 服务器的结果』,然而,网上流传的配置里面的 dns.fallback 服务器往往是国外的 DoH/DoT 、是比较慢的,这就明显拖慢上网速度。
    看我理解的对吗?

    https://clash.wiki/configuration/configuration-reference.html
    xpn282
        58
    xpn282  
       5 天前
    我是觉得不用搞那么复杂,OpenClash 的 dns 分流系统足够使用了,就看你怎么写咯,我的就很简单,一切正常,我是用 redir-host 模式:
    dns:
    nameserver:
    - 运营商 dns
    nameserver-policy:
    geosite:gfw:
    - 国外 dns

    以上的意思是:gfw 黑名单域名使用国外 dns 解析,其余的都用运营商 dns 解析,我觉得够用了,简单实用,不需要搞 fallback 之类的。

    当然还可以根据自己的需求修改合适自己的分流方案。
    比如国内域名用国内 dns ,其余的全部用国外 dns 。
    另外还可以给国外 dns 做一层代理,实现代理 dns 解析,防止在 redir-host 模式下,直接使用国外 dns 的时候被污染,导致访问 GitHub 之类的异常。

    我个人觉得 OpenClash 的 dns 系统足以应对 dns 分流,不需要借助其他工具,就看你怎么写怎么玩咯。
    xuxiake
        59
    xuxiake  
    OP
       5 天前
    @hjj0529 docker 容器为啥要部署 VPN 。。
    xuxiake
        60
    xuxiake  
    OP
       5 天前
    @linhongjun 反正就是折腾嘛[狗头]
    xuxiake
        61
    xuxiake  
    OP
       5 天前
    @xpn282 这是手动用配置文件嘛,图形化界面好像没这个选项
    hjj0529
        62
    hjj0529  
       5 天前
    @xuxiake 方便外面连回家,因为之前我开放太多端口被电信收回过公网 ip ,现在我只敢开放 vpn 端口回家。
    xuxiake
        63
    xuxiake  
    OP
       5 天前
    @hjj0529 #62 哦哦,我是用的爱快自带的 OpenVPN 服务端
    Ruslan
        64
    Ruslan  
       5 天前
    我真的不是很理解你们喜欢多套一个 adh 的操作...

    无论是 smartdns 还是 mosdns 搭一个 anti-ad 反广告规则一样能 dns 反广告的,多套一层 adh 我唯一的感想就是变慢了。
    adh 那个可以搭配浏览器规则的特性更是多余...除了有个好看的 UI 我始终没感受到 adh 的优势。
    SakuraYuki
        65
    SakuraYuki  
       5 天前
    我是懒狗,直接 surge 接管网络,不需要代理的设备直接走主路由,需要代理的设备走 surge 网关,surge 内部规则设置好,国外走 snell 服务器的默认 dns ,国内用运营商和阿里 dns
    orluna
        66
    orluna  
       5 天前
    op 问一下是 adh 上游设置为 openclash 吗
    xuxiake
        67
    xuxiake  
    OP
       5 天前
    @Ruslan adh 有个可视化日志界面,还是可以的
    xuxiake
        68
    xuxiake  
    OP
       5 天前
    @orluna 是的
    janzwong
        69
    janzwong  
       5 天前
    @Mystery0 自定义配置要去看日志,分析是卡在哪个加载环节了,我目前就是 adg+自定义 mosdns+openclash ,国内 realip 国外 fakeip ,adg 开缓存。昨天尝试研究了一下 adg->singbox ,最新的 1.12 版本实在是没研究明白,暂时放弃了。
    xpn282
        70
    xpn282  
       5 天前
    @xuxiake
    OpenClash 的“覆写设置”-“dns 设置”
    这里就可以填写 Nameserver 和 Nameserver-Policy 了,直接 dns 分流。
    不需要借助其他工具
    Autonomous
        71
    Autonomous  
       4 天前
    这段时间折腾下来我明白了一个道理:系统越复杂,越容易出问题。所以为了鲁棒性,就一个 AdGuard Home 就好了
    charley008
        72
    charley008  
       4 天前
    我想问一下,mosdns 上游假如是比如 223.5.5.5 ,会不会被限流?阿里与腾讯的 dns 不是已经限流了吗?我就那么点设备每个月 dns 查询都超过 1000w 。
    xuxiake
        73
    xuxiake  
    OP
       4 天前
    @charley008 国内 DNS 服务器我用的电信运营商的 DNS ,应该不会存在这个问题,而且 mosdns 可以设置缓存
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3113 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 92ms · UTC 11:38 · PVG 19:38 · LAX 04:38 · JFK 07:38
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.