关于部署和使用 AdGuard Home 的一些经验心得体会

AdGuard Home

https://github.com/AdguardTeam/AdGuardHome

简单地说,AdGuard Home 是一个 DNS 服务器软件。官方的描述是,你和你的设备的隐私保护中心,免费、开源、强大的屏蔽广告和跟踪器的 DNS 服务器。

得益于 AdGuard Home 的易用的图形化界面,即使是一个普通用户,也可以轻松地在自己的电脑或者路由器中部署自己的 DNS 服务器。

Openwrt 使用、设置 AdGuard Home

本文基于在 Openwrt 22 及 23 版本使用 AdGuard Home 的经验写就,不同版本可能略有不同。

安装

opkg 中有现成的 adguardhome 包,直接通过 luci 或者 ssh 安装即可。安装好后它会自动启动。

修改 Dnsmasq 默认端口

Openwrt 中默认使用 dnsmasq 作为 DNS 服务器,就会占用 DNS 的 53 端口。要使用 AdGuard Home 就需要做出一些修改,一般有两种方案:

  • 一是继续使用 dnsmasq 使用 53 端口作为默认 DNS 服务器,AdGuard Home 使用其他端口。通过设置转发或者设置上游的方式将 AdGuard Home 作为 dnsmasq 的上游 DNS 服务器。但这样在 AdGuard Home 无法得知查询 DNS 的客户端,使得部分日志和统计功能变得无意义。
  • 另外一种就是 AdGuard Home 使用 53 端口作为默认的 DNS 服务器,dnsmasq 则使用其他端口。

个人倾向于后者。

因此需要现在 network - DHCP and DNS 页面的 Devices & Ports 设置中将 dnsmasq 的 DNS 服务端口(DNS server port)从 53 修改为其他端口,例如 5353.

初始化配置

通过 opkg 安装 AdGuard Home 后,已自动将 AdGuard Home 添加为启动项并启动。浏览器打开 http://<路由器地址>:3000 即可进入 AdGuard Home 的初始配置界面。根据提示设定 AdGuard Home 网页服务的账号和密码、AdGuard Home 网页服务绑定的接口和端口、DNS 服务器绑定的接口和端口。

页面还有清晰的指引,告知用户如何在不同的终端设备上 设定 DNS 查询使用 AdGuard Home。

出于安全考虑,应避免将网页服务、和 DNS 服务暴露在公网中。

出于安全考虑,应使用具有一定强度的密码。

如果希望通过 IPv6 使用 AdGuard Home,不要为 DNS 服务器绑定 IPv4 地址。

完成初始化配置后,AdGuard Home 会重启。

具体设置

完成初始化配置后,通过设定的网页地址和端口进入 AdGuard Home 控制面板。可以为 AdGuard Home 配置更多具体的设置,笔者不作详细介绍,只分享一些个人经验。

常规设置(General setting)

  • AdGuard 浏览安全、家长控制等功能由于国内众所周知原因无法启用,启用后可能无法上网。
  • 日志保留时间以及统计数据保留时间不要设置太长,尤其是低配置的设备,容易崩。例如日志我只保留 1 小时,统计保留 24 小时。

加密设置(Encryption settings)

  • 对于内网使用,一般不必设置加密。

DHCP 设置(DHCP settings)

  • 个人并不是十分信任 AdGuard Home 的可靠性,因此不建议启用 AdGuard Home 的 DHCP 服务器。避免因为 AdGuard Home 崩溃,导致 DHCP 也无法使用。

DNS 设置(DNS settings)

  • 知名的公共 DNS 服务器可从 Known DNS Providers 获取。
  • 上游 DNS、后备 DNS、Bootstrap DNS 均建议使用 DOT、DOH、DOQ 等协议,避免 DNS 被劫持。
  • 如果上游 DNS 使用域名形式且对应 IP 地址不经常变动,建议写进 host,节约从 Bootstrap DNS 服务器解析上游 DNS 服务器域名的时间。也能避免上游 DNS 的域名被污染(这里指的上游 DNS 的域名被 Bootstrap 污染,与上游 DNS 提供的 DNS 是否被污染无关)。
  • 设置私人反向 DNS:由于没有使用 AdGuard Home 的 DHCP 服务,AdGuard Home 无法解析私人反向 DNS(即将局域网地址反向解析为对应主机名,例如将 192.168.1.1 反向解析为 openwrt)。通过将 dnsmasq 的 DNS 地址(例如前文提到的 127.0.0.1:5353[::1]:5353)作为私人反向 DNS 即可解决此问题。
  • 本地主机查询:与上一项类似, AdGuard Home 可能无法解析本地域,可以添加例如 [/*.lan/]127.0.0.1:5353 到上游服务器中,以将本地域查询转发至 dnsmasq。
  • DNS 策略:如果选择使用最快的 IP 地址(Fastest IP Address)策略,建议使用少且快的上游 DNS 服务器,否则会起反效果。
  • 默认客户端速度限制较低,如有需要可以适当提高。
  • 开启 EDNS 客户端子网(ECS)理论上可以从支持 ECS 的上游 DNS 服务器获取到更合适的 IP 地址。
  • DNSSEC 对保护 DNS 有一些帮助,聊胜于无,建议开启。
  • 过滤器封禁模式(Blocking mode): 决定以什么形式响应被过滤器过滤的主机名。一些应用,例如浏览器,当访问的主机名被封禁,例如如果 DNS 返回的形式是 0.0.0.0,一些应用可能不会及时中断连接,从而导致使用体验不佳。(未经严格验证,仅个人感觉。)
  • 缓存大小可以根据设备的性能和个人喜好适当调整。

过滤器设置

  • 类似于 host 封禁,可添加主流的广告屏蔽器列表达到屏蔽广告、跟踪器的效果,相当于一个前置过滤,无需终端设备的支持。
  • 同样地,应该根据设备的性能添加适当的过滤器,不宜过多。
  • 这种基于主机名的广告屏蔽器在实践中的效果聊胜于无,它更适合用于屏蔽跟踪器、恶意网站等等。如果需要更好的广告屏蔽效果,依然建议使用专门的广告过滤软件/插件。
  • 在路由器上添加推荐的过滤器可能会遇到众所周知的网络问题,可以尝试使用镜像服务。
  • 关于众所周知的网络问题,在我个人的使用经验中,如果直接在 AdGuard Home 控制面板中添加推荐的过滤器常常会失败、无法添加。但如果我在个人电脑上部署 AdGuard Home 并解决网络问题后在电脑上的 AdGuard Home 完成添加过滤器,然后再将配置文件中相应的内容以及过滤器的数据文件手动上传至路由器的 AdGuard Home 中,那么之后 AdGuard Home 即使没有网络工具也可以完成过滤器文件的更新,这是一个玄学的问题。

通过 DHCP 通报默认 DNS 地址

经过上述的设置,一个基于 AdGuard Home 的个人 DNS 服务器已经部署完成,但仍需要在各个设备上修改 DNS 地址。通过修改 DHCP 选项,可以让连接到路由器的设备默认使用指定的 DNS 服务器。

打开 network - interfaces 页面,编辑 lan 接口,转到 DHCP Server 选项卡,转到高级设定,可以看到有一项 DHCP 选项(DHCP-Options),底下的说明就介绍了如何设定向 DHCP 客户端通报的 DNS 地址,我们甚至不需要去查询 DHCP 的文档。

例如,在 DHCP 选项(DHCP-Options)中新增一项 “6,192.168.2.1”,意为向 DHCP 客户端通报应使用 192.168.2.1 作为 DNS 查询服务器。

建议设置两个地址,一个为 AdGuard Home 的地址,另一个则为公共 DNS 或者运营商的 DNS,避免因 AdGuard Home 崩溃造成无法访问网络。例如 “6,192.168.2.1,1.0.0.1

设置 Openwrt 使用的 DNS

安装 AdGuard Home 一段时间后查看 AdGuard Home 的日志,发现有很多来自 localhost 的本地域查询、PTR 查询。一来不开启 DHCP 的 AdGuard Home 本身无法处理这些查询,而需要让 dnsmasq 处理。二来这样的意义不大的查询多了之后,会影响查看日志的观感和数据统计功能。

因此我建议将 openwrt 所使用的 DNS 修改为 dnsmasq,这样本地查询就不会出现在 AdGuard Home 的日志中。方法步骤如下:

让 dnsmasq 忽略上级网关通报的 DNS

在 network - DHCP and DNS 页面的 Resolv & Hosts Files 选项卡中,勾选忽略 resolv 文件 (Ignore resolv file)。这个文件是上级网关通报的默认 DNS,一般为运营商的 DNS。

如果不这样做,dnsmasq 将会把这些运营商 DNS 作为上游进行 DNS 查询。

将 dnsmasq 的上游设置 AdGuard Home

在 network - DHCP and DNS 页面的 Forwards 选项卡中,将 DNS 转发(DNS Forwards)设定为 AdGuard Home 的地址,例如 127.0.0.1::1localhost。意为将其作为 dnsmasq 的上游 DNS。

如果不这样做,openwrt 本身将无法访问互联网主机。因为在上一步中已经将默认的 DNS 上游取消了。

将 Opnewrt 的 DNS 设置为 dnsmasq

openwrt 自身的 DNS 设定存储于 /etc/resolv.conf,如果它是一个链接,则将它删除重建。默认情况下,openwrt 使用127.0.0.1:53用作 DNS 查询,在前文中 53 端口已用作 AdGuard Home 的 DNS 监听端口, 5353端口才是 dnsmasq 的监听端口。 将 /etc/resolv.conf 文件如下所示进行修改:

1
2
3
4
5
  search lan
- nameserver 127.0.0.1
+ nameserver 127.0.0.1:5353
- nameserver ::1
+ nameserver [::1]:5353
Built with Hugo
Theme Stack designed by Jimmy