侧边栏壁纸
博主头像
いちごみるく

行动起来,活在当下

  • 累计撰写 70 篇文章
  • 累计创建 48 个标签
  • 累计收到 55 条评论

目 录CONTENT

文章目录

mosdns v5 自定义配置:AdGuard Home、SmartDNS 与 DNS 分流

适用版本:mosdns v5。示例展示域名分组、IP 判断与备用解析路径,配置需在目标网络中验证,不默认附加固定地区 ECS 或屏蔽 HTTPS 记录。

一、先确定完整 DNS 链

mosdns 是 DNS 转发与规则处理组件,不能仅凭回答 IP 的国家判断是否受污染。加密 DNS 保护的是到指定解析器的传输过程,解析器和权威数据本身仍需信任。cn 域名可能使用境外 CDN,境外域名也可能有国内节点。

下面选择一条明确的公共查询链:客户端 → AdGuard Home → mosdns → 国内 SmartDNS 或远程加密 DNS。AdGuard Home 放在分流之前,两个方向的查询都经过广告过滤,不需要再为“境外 DNS 去广告”部署第二个实例。本地域名与私网反查由 dnsmasq 提供,必须避免回送到 AdGuard Home 形成递归。

组件 示例监听/职责
AdGuard Home 5553,统一过滤;实际 LAN 53 接入由固件 redirect 或明确的监听配置完成
mosdns v5 127.0.0.1:5335,域名规则、缓存、上游选择
SmartDNS 127.0.0.1:6053,国内上游;也可换为其他可信解析器
dnsmasq 53,DHCP、本地域名及私网 PTR;其通用上游不能再构成上述链的回路

这些端口只是示例,必须检查正在运行的 socket、UCI/YAML 和防火墙转发规则。我的 Actions-OpenWrt 项目采用类似的 AdGuard-first 结构;它包含配套规则,不能把其端口设置脱离 init/firewall 实现复制到任意固件。

二、一个可读的 v5 配置

提前创建 /etc/mosdns/rule/ 中五个文本规则文件,并按 domain_set 的格式准备内容;空文件表示该列表暂未启用。domestic.txt 是国内域名规则,remote.txt 是强制远程规则,两个列表应避免冲突。direct.txt 用于手动指定本地上游,ddns.txt 用于动态域名,block.txt 仅用于需要直接拒绝的域名。

此配置把明确的拒绝规则放在缓存之前,避免旧缓存绕过阻止;DDNS 查询跳过此处缓存。国内列表按本地上游回答,远程列表按远程上游回答;未命中列表时优先本地,错误或超时才启动远程 fallback。NXDOMAIN 也是有效应答,不会自动被解释为污染。

log:
  level: info

# 需要 API 时才启用,默认仅在本机提供。
api:
  http: "127.0.0.1:9091"

plugins:
  - tag: domestic
    type: domain_set
    args:
      files: ["/etc/mosdns/rule/domestic.txt"]
  - tag: remote
    type: domain_set
    args:
      files: ["/etc/mosdns/rule/remote.txt"]
  - tag: direct
    type: domain_set
    args:
      files: ["/etc/mosdns/rule/direct.txt"]
  - tag: ddns
    type: domain_set
    args:
      files: ["/etc/mosdns/rule/ddns.txt"]
  - tag: block
    type: domain_set
    args:
      files: ["/etc/mosdns/rule/block.txt"]

  - tag: cache
    type: cache
    args:
      size: 4096

  - tag: forward_local
    type: forward
    args:
      upstreams:
        - addr: "udp://127.0.0.1:6053"

  - tag: forward_remote
    type: forward
    args:
      concurrent: 1
      upstreams:
        - addr: "https://dns.google/dns-query"
          dial_addr: "8.8.8.8"
        - addr: "https://cloudflare-dns.com/dns-query"
          dial_addr: "1.1.1.1"

  - tag: fallback
    type: fallback
    args:
      primary: forward_local
      secondary: forward_remote
      threshold: 500
      always_standby: false

  - tag: main
    type: sequence
    args:
      - matches: qname $block
        exec: reject 3

      - matches: qname $ddns
        exec: $forward_local
      - matches: qname $ddns
        exec: ttl 5-5
      - matches: has_resp
        exec: accept

      - exec: $cache
      - matches: has_resp
        exec: accept

      - matches: qname $direct
        exec: $forward_local
      - matches: has_resp
        exec: accept

      - matches: qname $remote
        exec: $forward_remote
      - matches: has_resp
        exec: accept

      - matches: qname $domestic
        exec: $forward_local
      - matches: has_resp
        exec: accept

      - exec: $fallback

  - tag: udp_server
    type: udp_server
    args:
      entry: main
      listen: "127.0.0.1:5335"
  - tag: tcp_server
    type: tcp_server
    args:
      entry: main
      listen: "127.0.0.1:5335"

设置 AdGuard Home 的公共上游为 127.0.0.1:5335,本地域名/私网 PTR 定向到真正提供这些数据的 dnsmasq。不要让 SmartDNS 指回 mosdns,也不要让 dnsmasq、AdGuard Home 互相把所有查询转发给对方。远程 DoH 的 IP 若不能直连,要为该连接配置可用的代理路由,并避免代理引导域名又依赖同一条尚未建立的链。

这个配置没有发送固定 ECS;若以后增加 ecs_handler,注意 v5.3+ 中 preset 会优先发送预设子网,不能因 send: false 就认定 ECS 已关闭。只在确定递归解析器和权威服务支持、且该子网代表实际出口时启用。使用嗅探不代表 ECS 或解析结果可以随意填写。

不要默认拒绝 qtype 65:HTTPS 记录可承载协议和连接参数等信息。确有兼容问题时,应针对可复现故障进行限定处理。GeoIP 也不能证明一个 DNS 答案真假。插件顺序和 fallback 行为参见 v5 配置文档与可执行插件文档。

三、缓存、规则与验收

lazy_cache_ttl: 259200 允许在相应缓存机制下使用过期记录达三天,不适合作为所有网络的统一设置。多层过期缓存和预取会增加陈旧答案、后台查询与排障成本。先用普通缓存,证明确有收益后再按层开启。将 DDNS TTL 降到 5 秒也不会让上游缓存立即失效;应同时检查 AdGuard Home、SmartDNS 和客户端缓存策略。

mosdns v5 的文本域名/IP 列表与 v4 的 dat provider 写法不同。规则应从可信项目获取并按固定版本或校验值更新,不能只凭第三方“每日更新”就保证内容正确。LuCI mosdns 项目的内置配置会变化,本文不是其当前预设的逐字副本。

在测试配置与规则文件路径后,分别检查 UDP、TCP、A、AAAA、HTTPS 记录、阻止名单、DDNS、本地域名与私网 PTR。例如安装 dig 后:

dig @127.0.0.1 -p 5335 example.com A
dig @127.0.0.1 -p 5335 example.com AAAA +tcp
dig @127.0.0.1 -p 5335 example.com HTTPS

再从 LAN 客户端经过实际 53 入口测试,查看 AdGuard Home 查询日志是否包含国内和远程两条路径;重启 DNS 服务、reload 防火墙和重启 PassWall 后复验。浏览器自带 DoH 和应用硬编码解析可能绕过本地入口,DNS 泄露测试只能反映被测路径,不能证明所有设备都被接管。

四、AdGuard Home 的 HTTP/3 设置

只有需要 DoH3 时才配置它。停止 AdGuard Home 后,在其 YAML 的 dns 节下调整相应设置,再启动服务,避免运行时覆盖手动编辑:

dns:
  serve_http3: true
  use_http3_upstreams: false

serve_http3 控制它向客户端提供 HTTP/3;use_http3_upstreams 控制它向支持的上游使用 HTTP/3,两者是不同方向。使用 h3:// 指定 AdGuard Home 的上游,也不会代替服务端启用 DoH3。还要有正确的 TLS 配置和 UDP 监听/放行;客户端 mosdns 的 HTTP/3 支持应按其版本单独配置和测试。AdGuard Home 配置文档是字段位置和含义的依据。不能据此推断某协议会规避网络审查。

0

评论区