$ pwd: ~ / 技术分享 / article/daed-with-mosdns

DAE搭配MosDNS使用配置

// 本篇文章并非DAE及DAED的安装配置入门文章。关于DAE与DAED的安装方法之后会单独编写。本篇文章主要内容为在使用DAE或DAED的情况下,如何搭配MosDNS使用,提供一个高兼容性、高可用性的配置方案。

git-status.logreadonly
$ git log --oneline --stat
📁 category: 技术分享📅 updated: 2026-01-18🏷️ tags: Linux, 旁路由, DNS
article/daed-with-mosdns.mdreadonly
type
status
date
slug
summary
tags
category
icon
password
本篇文章并非DAE及DAED的安装配置入门文章。关于DAE与DAED的安装方法之后会单独编写。本篇文章主要内容为在使用DAE或DAED的情况下,如何搭配MosDNS使用,提供一个高兼容性、高可用性的配置方案。以下内容基于Debian 12系统。

📝 DAE(大鹅)的DNS原理

DAE的分流原理

域名通过劫持 DNS 请求,将 DNS 请求的域名与所查 IP 进行关联来得到。尽管这种方式有一些问题:
  1. 可能会出现误判。例如需要分流到国内和国外的两个网站拥有同一个 IP,且在短时间内同时被访问,或浏览器有 DNS 缓存。
  1. 用户的 DNS 请求必须通过 dae。例如将 dae 设为 DNS,或在 dae 作为网关的情况下使用公共 DNS。
———
DAE对程序所在网关进行全部流量的处理,且与其他代理程序不同,并不提供DNS的转发端口,而是采用对只有经过该网关的全部DNS请求才会分流,所以无法直接使用原有代理程序那些套娃的DNS行为。
 
更新:
需要注意的是,如果上游MosDNS采用并发策略,一段时间后,可能会存在造成Dae内存泄露的情况,内存占用由原来的500M左右,增加至1G左右。目前原因还在排查。
MosDNS关系不大,如果手机使用相同订阅代理并连接同网WIFI,在内网会产生环回请求造成内存泄露。

常规代理程序DNS请求及解析

clash dns
在未通过公共DNS或者代理远端DNS请求解析的情况下,常规代理软件是可以进行DNS的无限套娃的,并不会返回给客户端解析的结果。在套娃的过程中可以不断针对不同的DNS请求进行过滤和分流,在日常使用中能够极大的提供便利,例如AdGuard Home的广告过滤与可视化控制面板、MosDNS的并发DNS请求、ECS请求等等。

DAE的DNS请求与解析

dae dns
DAE的不同点在于,在流量进入网关开始即进行分流,且基于Domain的分流模式必须将DAE作为唯一的DNS入口,在顺序上相当于将将代理程序前置作为入口,且由于DAE并不提供DNS转发的监听端口,所以无法后置于其他DNS程序。

📝 DAE与MosDNS的配合

DAE提供了一份使用外置DNS程序的指南:
external-dns.md
daeuniverse
根据这份指南我们可以对整体家庭局域网内的DNS请求链路进行梳理如下:
dae dns with mosdns
例如我在使用MosDNS的情况下,将GeoSite:CN的域名通过MosDNS并发请求阿里的公共DNS服务器,取得结果。同时对GeoSite:GFW以及Graylist(自定义灰名单)的域名使用Google的公共DNS进行请求,使其回到DAE的分流规则之内,这样既满足使用MosDNS并发请求加快DNS解析速度、ECS提供就近CDN节点的同时,也不会扰乱DAE基于domain的分流配置。

DAE Dial Mode配置

建议使用Domain++,原因在于使用MosDNS情况下,即便Dae监听53端口,但由于direct(must)规则的存在,对后续DNS不进行监听,会造成部分域名解析结果未经过Dae,所以需要使用Domain++ 来重新进行基于域名的嗅探与分流。

1. Domain 模式

工作原理:使用嗅探(sniffing)得到的域名发送给代理服务器。
特点
  • 会检查嗅探到的域名的真实性
  • 若 DNS 环境不纯净,可以很大程度上缓解 DNS 污染问题。适用于 DNS 请求经过Dae,并没有使用外部 DNS 解析程序的情况(例如使用AdGuard Home 或者 MosDNS)。
  • 通常会带来更快的代理响应,因为代理会在远端重新解析域名,获得更优的 IP 连接结果。
  • 域名重写在路由的流量分割之后进行,dae 不会重新路由。
适用场景
  • DNS 请求经过 dae 处理的标准配置。
  • 需要基于域名进行流量分流的用户。
  • 希望获得较快代理响应的用户。

2. Domain+ 模式

工作原理:基于 domain 模式,但不会检查嗅探得到域名的真实性
特点
  • 比 domain 模式更宽松,不验证域名真实性。
  • 适合 DNS 请求不经过 dae 但仍想要更快代理响应的用户。
  • 重要限制:若 DNS 请求不经过 dae,基于域名的流量分割将失效。
适用场景
  • 使用外部 DNS 服务(如 AdGuard Home、MosDNS)处理 DNS 请求。
  • DNS 不经过 dae,但仍希望代理时使用域名而非 IP。
  • 不适合需要精确域名分流的场景。

3. Domain++ 模式

工作原理:基于 domain+ 模式,但会根据嗅探到的域名重新进行流量路由
特点
  • 可以部分恢复基于域名的流量分割能力。
  • 直连流量无效。
  • 占用更多的 CPU 资源。
  • 是一种折中方案,在 DNS 不经过 dae 时仍想要域名分流。
适用场景
  • DNS 请求不经过 dae,但仍需要部分域名分流能力。例如设置了 Dae 的 DNS 上游服务器为 MosDNS 或者其他 DNS 解析服务程序。
  • 适用于使用主路由进行了国内外 IP 分流,dae 作为辅助。
  • 不适合对 CPU 资源敏感的低性能设备。

4. IP模式

仅作IP分流,DNS无需经过Dae,但同时如果存在DNS污染情况,那Dae也无法解决。

DAE DNS规则配置

主要配置为红色字体部分,DAE的DNS部分仅作为流量的监听,所有DNS的解析均发往MosDNS进行解析,无论是否被污染,由MosDNS中的规则进行DNS分流。

DAE Routing路由规则配置

主要部分为红色部分,将MosDNS进程放在must_direct策略内,不将DNS流量重定向到dae并继续匹配,避免产生回环。同时因为可继续匹配,所以MosDNS中使用Google Public DNS规则流量还可以继续进入DAE执行远端请求。
本次更新去掉了&& l4proto(udp) && dport(Mosdns监听的端口号)原因在于仅通过进程已经能够完全匹配,如果加上端口号和UDP协议,反而会造成部分DNS无法正常解析。这也仅是猜测,目前无法进一步验证。

MosDNS配置

定义Tag

主序列配置

query_nocn配置

主DNS服务由Google Public DNS提供,副DNS服务由NextDNS服务提供,在使用Google Public DNS时流量会重新进入DAE,完成解析,获得无污染结果。

🤗 总结归纳

目前这套方法是我用下来最为舒服的,在解析速度和识别被污染域名方面均可以满足我的需要,同时对劫持到反诈页面也有很好的规避效果,例如Linux.do等网站打开也不会被劫持了。唯一不太方便的地方在于对于污染域名的配置上,在添加DNS的自定义规则时,需要在MosDNS的自定义文件内添加,例如我的是graylist
理论上,在此基础上还可以进行套娃,例如使用AdGuard Home等,但由于DAE作为入口劫持所有的流量,所以AdGuard Home的客户端会仅显示为DAE客户端。所以建议如果使用AdGuard Home,可将AdGuard Home放置于另外的容器或主机上作为DNS入口,同时上游配置DAE所在主机IP。
如果你的机场对节点入口域名使用了国内和国外不同的结果(例如目前的TagSS,为了避免来自国外流量的DDoS),或者无法获取到节点正确的IP地址,那么建议修改Config部分内的udp_check_dns 为国内的DNS,例如阿里云的223.5.5.5 可能会解决这个问题。

📎 参考文章

 
有关Dae以及MosDNS安装或者使用上的问题,欢迎您在底部评论区留言,一起交流~
 
comments.logreadonly