利用 Mosdns (v4 or v5) 和 AdGuardHome 搭建自己的 DNS

date
Aug 17, 2022
slug
use-mosdns-and-adguardhome-to-build-your-own-dns
status
Published
summary
国内的 DNS 服务商一般有两个,网络运营商和部分商业公司。而由于种种原因,这些 DNS 都存在或多或少的问题,这里就不细说了。而部分玩家为了尽可能地规避其中的某些问题,因此必不可少地需要自建 DNS 服务。
tags
DNS
type
Post

前言

国内的 DNS 服务商一般有两个,网络运营商和部分商业公司。而由于种种原因,这些 DNS 都存在或多或少的问题,这里就不细说了。而部分玩家为了尽可能地规避其中的某些问题,因此必不可少地需要自建 DNS 服务。但是,需要注意得是,我们国家的互联网域名管理办法明文规定:
‼️
提供域名解析服务,应当遵守有关法律、法规、标准,具备相应的技术、服务和网络与信息安全保障能力,落实网络与信息安全保障措施,依法记录并留存域名解析日志、维护日志和变更记录,保障解析服务质量和解析系统安全。涉及经营电信业务的,应当依法取得电信业务经营许可。
因此,接下来搭建好的的 DNS 服务只能在自己的内网运行,用于学习、测试等个人用途上,不得对外提供服务。

工具选型

目前用得比较多,而且还在活跃的 DNS 工具总共有三种:
它们都是开源产品,能够做到防污染、防跟踪、防篡改、去广告、反跟踪等等功效。但是彼此之间的实现区别还是很多的,而我在仔细对比之后还是选择了后两款。至于原因这里不方便细说,比较复杂,但是如果说对于 SmartDNS 有特殊感情也可以自行搜索相关的教程。

服务搭建

首先介绍下思路,我们用 Mosdns 作为最核心的部分 → DNS 转发器,AdguardHome 作为可视化的前端和广告规则自动拦截和屏蔽工具。
当然,有人可能会问只用 AdGuardHome 就够了,为什么还要用 Mosdns?
至于为什么不单用 AdguardHome,我这里主要出于两方面的考虑:
  • 经过测试 Mosdns 的 DNS 查询转发速度相对更快,且查询条件能做到更加精细地控制,这里可以参考规则部分
  • Mosdns 的域名匹配工具可以直接利用一些常用的域名文件做到更加方便和精准地分流;Adguardhome 不是不行,但是很麻烦
 
这里需要你有一台测试 Linux 服务器(不用多好,能正常访问就行),接下来使用该命令一键安装 Docker。如果你不知道什么是 Docker,请自行搜索了解。

Mosdns

‼️
mosdns v5:2022年 12 月 21 日发布了 v5.0.0-rc.0,配置文件和 v4 有大量变化,需要参考 wiki 重新配置。因此我下面的内容也分为 v4 版本和 v5 版本以区分。
首先你需要准备好配置文件相关资源文件和config.yaml ,下面是相关链接可以复制或下载使用

资源文件

v4 版本:
v5 版本:
 

配置文件

路径:/etc/mosdns/config.yaml,下面列举了 v4 和 v5 版本的配置文件作为参考。
v4 版本配置文件
v5 版本配置文件:

安装

上述工作都完成后就可以使用下述的安装命令了:
至此,Mosdns 已经搭建完成,理论上从这一刻开始,你就可以直接使用 DNS 服务了。但是,这里存在很多问题:
  • 没有可视化的、傻瓜式的界面
  • 想要自动更新广告屏蔽列表该怎么办
因此接下来我们就需要利用 AdGuardHome 来解决这一问题。

AdGuardHome

下面是 AdGuardHome 的 Docker 安装命令。
安装完成后只需要使用浏览器访问 IP + 3000 端口即可进入服务初始化界面。在部署端口时需要注意一下:
  • 网页管理界面端口建议不使用默认 80,方便你使用 Nginx 或 Caddy 反代
  • DNS 服务端口也建议不要用 53,因为已经被 Mosdns 占用了
接下来设置完成用户名和密码登录,就来到了主界面。
notion image
接下来进入 DNS 设置页,将上游 DNS 服务器设置为 127.0.0.1,此时代表 AdGuardHome 将向 Mosdns 转发 DNS 查询。
notion image
同时建议在 DNS 服务配置启用 EDNS 客户端子网。
notion image
不建议开启缓存,缓存可以交给 Mosdns,这里 AdGuardHome 的作用就是转发、记录和去广告。
notion image
接下来还有两个地方需要设置:加密设置和设置 DNS 拦截列表。
加密设置在这里,主要能够支持 DoH 和 DoT。这里也要说明一下不建议直接使用 IP 形式的 DNS(使用我们自行搭建的服务时):
notion image
而 DNS 拦截列表就是可以去广告和自动更新规则的地方,规则请自行搜索:
notion image
 
PS:有个配置建议,可以打开 AdGuardHome.yaml 在 dns 下面增加 trusted_proxies,主要是能够获取到上游的真实请求地址,方便 ECS 的运行。
 
更多关于 AdGuardHome 的教程可以参考:

如何访问

这里建议使用 Nginx 或者 Caddy 反代 AdGuardHome,本地使用 DoH 地址进行测试,我自己使用得是 Caddy,可以参考一下:
最终生成的 DoH 地址就是 https://you.domain/dns-query,大家可以把这一地址填写到对应的工具中即可。
另外,关于搭建的服务器有一些建议:
  • 到测试环境的延迟尽量低,否则容易出现在 DNS 解析阶段就浪费大量时间的情况
  • 有一定的 SLA 保证
  • 由于需要用到 HTTPS 来访问 DNS,所以如果你没有备案的域名可能无法在国内服务器上进行测试,建议可以选择回国线路相对较好的香港服务器
个人搭建并体验过的服务器厂商有
上面这两家的部分香港服务器线路都不错,建议可以试一下。另外,腾讯云的轻量服务器https://cloud.tencent.com/)也可以考虑的。
PS:括号内的不带 AFF。
 
 
参考资料: