ADGuardHome从头开始

Insider Lv1

查看ADGuardHome的特性

除了DHCP服务我们不涉及以外,其他功能都是DNS相关

https://s2.loli.net/2024/06/26/qD23R5SiZvNMu1d.png

WebUI中比较简洁,可以设置的地方就两个地方

https://s2.loli.net/2024/06/26/Rv1b9zOstWFneDS.png

设置

常规设置

是否启用相关服务的设置

https://s2.loli.net/2024/06/26/T58W34uoIzfGF2X.png

还有些日志设置,没啥好讲的,根据需求自行设置

⭐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
      12
      https://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
      3
      https://1.12.12.12/dns-query
      # 或者tls协议
      # tls://1.12.12.12
    • Bootstrap 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地址有效时间

      https://s2.loli.net/2024/06/27/BaDRPkoe8SY4jMC.png

  • ⭐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查询的结果

    https://s2.loli.net/2024/06/26/Jebd2GCKRmxqN5k.png

    能够实现指定CNAME/指定IP操作

  • 已阻止的服务

    可视化过滤热门域名的服务—国外域名为主

  • 自定义过滤规则,手写域名过滤配置文件
    也是属于实践中配置自己的规则的,类似于手写拦截器黑白名单规则

以上作为一个普通用户的配置项就结束了

DNS分流

事情起因

众所周知的原因,国内DNS是没办法解析国外的网站的,这种现象我们称之为DNS污染

原理是将解析结果返回一个错误值,给出一个不可达的IP地址

解决方案

那么此时我们访问国外网站的时候就无法获取到正确的IP地址从而无法访问,而这一些国外网站的域名和IP地址会被存储在一个表中,让国内DNS遵守这个规则,这个规则我们称之为GFW ,我们需要将这个表中的域名地址交给能够解析这些网址的DNS服务器(也就是非大陆DNS服务器),至于获取到IP后如何访问这个IP就涉及到隧道代理等内容,此处不展开讨论

那么我们已经知道了要将GFW规则中的域名交给国外DNS服务器进行解析,那么此时我们该如何修改ADGuardHome设置呢

  1. 方案1:通过其他软件进行分流,例如MosDNS,SmartDNS,他们能够匹配域名然后指定该域名使用的DNS服务器
    • 优点:设置起来简单,可以完全解决DNS泄露的问题
    • 缺点:网络结构进一步复杂,毕竟需要多套一层,MosDNS以及SmartDNS本身也是“DNS服务器”,这就导致DNS查询路径变长,网络出问题不好排查,也更容易出问题,而且即便是不使用ADGuardHome也能使用
  2. 方案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.114

The 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 of AdGuardHome.yaml.

大概的有意思说,我们China用户需要从dnsmasq-china-list 中转换规则并替换AdGuardHome.yamlupstream_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.yamlupstream_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.
Comments