ADGuardHome从头开始
查看ADGuardHome的特性
除了DHCP服务我们不涉及以外,其他功能都是DNS相关
WebUI中比较简洁,可以设置的地方就两个地方
设置
常规设置
是否启用相关服务的设置
还有些日志设置,没啥好讲的,根据需求自行设置
⭐DNS设置
上游DNS服务器,也就是向哪台公共DNS服务器进行查询
⭐DNS服务器地址 填写我们之前获取到的地址即可
这一块是我们的ADGuardHome可玩性的核心,通过配置域名指定DNS服务器来提升获取到的IP质量,我建议自行根据规则手写DNS规则,注意这里我们只能填国内或国外的DNS,不能混合搭配,这可能导致解析到国外的CDN的IP,这会严重影响网络速度,同时如果某个DNS连接过慢,在最快的IP地址策略中也会影响速度,所以请不要写入国外的DNS
以下是基础配置1
2
3
4
5
6
7
8
9
10
11
12https://223.5.5.5/dns-query
# 或者tls协议
# tls://223.5.5.5
# 腾讯域名有时候阿里云会解析失败
[/qq.com/]https://1.12.12.12/dns-query
[/tencentmusic.com/]https://1.12.12.12/dns-query
[/tencent.com/]https://1.12.12.12/dns-query
[/tencent-cloud.com/]https://1.12.12.12/dns-query
[/tencentcloud.com/]https://1.12.12.12/dns-query
[/tencent-cloud.net/]https://1.12.12.12/dns-query⭐查询方式:ADGuardHome提供了三种DNS查询的方式
- 负载均衡 — 选取一台最常用最快的DNS服务器进行查询,加权随机算法排名进行逐个查询,直到有响应为止
- 并行请求—同时对列表中所有DNS服务器地址进行查询
- 最快的IP地址:在并行请求的基础上对获取的ip进行测速,获取最快的IP
我们的策略是IP质量>>DNS查询速度,所以我选择最快的IP地址,当然这建立在你的DNS服务器搭建在本地局域网环境,而不是云端,否则测速对你来说毫无意义
TIPS: 是我恶意揣测了,内部网络优化确实存在,不过应该不是能通过DNS查询到内部网络
我的配置
从最快IP地址改为选择并行请求,除非你只有一个唯一的上游服务器,这时它可能返回不同IP地址,你需要进行简单测试,区别确实很大,以下我们可以看到腾讯DNS返回qq.com的ip只有一个速度为32ms,阿里云有三个,其中有一个200ms,明显不行,这时候最快IP地址才拥有了作用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68(d:\\Repositories\\Code\\PythonHomeWork\\.conda) PS D:\\Repositories\\Code\\PythonHomeWork> nslookup qq.com 223.5.5.5
服务器: public1.alidns.com
Address: 223.5.5.5
非权威应答:
名称: qq.com
Addresses: 123.150.76.218
203.205.254.157
113.108.81.189
(d:\\Repositories\\Code\\PythonHomeWork\\.conda) PS D:\\Repositories\\Code\\PythonHomeWork>
(d:\\Repositories\\Code\\PythonHomeWork\\.conda) PS D:\\Repositories\\Code\\PythonHomeWork> nslookup qq.com 119.29.29.29
服务器: pdns.dnspod.cn
Address: 119.29.29.29
非权威应答:
名称: qq.com
Address: 157.255.219.143
(d:\\Repositories\\Code\\PythonHomeWork\\.conda) PS D:\\Repositories\\Code\\PythonHomeWork> ping 157.255.219.143
正在 Ping 157.255.219.143 具有 32 字节的数据:
来自 157.255.219.143 的回复: 字节=32 时间=31ms TTL=50
来自 157.255.219.143 的回复: 字节=32 时间=34ms TTL=50
来自 157.255.219.143 的回复: 字节=32 时间=34ms TTL=50
来自 157.255.219.143 的回复: 字节=32 时间=31ms TTL=50
157.255.219.143 的 Ping 统计信息:
数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
最短 = 31ms,最长 = 34ms,平均 = 32ms
(d:\\Repositories\\Code\\PythonHomeWork\\.conda) PS D:\\Repositories\\Code\\PythonHomeWork> ping 123.150.76.218
正在 Ping 123.150.76.218 具有 32 字节的数据:
来自 123.150.76.218 的回复: 字节=32 时间=28ms TTL=49
来自 123.150.76.218 的回复: 字节=32 时间=28ms TTL=49
来自 123.150.76.218 的回复: 字节=32 时间=28ms TTL=49
来自 123.150.76.218 的回复: 字节=32 时间=28ms TTL=49
123.150.76.218 的 Ping 统计信息:
数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
最短 = 28ms,最长 = 28ms,平均 = 28ms
(d:\\Repositories\\Code\\PythonHomeWork\\.conda) PS D:\\Repositories\\Code\\PythonHomeWork> ping 203.205.254.157
正在 Ping 203.205.254.157 具有 32 字节的数据:
来自 203.205.254.157 的回复: 字节=32 时间=206ms TTL=41
来自 203.205.254.157 的回复: 字节=32 时间=193ms TTL=41
来自 203.205.254.157 的回复: 字节=32 时间=200ms TTL=41
来自 203.205.254.157 的回复: 字节=32 时间=213ms TTL=41
203.205.254.157 的 Ping 统计信息:
数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
最短 = 193ms,最长 = 213ms,平均 = 203ms
(d:\\Repositories\\Code\\PythonHomeWork\\.conda) PS D:\\Repositories\\Code\\PythonHomeWork> ping 113.108.81.189
正在 Ping 113.108.81.189 具有 32 字节的数据:
来自 113.108.81.189 的回复: 字节=32 时间=32ms TTL=49
来自 113.108.81.189 的回复: 字节=32 时间=32ms TTL=49
来自 113.108.81.189 的回复: 字节=32 时间=32ms TTL=49
来自 113.108.81.189 的回复: 字节=32 时间=32ms TTL=49
113.108.81.189 的 Ping 统计信息:
数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
最短 = 32ms,最长 = 32ms,平均 = 32ms⭐后备DNS服务器,就是你上面填的DNS服务器没一个有结果的时候就使用
1
2
3https://1.12.12.12/dns-query
# 或者tls协议
# tls://1.12.12.12Bootstrap DNS 服务器
使用DOT/DOH协议时要对DNS服务器的域名进行解析,也就是这里是用来解析DNS服务器的域名的,如果不使用带域名的DNS服务器,这部分可为空
否则填写非域名的DNS服务器解析上游服务器,请确保可以解析上游域名,不要拿国外的去解析国内的域名,反之同理
我们上游没有配置含域名的DNS服务器,这部分不填写私人反向 DNS 服务器
本地域名查询用,家用不需要使用,什么叫本地域名查询,我们知道localhost对应着127.0.0.1,localhost就是本地域名,而127.0.0.1就是本机ip,系统中存在着一个本地的域名服务器,用于解析本地域名,以Windows为例
C:\Windows\System32\drivers\etc\hosts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21# Copyright (c) 1993-2009 Microsoft Corp.
#
# This is a sample HOSTS file used by Microsoft TCP/IP for Windows.
#
# This file contains the mappings of IP addresses to host names. Each
# entry should be kept on an individual line. The IP address should
# be placed in the first column followed by the corresponding host name.
# The IP address and the host name should be separated by at least one
# space.
#
# Additionally, comments (such as these) may be inserted on individual
# lines or following the machine name denoted by a '#' symbol.
#
# For example:
#
# 102.54.94.97 rhino.acme.com # source server
# 38.25.63.10 x.acme.com # x client host
# localhost name resolution is handled within DNS itself.
# 127.0.0.1 localhost
# ::1 localhost
DNS 服务配置
禁用IPV6地址的解析,看需求使用
拦截模式,也就是被域名规则匹配到拦截的域名,直接返回xx结果,可选的有很多,根据需求选择
- 默认:被 Adblock 规则拦截时反应为零 IP 地址(A记录:0.0.0.0;AAAA记录:::);被 /etc/hosts 规则拦截时反应为规则中指定 IP 地址
- REFUSED:以 REFUSED 码响应请求
- NXDOMAIN:以 NXDOMAIN 码响应
- 空 IP:以零 IP 地址响应(A 记录 0.0.0.0;AAAA 记录 ::)
- 自定义 IP:以手动设置的 IP 地址响应
屏蔽的 TTL 应答当TTL = 0 时表示IP地址无效,此时如果发起DNS请求,并且在DNS缓存中发现了该条查询记录也不会使用,而是重新向上游进行查询
这里我们设置较长TTL,就能减少垃圾AD不停发起DNS查询请求导致的ADGuardHome高负载
以下是我的配置被域名规则匹配到并且返回了IP时会携带一个TTL值,我们在上面ping的时候也看到了,TTL代表查询到的IP地址有效时间
⭐DNS 缓存配置
- 缓存大小 —一般设置不需要太大,通常TTL时间不会很长,家用环境很少能够短时间发生几万条不同的DNS查询请求
- 覆盖最小/大 TTL 值 — 修改服务器给的TTL值,控制DNS查询结果缓存保留时间
- 乐观缓存 — 无视TTL,直接返回缓存中的结果并重新查询新结果
以下是我的配置
仅将乐观缓存设置为True,其他不进行修改,国内DNS服务商默认给的TTL值很小,这会使得你每次请求都要重新DNS查询,乐观缓存可以缓解这一问题,当然也会造成部分网站要刷新一下的情况,根据个人需求调整
访问设置 — 这部分不属于DNS相关不展开讨论
加密设置
ADGuardHome作为DNS服务器同样可以设置查询DNS的解析,客户端向AGuardHome查询也是一次DNS查询,只是真正的DNS查询被ADGuardHome代理了,但是这部分内容我们在局域网中完成,无需设置加密,理论上不会被窃听
客户端设置
- 持久客户端: 单独设置使用ADGuardHome查询的客户端上面“DNS设置”配置
- 客户端的一些信息
DHCP设置:让ADGuardHome充当DHCP服务器,动态配置主机的IP地址,路由器一般情况下都有,特殊场景可能需要
过滤器
⭐DNS黑名单
大陆推荐配置:
- AdGuard DNS filter
- AdAway Default Blocklist
- CHN: AdRules DNS List
- CHN: anti-AD
基本上毒瘤酷安/喵趣漫画的广告就消失的9成,但很可惜微信朋友圈广告没法除去
DNS白名单
解除黑名单,有些规则可能误判了域名,白名单是解决黑名单失误使用的DNS重写
自定义DNS查询的结果
能够实现指定CNAME/指定IP操作
已阻止的服务
可视化过滤热门域名的服务—国外域名为主
自定义过滤规则,手写域名过滤配置文件
也是属于实践中配置自己的规则的,类似于手写拦截器黑白名单规则
以上作为一个普通用户的配置项就结束了
DNS分流
事情起因
众所周知的原因,国内DNS是没办法解析国外的网站的,这种现象我们称之为DNS污染
原理是将解析结果返回一个错误值,给出一个不可达的IP地址
解决方案
那么此时我们访问国外网站的时候就无法获取到正确的IP地址从而无法访问,而这一些国外网站的域名和IP地址会被存储在一个表中,让国内DNS遵守这个规则,这个规则我们称之为GFW ,我们需要将这个表中的域名地址交给能够解析这些网址的DNS服务器(也就是非大陆DNS服务器),至于获取到IP后如何访问这个IP就涉及到隧道代理等内容,此处不展开讨论
那么我们已经知道了要将GFW规则中的域名交给国外DNS服务器进行解析,那么此时我们该如何修改ADGuardHome设置呢
- 方案1:通过其他软件进行分流,例如MosDNS,SmartDNS,他们能够匹配域名然后指定该域名使用的DNS服务器
- 优点:设置起来简单,可以完全解决DNS泄露的问题
- 缺点:网络结构进一步复杂,毕竟需要多套一层,MosDNS以及SmartDNS本身也是“DNS服务器”,这就导致DNS查询路径变长,网络出问题不好排查,也更容易出问题,而且即便是不使用ADGuardHome也能使用
- 方案2:通过ADGuardHome的DNS规则为GFW规则中域名指定DNS服务器,单ADGuardHome配置
- 优点:网络结构简单,响应速度快,不依靠fallback(回滚)机制,能够统一去广告
- 缺点:配置文件可能稍微繁琐一些,不能保证DNS泄露问题,不能使用DNS乐观缓存(这个后面介绍原因)
实际操作
在ADGuardHome的WIKI中有这样一项说明:链接
Using specific upstreams for some domains is a common way to accelerate internet in China. For an example, see https://github.com/felixonmars/dnsmasq-china-list or any other of the many
dnsmasq
lists. These lists can be easily converted to a list for AdGuard Home:
1
2
3 Before: server=/0-100.com/114.114.114.114
After: [/0-100.com/]114.114.114.114The problem with these lists is that they may be too large. In this case you may want to load them from a separate file instead of setting all upstreams in AdGuard Home settings. To do that, simply specify the path to a file with your list in the
upstream_dns_file
field ofAdGuardHome.yaml
.
大概的有意思说,我们China用户需要从dnsmasq-china-list 中转换规则并替换AdGuardHome.yaml
中upstream_dns_file
的文件地址来加载配置文件,而不是在网页中编辑
而这个dnsmasq-china-list其实就是我们国内的域名地址,那么我们将国内的地址都指定了国内的DNS服务器,其他交给国外的DNS服务器,那么不就达到了解析所有网站的要求了吗
直接上转换好的规则文件
项目地址
https://github.com/Leev1s/FAK-DNS
1 | wget https://raw.githubusercontent.com/NakanoSanku/FAK-DNS/master/converted/FAK-DNS.txt -O <任意目录/FAK-DNS.txt> |
我是直接存放到adguarome的conf目录
1 | wget https://raw.githubusercontent.com/NakanoSanku/FAK-DNS/master/converted/FAK-DNS.txt -O /opt/adguardhome/conf/FAK-DNS.txt |
将配置文件下载到任意目录下并修改AdGuardHome.yaml
的upstream_dns_file
1 | upstream_dns_file: "/opt/adguardhome/conf/FAK-DNS.txt" |
重启ADGuardHome即可
1 | /opt/AdGuardHome/AdGuardHome -s restart |
当然我们不可能一直手动更新conf,所以配置crontab就可以了,具体自行搜索
🥳恭喜你!此时你就拥有了一台可以国内外流量分流的DNS服务器
下面来说说为什么不能开启DNS乐观缓存,发起远程DNS也就是查询国外的域名时是走隧道的,也就是通过VPS去进行DNS查询,而不是本机进行,如果是机场节点并且开启自动切换节点,很有可能两个节点的IP相差甚远,导致本地缓存的DNS服务失效了,总而言之乐观缓存对于远程DNS并不友好
🤡 但是很可惜此时你的DNS存在泄露的风险,同时此时你的DNS缓存并没有发挥到极致,而是使用上游DNS服务器告知的TTL,会出现经常向发起DNS查询的情况,这一情况其实我们上面就预料到了
同时加载大量DNS配置文件会要求你的设备性能和内存,如果你的adguardhome部署在硬路由上大概率会爆内存以及卡顿
So很可惜,这一方案虽然简单,但是存在比较大的缺陷
下一篇:MosDNS我们来配合双ADGuardhome组建更完美的家庭局域网DNS环境
- Title: ADGuardHome从头开始
- Author: Insider
- Created at : 2024-06-27 03:22:53
- Updated at : 2024-07-01 00:45:11
- Link: https://blog.katetseng.icu/2024/06/27/ADGuardHome从头开始/
- License: This work is licensed under CC BY-NC-SA 4.0.