前言
前天在某个社区看到了用户分享自己搭建的DNS服务,顿时吸引了我的关注。我尝试了一下,确实有点效果,可是毕竟是别人的,不太可控,我就翻了一下教程,准备自己搭建一个。
这是我自建DNS一天的使用情况,帮我拦截了不少无益DNS查询。我给路由器也配置上了,所有设备都能享受去广告DNS了,满足!
写这么一篇文章,也是为了存档,方便以后我再建。
购置服务器
本次选择的是阿里云ECS 经济型e实例,目前是活动价99元/年。2核2G,3M固定带宽,40G ESSD Entry云盘,这个配置简单的用一下还是没什么问题的。
购买地址:阿里云权益中心_助力学生、开发者、企业用云快速上云-阿里云 (aliyun.com)
地区选的是距离我比较近的杭州,选用Debian 12.6 64位系统,先续费一年,再变更固定带宽为按使用流量计费,带宽调到 50 Mbps,这样阿里云会退103元,相当于九十多块买了两年服务器。按流量计费有个缺点就是流量很贵,每月前20G流量免费,超出部分0.8元/G,不过我自己一个月用不了20G那么多,无所谓了,怎么划算怎么来。
弹性网卡中开启公网 IPv6 ,按流量付费,带宽 50 Mbps。做DNS总不能连IPv6都没有吧。
安全组里面 入方向 给所有端口都开放。
最后给服务器装上宝塔,在宝塔里面安装好Docker。然后在宝塔安全设置里开放以下端口,因为DNS会使用到UDP,所以我们要给端口开放UDP协议。
为什么要开放4433端口呢?因为我还打算在我的服务器上部署一些网站项目,这就占用了443端口,只能委屈一下我的自建DNS了。如果你的服务器只用来搭建DNS,那默认使用443就很好了。
安装AdGuard Home
我们先获取 AdGuard Home 的镜像( adguard/adguardhome:latest
),但是因为国内网络原因,我的杭州服务器并没有成功获取到镜像文件,所以我先使用国外的服务器获取镜像后,导出文件然后导入到杭州服务器。
参考文章里面给出了三种网络模式,我们选择适合直通外网的设备对外开放服务的网络模式进行安装。在SSH软件里,直接对服务器输入下面的安装指令。
docker run -d \
--name adguardhome \
--restart unless-stopped \
--log-opt max-size=1m \
--network host \
-v $PWD/adguardhome/work:/opt/adguardhome/work \
-v $PWD/adguardhome/conf:/opt/adguardhome/conf \
adguard/adguardhome
安装就完成了,是不是很简单?
初始化设置
使用网页浏览器访问 IP + 3000 端口即可进入到 AdGuard Home 的初始化界面,比如 IP 是 10.0.0.53
,那么就访问 http://10.0.0.53:3000
接着是监听接口(网卡)和端口设置,根据不同的网络模式和实际情况需要作出不同的修改:
- 如果只搭建DNS的话,默认就行
- 如果还需要部署其他网站项目,80 端口要留给Nginx,网站管理页面 使用 3000 就行
然后是设置管理用户名和密码,后面都是直接下一步。完事之后输入用户名和密码登录,就来到了仪表盘页面。
至此 AdGuard Home 就初始化完成了。
设置具体功能
接下来详细讲解如何正确的设置 AdGuard Home ,来更有效的防止 DNS 污染以及去广告。与其它 AdGuard Home 教程的只讲方法、不讲逻辑的胡乱设置不同,认真看完这篇教程你会收获大量的知识和启发。
常规设置
文字介绍已经很好理解了,按需设置即可。重点是以下几个,如果你尚处于单身状态,那么就不要开启,否则会影响生理卫生知识的学习。
- 使用 AdGuard【家长控制】服务:如果家中有尚未成年的孩子,建议开启,屏蔽成人内容。
- 强制安全搜索:在 Bing、Google、Yandex、YouTube 等网站上强制使用安全搜索,屏蔽 NSFW 内容。
DNS 设置
上游 DNS 服务器
根据所在网络环境的不同推荐以下两组支持 ECS 功能的 DNS 服务器。如果有科学魔法爱国上网需求,你应该部署两个 AdGuard Home ,通过 DNS 分流才能达到较为理想的防污染和去广告效果。
- 中国大陆网络环境推荐选择腾讯 (DNSPod) 和阿里云的公共 DNS 。使用它们你会惊奇的发现偶尔某些不存在的网站都是能正常解析的,只不过解析的结果并不是离你的代理服务器最近的 IP ,所以效果并不理想,而且非常不稳定。TIPS: 中国大陆不推荐使用任何海外的 DNS ,因为延迟很高且都受到了不同程度的干扰,可用性不高,强行设置只会得到减速效果或者报错。
tls://dns.pub
https://dns.pub/dns-query
tls://dns.alidns.com
https://dns.alidns.com/dns-query
tls://dns.google
https://dns.google/dns-query
tls://dns11.quad9.net
https://dns11.quad9.net/dns-query
上游 DNS 服务器输入框下面有几个单选项,字面理解应该是解析策略、模式之类的选项,官方暂时没有给出详细介绍,所以博主根据字面含义和自身实际体验总结如下:
- 负载均衡:使用加权随机算法来选择最快的服务器。用到了算法,这就很玄学了。实际其实就是随机选择一个上游 DNS 服务器中的一个进行解析请求,哪个延迟低就更偏向于用哪一个。
- 并行请求:同时请求所有上游 DNS 服务器,取最快给出的响应结果,所以解析速度很快。在上游 DNS 服务器设置合理的情况下属于万金油方案,解析速度和访问速度都很快。所以也非常适合上游 DNS 服务器连接延迟大和不稳定的情况,就比如科学魔法爱国上网使用场景。
- 最快的 IP 地址:同时请求所有上游 DNS 服务器,在所有响应结果中选出延迟最低且可用的 IP。因为要等待所有上游 DNS 服务器响应结果,而且还要测试 IP 延迟及可用性,所以解析速度会很慢。只适合上游 DNS 服务器延迟特别低且网络非常稳定的场景,否则实际使用中可能会遇到首次打开网页非常慢,甚至可能打不开,要多刷新几次。再者低延迟 IP 不一定速度就快,还要看实际负载情况,所以这个方案的实际可用性是最差的。
后备 DNS 服务器
180.76.76.76
114.114.114.114
119.29.29.29
119.28.28.28
Bootstrap DNS 服务器
Bootstrap DNS 服务器(引导 DNS 服务器)的作用只是解析上游 DoT/DoH 技术 DNS 服务器的域名,我们留空就好。
设置完点击测试上游服务器,没有问题点保存即可。
DNS 服务设定
- 速度限制:
0
- 使用 EDNS :前面提及的上游 DNS 服务器都是支持 EDNS (ECS) 的,它有助于获取到更合适的 CDN 节点,建议勾选。
- 使用 DNSSEC : 用于效验 DNS 记录的签名,防止 DNS 缓存被投毒,建议勾选。勾选后会在日志页面请求列显示小绿锁图标。
- 禁用 IPv6 :丢弃 IPv6 的 DNS 查询。在本地网络和网站都支持 IPv6 会优先使用 IPv6 去访问网站,但目前 IPv6 的建设还处于初级阶段,大多数地区的 IPv6 网络体验都一般。
DNS 缓存配置
先简单科普一下 TTL ,它是英语 Time To Live 的简称,中文翻译为 “存活时间”。放在 DNS 解析中意为一条域名解析记录在 DNS 服务器中的存留时间,单位是秒。
正常情况下 TTL 默认 0
即可,即从上游 DNS 服务器获取 TTL 值。如果你所部署的网络环境到上游 DNS 服务器的延迟比较高,那么可以适当增加 TTL 值,让缓存更持久,短时间内请求同样域名的解析会直接从缓存中读取,实现秒解析。不过 最小TTL 值不宜过大,不然会导致记录不能及时更新,结果是网站无法正常打开。据博主观察目前多数域名的 TTL 值普遍在 300 以内,所以给出以下设置参考值:
- 覆盖最小 TTL 值:
600
- 覆盖最大 TTL 值:
84600
加密设置
设置管理页面使用 HTTPS 加密以及 AdGuard Home 自身的 DoH/DoT 功能,如果不对外开放服务,只是在本地局域网使用是用不到的。对外开放 DNS 服务在中国大陆可能会有 “法律” 风险,而部署在国外网络速度缓慢,所以对于普通用户而言加密设置就成了摆设。不过我还是开启了。
443端口被Nginx使用了,所以我用的4433。现在SSL证书三个月有效期,我不想手动更新,所以写了一个shell脚本帮我自动更新。简单来说就是自动把网站的泛域名证书文件移到容器目录下,宝塔设置一个自动任务,每天执行一次。
#!/bin/bash
# 定义源文件路径
fullchain_source="/www/server/panel/vhost/cert/note.xins.live/fullchain.pem"
privkey_source="/www/server/panel/vhost/cert/note.xins.live/privkey.pem"
# 定义目标目录
target_directory="/root/adguardhome/conf"
# 检查目标目录是否存在
if [ ! -d "$target_directory" ]; then
echo "目标目录 $target_directory 不存在。"
exit 1
fi
# 复制文件并覆盖
cp -f "$fullchain_source" "$target_directory/fullchain.pem"
cp -f "$privkey_source" "$target_directory/privkey.pem"
# 输出结果
if [ $? -eq 0 ]; then
echo "文件已成功复制到 $target_directory"
else
echo "复制文件时出错。"
fi
过滤器
DNS 黑名单
这里是人民群众喜闻乐见的去广告环节。那些规则都是部署在国外,我用国外服务器下载然后上传到阿里云oss,这样国内服务器更新规则也方便一些。
在国外服务器挂载一个oss空间,添加一个自动下载黑名单规则的计划任务,这样就中转好了。
#!/bin/bash
# 定义保存目录
SAVE_DIR="/www/wwwroot/AdGuard"
# 创建目录(如果不存在)
mkdir -p "$SAVE_DIR"
# 下载文件并重命名
curl -o "$SAVE_DIR/1.txt" "https://adguardteam.github.io/HostlistsRegistry/assets/filter_21.txt"
curl -o "$SAVE_DIR/2.txt" "https://cdn.jsdelivr.net/gh/o0HalfLife0o/list@master/ad.txt"
echo "文件已成功下载并保存到 $SAVE_DIR"
DNS 重写
在这里你可以方便的把一个域名指向一个 IP ,简单来说这个功能相当于 hosts 。
最典型的一个使用场景是把 DoH/DoT DNS 服务器的域名直接指向它们的 IP ,这样就不再需要进行我查我自己这样浪费时间的迷惑操作了,可进一步加快解析的速度。
参考文章
AdGuard Home 自建 DNS 防污染、去广告教程 #1 – 安装部署详解(Docker) – P3TERX ZONE
AdGuard Home 自建 DNS 防污染、去广告教程 #2 – 优化增强设置详解 – P3TERX ZONE