2026 MosDNS 对接 PassWall:DNS 分流、防泄漏与广告过滤完整教程
目标不是“装完插件就结束”,而是把局域网 DNS 请求统一送进 MosDNS,再由 PassWall 配合代理策略完成直连 / 远程解析分流。本文从安装、5335 监听、DoH 上游、PassWall DNS 指向,到泄漏与广告过滤测试全部走一遍。
你提供的原教程使用第三方 openclash-auto-installer 菜单安装 MosDNS;本篇主流程改为当前 sbwml/luci-app-mosdns 官方安装脚本。原教程的 5335 监听、Cloudflare / Google DoH、缓存、广告过滤、PassWall 指向 127.0.0.1:5335 以及泄漏测试流程全部保留。PassWall 当前默认 DNS 分流器已是 ChinaDNS-NG,所以本文的“MosDNS 接管模式”属于自定义方案,不是 PassWall 默认值。
先固定 DNS 链路:谁监听,谁转发,谁负责分流
MosDNS 监听 0.0.0.0:5335;PassWall 的直连 DNS 与远程 DNS 都指向 127.0.0.1:5335。为了避免重复接管,原教程要求 MosDNS 与 PassWall 的“DNS 重定向”都关闭。这个设置请只在确认你的路由器 DNS 流程与本文一致时使用。
准备 OpenWrt,并确认包管理器和 DNS 端口
| 项目 | 建议 |
|---|---|
| OpenWrt | 官方 MosDNS 项目当前提供 24.10 与 25.12 预编译包 |
| 包管理器 | 24.10 通常使用 opkg;25.12 / 新版使用 apk |
| PassWall | 确保插件本身已可正常代理,再改 DNS |
| 回滚 | 修改 DNS 前记下当前配置,最好先备份 OpenWrt |
cat /etc/openwrt_release
uname -m
command -v opkg || command -v apk
netstat -lnptu 2>/dev/null | grep -E ':(53|5335)\b' || true安装 MosDNS:优先使用当前官方项目脚本
当前官方项目给出的预编译安装方式是先安装 curl,再执行安装脚本。
OpenWrt 24.10 / opkg
opkg update
opkg install curl
sh -c "$(curl -ksS https://raw.githubusercontent.com/sbwml/luci-app-mosdns/v5/install.sh)"OpenWrt 25.12+ / apk
apk update
apk add curl
sh -c "$(curl -ksS https://raw.githubusercontent.com/sbwml/luci-app-mosdns/v5/install.sh)"原教程的第三方安装方式
原文使用:
sh -c "$(curl -fsSL https://raw.githubusercontent.com/slobys/openclash-auto-installer/main/menu.sh)"它可以作为备用方案,但这是第三方合集脚本,不是 MosDNS 官方安装入口。新版教程把它保留为“原教程路径”,不作为默认推荐。
LuCI 中应出现 MosDNS 菜单;SSH 中可检查相关包:
opkg list-installed 2>/dev/null | grep -i mosdns || apk list --installed 2>/dev/null | grep -i mosdns配置 MosDNS 基本选项:让 5335 成为统一入口
进入 服务 → MosDNS → 基本选项。没有列出的选项先保持默认。
| 设置项 | 本文值 | 作用 |
|---|---|---|
| 启用 | 开启 | 启动 MosDNS |
| 配置文件 | 内置预设 | 沿用 LuCI 预设流程 |
| 监听地址 | 0.0.0.0 | 监听路由器所有接口 |
| 监听端口 | 5335 | 给 PassWall / Dnsmasq 调用 |
| DNS 转发 | 开启 | 允许作为上游转发器 |
| DNS 重定向 | 关闭 | 避免和 PassWall / 其他 DNS 接管规则重复 |
| 远程 DNS 首选 IPv4 | 远程 | 沿用原教程设置 |
| DNS 首选 IPv4 | 开启 | 优先 IPv4 返回 |
| 自定义国内 DNS | 开启 | 建立国内解析链路 |
netstat -lnptu 2>/dev/null | grep ':5335 '5335 端口监听。若没有监听,不要继续改 PassWall。配置国内 DNS 与远程加密 DNS
原教程要求“国内 DNS 服务器选择加密 DNS”,远程 DNS 填写 Cloudflare 与 Google。两个 DoH 端点当前仍有效:
https://cloudflare-dns.com/dns-query
https://dns.google/dns-queryGoogle 官方的 RFC 8484 端点是 https://dns.google/dns-query。国内 DNS 不建议照抄某个固定公共 DNS,直接在你当前 MosDNS LuCI 中选择可用、延迟低的加密国内 DNS 即可。
保存应用后,从路由器本机直接请求 MosDNS:
nslookup openwrt.org 127.0.0.1#5335 2>/dev/null || \
nslookup openwrt.org 127.0.0.1不同 BusyBox 版本的 nslookup 对自定义端口支持不同;如果命令不支持端口参数,以 LuCI 日志和后面的真实客户端测试为准。
配置 MosDNS 高级选项:缓存、防泄漏和广告过滤
| 参数 | 原教程值 | 建议 |
|---|---|---|
| DNS 服务器并发数 | 2 | 保留 |
| 空闲超时 | 30 | 保留 |
| TCP / DoT 连接复用 | 开启 | 减少重复建连 |
| 防止 DNS 泄露 | 开启 | 保留 |
| DNS 缓存 | 开启 | 保留 |
| DNS 缓存大小 | 8000 | 内存足够时可用 |
| 乐观缓存 TTL | 86400 | 原教程值;遇到解析更新不及时可降低 |
| 禁用 RR Type 65 HTTPS/SVCB | 开启 | 仅在兼容性需要时使用 |
| DNS 广告过滤 | 按需开启 | 规则越多,内存与维护成本越高 |
86400 是原教程的激进缓存值。动态 CDN、服务迁移或解析频繁变化时,过长的乐观缓存可能让旧地址留得太久。如果发现某些站点更换节点后打不开,先清缓存或降低 TTL。
配置 PassWall:把直连与远程 DNS 都交给 MosDNS
127.0.0.1:5335。进入 PassWall → 基本设置 / DNS。本文复刻的是原教程“Dnsmasq + MosDNS 统一入口”方案,而不是 PassWall 当前默认的 ChinaDNS-NG 方案。
| PassWall 项目 | 本文值 |
|---|---|
| DNS 分流 | Dnsmasq |
| 直连 DNS 请求协议 | 通过 TCP 请求 DNS |
| 直连 DNS | 127.0.0.1:5335 |
| 过滤代理域名 IPv6 | 开启 |
| 远程 DNS 请求协议 | TCP |
| 远程 DNS | 127.0.0.1:5335 |
| 默认 DNS | 远程 DNS |
| DNS 重定向 | 关闭 |
PassWall 当前项目默认配置里,dns_shunt 是 chinadns-ng,而且 dns_redirect 默认开启。本文主动改成 Dnsmasq 并关闭重定向,是为了复刻“MosDNS 5335 统一接管”的链路。如果你的现有 PassWall DNS 已经稳定,不要只为了“照抄教程”强行切换。
重启 PassWall 或路由器,使 Dnsmasq、PassWall 与 MosDNS 按新链路重新加载。
清理 DNS 缓存并重启服务
原教程最直接的方法是重启软路由。你也可以先尝试仅重启相关服务:
/etc/init.d/mosdns restart 2>/dev/null || true
/etc/init.d/dnsmasq restart
/etc/init.d/passwall restart 2>/dev/null || true不同固件 / 分支的 init 脚本名字可能不同。最稳妥的是在 LuCI 保存应用后重启路由器。
验证 DNS 泄漏:不要把“只有国外 DNS”当成唯一正确答案
原教程使用 BrowserLeaks DNS:
原文写“结果应该是 Cloudflare / Google(国外)”。新版这里做一个重要修正:是否出现 Cloudflare / Google 取决于你的域名分类、上游和测试方式,不应该把某一家解析商当成唯一成功标准。
- 没有出现运营商或浏览器绕过后的意外 DNS。
- 远程 / 代理域名的解析服务与 MosDNS 的远程上游一致。
- 国内域名如果走国内上游,测试中出现国内 DNS 并不必然等于泄漏。
- 浏览器开启 Secure DNS / DoH 时,可能绕过路由器 DNS;测试前要知道浏览器自身是否启用了独立 DoH。
验证广告过滤和真实网页加载
原教程使用:
测试结果只说明“当前规则是否拦截了测试域名”,不等于所有网页广告都会消失。DNS 层过滤无法处理与正文同域的广告,也无法替代浏览器内容过滤器。
网页打开速度
连续打开常用国内 / 国外网站,第二次访问通常能受益于 DNS 缓存,但真实页面速度仍主要取决于线路、CDN、TCP/QUIC 和代理节点。
视频缓冲
DNS 能改善“找到正确 CDN 地址”的阶段,不能保证视频吞吐量。缓冲速度最终受代理线路和节点带宽影响。
最终验收:逐项证明链路真正生效
- MosDNS 服务已启动,
5335正在监听。 - Cloudflare 与 Google DoH 配置能正常解析。
- MosDNS DNS 重定向关闭,避免和本文 PassWall 方案重复接管。
- PassWall 直连 DNS 与远程 DNS 都指向
127.0.0.1:5335。 - 重启后 5335 仍正常监听,网页可以解析。
- BrowserLeaks 的 DNS 来源符合你设计的分流规则。
- 广告过滤规则开启后,测试域名命中有变化。
- 常用国内 / 国外网站、视频服务都实际打开过,而不是只看状态页。
故障排查:按现象找责任层
| 现象 | 常见原因 | 检查 / 修复 |
|---|---|---|
| 改完 DNS 全网打不开 | MosDNS 5335 没监听,PassWall 却已经指向它 | 先检查 netstat -lnptu | grep 5335,必要时把 PassWall DNS 改回原值 |
| 5335 已监听但解析超时 | DoH 上游不可达、代理链路或证书时间异常 | 检查系统时间、MosDNS 日志和路由器到上游的连通性 |
| DNS 泄漏测试出现运营商 DNS | 终端 / 浏览器绕过路由器,或 Dnsmasq 仍有其它上游 | 检查浏览器 Secure DNS、DHCP 下发 DNS、Dnsmasq resolv 配置 |
| 测试只出现 Cloudflare/Google,但国内网站变慢 | 所有域名都走远程上游,没有正确国内分流 | 检查国内 DNS 与规则集,不要把“国外 DNS 越纯越好”当目标 |
| 某些网站更新 IP 后暂时打不开 | 乐观缓存 TTL 过长 | 清缓存,降低 86400 设置 |
| PassWall 升级后 DNS 行为变化 | 项目默认 DNS 分流器 / 字段改变 | 对照当前 PassWall 配置,不要覆盖升级后的默认值 |
| 开启广告过滤后某 App 异常 | 过滤列表误杀业务域名 | 查看查询日志并加白名单,而不是关闭整个 MosDNS |
版本说明与官方资料
原教程保留内容:MosDNS 0.0.0.0:5335、远程 Cloudflare / Google DoH、高级缓存与防泄漏参数、PassWall Dnsmasq 模式、直连/远程 DNS 指向 127.0.0.1:5335、关闭 DNS 重定向、BrowserLeaks 和广告过滤测试。
2026 官方补充:MosDNS 改用 sbwml/luci-app-mosdns 当前官方安装脚本;OpenWrt 24.10 / 25.12 包管理器区别;PassWall 当前默认 dns_shunt=chinadns-ng、dns_redirect=1;Google DoH 使用 RFC 8484 端点 https://dns.google/dns-query。
LAN → Dnsmasq / PassWall → MosDNS :5335 → 国内 DNS / 远程 DoH
真正重要的是“每一层职责清楚、没有重复重定向,并且能用实际查询结果解释流量去了哪里”。