AdGuardHome 部署与使用指北

作为一个每天高强度网上冲浪的先锋青年,难免遭遇各类广告狂轰烂炸,然而,这一切都只发生在我遇到 AdGuard 之前。 AdGuard 系列软件中,基于DNS过滤的 AdGuardHome 无疑是最实用的,所以今天就简单记录一下部署过程和一些配置要点。

一点小说明 为达演示效果,本教程为物理机部署 在大多数情况下,更推荐使用容器部署,其部署、维护以及迁移都要简单许多~

准备工作

AdGuardHome 作为开源软件,可以在 Github Releases 上获取其发行版本,可以看到其几乎支持所有系统环境,Linux、Mac或是Windows,同样的甚至可以在 Android 设备上通过终端来安装运行。当然,这篇文章以CentOS上的部署为例,所以首先需要一台具有公网IP的 CentOS 服务器,其次为了实现 DoH/DoT1,还需要一个域名

假如这些你都有了,那么将有如下准备工作:

  • 将域名解析到服务器。 通常我们使用二级域名来做这件事,如:dns.example.com,在域名控制台处添加一个A类记录,把域名指向服务器公网IP即可。  
  • 为域名申请一个SSL证书 顾名思义,DoH 是基于 Https 的,所以一个SSL证书是必不可少的。一般来说,域名服务商是提供一些免费证书的。总之不管怎么样,得整一个。下载证书上传至服务器待用,格式选择 Nginx 或者通用格式即可。  
  • 安装Nginx 实现功能需要用到 Nginx 的反向代理,因此服务器上需要安装 Nginx。推荐使用yum安装,此步骤不赘述。
     
  • 预留2个未被占用的端口,本例中:
    • 8443:用于 AdGuardHome 仪表盘以及 DoH 服务,不需要在防火墙放行
    • 853:用于 DoT 服务,需要在防火墙放行

安装

完成准备工作后,即可开始部署。首先在服务器上选定 一块风水宝地 一个路径,下载 AdGuardHome 发行版,这个需要注意一下服务器架构,如本例64位使用AdGuardHome_linux_amd64.tar.gz。下载完成解压并为主程序赋予执行权限,一般的有如下命令:

1
2
3
wget https://github.com/AdguardTeam/AdGuardHome/releases/download/v0.107.6/AdGuardHome_linux_amd64.tar.gz
tar -zvxf AdGuardHome_linux_amd64.tar.gz && rm -rf AdGuardHome_linux_amd64.tar.gz
chmod +x ./AdGuardHome/AdGuardHome

完成以上步骤后,执行./AdGuardHome -s install安装程序,程序将进行初始化。此后可通过如下命令对 AdGuardHome 进行管理

1
2
3
4
5
6
7
8
#启动
systemctl start AdGuardHome
#开机自启
systemctl enable AdGuardHome
#重启
systemctl restart AdGuardHome
#停止
systemctl stop AdGuardHome

安装完成后需要临时开放3000端口,访问IP:3000在引导页面进行下一步操作。

初始化

进入引导界面后,如下图,首先就要求设置网页管理端口和DNS服务端口。 管理界面相当于 AdGuardHome 的控制面板(下文以 仪表盘 代指),默认的80端口通常可能有其他用途,将其更改为准备阶段预留的端口(本例为8443)。DNS服务端口保持53即可,可通过防火墙决定是否使用2 ![1][1]

接下来是为管理仪表盘设置账户密码,按需设置即可,无需赘述。 完成引导后,将目光先转向 Nginx ,为管理页面和 DoH 配置代理,建立一个新的站点配置vim /etc/nginx/conf.d/adguard.conf,参考内容如下:

 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
server {
    listen 80;
    listen 443 ssl http2;
    server_name dns.example.com;  #这里填写域名
    index index.php index.html index.htm default.php default.htm default.html
    root /usr/share/nginx/html;   #网站根目录,指定一个空文件夹即可

    #日志配置 可删除以使用默认
    access_log  /data/web/log/dns/access.log;
    error_log  /data/web/log/dns/error.log;

    #强制HTTPS
    if ($server_port !~ 443){
            rewrite ^(/.*)$ https://$host$1 permanent;
    }

    # HTTPS证书
    ssl_certificate    /etc/nginx/cert/dns/fullchain.pem;
    ssl_certificate_key    /etc/nginx/cert/dns/privkey.pem;

    #反向代理仪表盘
    location ^~ / {
            proxy_pass https://127.0.0.1:8443/;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header REMOTE-HOST $remote_addr;
    }

    #反向代理DoH
    location ^~ /dns-query {
            proxy_pass https://127.0.0.1:8443;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header REMOTE-HOST $remote_addr;
    }
}

需要注意的配置项如下:

  • server_name:准备阶段预定的域名,如dns.example.com
  • access_logerror_log:日志文件路径,可按需配置,亦可删除。
  • ssl_certificatessl_certificate_key为证书路径,即准备阶段申请的证书,前者为证书后者为私钥。
  • proxy_pass:反代配置,需要将其中端口修改为预留的仪表盘端口(注意有两处),如本例使用8443

完成配置后,使用nginx -t检查配置,无误即可重启 nginx 服务:systemctl restart nginx。此时应可以通过https://dns.example.com访问到仪表盘,在防火墙中关闭3000端口,然后将目光移回仪表盘。

配置

进入仪表盘 > 设置 > 加密设置,进行如下配置: 2

其中服务器地址即准备的域名:dns.example.com;HTTPS 端口即准备的仪表盘以及 DoH 端口:8443;DNS-over-TLS 端口即准备的 DoT 端口:853;DNS-over-QUIC 端口建议留空,如需要则需另外指定端口并于防火墙放行;证书与私钥与前步中 nginx 配置相同,配置无误选择保存配置并重启 AdGuard 服务

完成加密配置后,再转向仪表盘 > 设置 > DNS设置,应有如下设置项:

1、上游 DNS 服务器

AdGuard 收到DNS解析请求时,会请求上游 DNS 服务器获得结果再返回。服务器在国内的话,推荐使用阿里和腾讯的 DoH、DoT 地址,同时直接使用IP地址,避免解析 DoH 域名再请求 Bootstrap DNS 服务器导致的时延。如下为推荐配置:

1
2
3
4
5
6
tls://223.5.5.5:853
tls://223.6.6.6:853
https://223.5.5.5/dns-query
https://223.6.6.6/dns-query
https://1.12.12.12/dns-query
https://120.53.53.53/dns-query

请求策略推荐:负载均衡并行请求,可按实际效果调整

  • Bootstrap DNS 服务器 前文已经提到,DoH、DoT 通常为域名形式,请求上游 DNS 服务器之前还要通过 Bootstrap DNS 服务器来解析上游DNS服务器域名,因此此处只能使用IP地址,推荐根据服务器宽带运营商来选择,如我是电信宽带,所以设置为114.114.114.114,建议设置1-3个,不宜过多。

配置完成选择测试上游 DNS,然后保存。理论上应测试当很快返回通过,如比较慢可能某个上游 DNS 或 Bootstrap DNS 存在连通问题,需要排查并且更换。

2、DNS 服务配置

主要为速度限制和拦截模式,例如我自用则将速度限制设置为0,保证效率;拦截模式3保持默认即可。

3、DNS 缓存配置

缓存有助于提高解析效率,毕竟向上游请求是需要时间的,从缓存中查询则是毫秒级。根据服务器运存配置,缓存可以相对设置大一些,可以明显提升速度,但不宜过大。
TTL表示该条DNS解析记录有效期,当过期时客户端将重新请求,如果访问量较大可适当按需求设置 覆盖最小 TTL 值 ,不建议超过10分钟 乐观缓存建议开启。

使用

完成以上步骤后,终于算是走到了尾声,然而使用前,我们还需要到过滤器 > DNS封锁清单中添加一些规则订阅,帮助我们判断什么请求是广告。 可以看到 AdGuard 是有一些推荐过滤器的,并且包含两个默认过滤器,当然光有这些还不够,我们可以访问 AdGuard 官网提供的列表按需添加,按例这里也推荐几个:

名称 地址 简介
anti-AD https://anti-ad.net/easylist.txt 号称致力于成为中文区命中率最高的广告过滤列表
HalfLife https://cdn.jsdelivr.net/gh/o0HalfLife0o/list@master/ad-pc.txt 知名规则,合并自EasylistChina、EasylistLite、CJX’sAnnoyance
Adgk https://cdn.jsdelivr.net/gh/banbendalao/ADgk@master/ADgk.txt 知名规则,侧重于手机端广告
Steam Hosts https://github.com/fordes123/steam_hosts 帮助直连Steam
Github520 https://raw.hellogithub.com/hosts 帮助直连Github

(最近撸了小程序,用来合并 AdGuard 规则: adg-rule提供规则订阅也可以利用 GithubAction 实现定制化自动更新,有兴趣的话了解一下呗~)

添加完规则,终于我们可以开始享用了,这时我们的DNS地址如下:

  • DoH (DNS over HTTPS):https://dns.example.com/dns-query
  • DoT (DNS over TLS): tls://dns.example.com

各类型设备设置加密 DNS 位置如下(根据系统等差异略有差别,请以具体情况为准):

  • iOS/iPad OS 14.0及以上 iPhone 和 iPad 最新系统已经支持,只是需要安装描述文件才能开启,需要手动生成一个配置文件(内容格式可参考 encrypted-dns)。在文件管理中打开配置文件,然后去设置 > 已下载的描述文件 > 安装(可能提示警告) > 完成。最后可以在 设置 > 通用 > VPN与网络 > DNS,看到刚安装的文件,至此已经设置完成。
     
  • 安卓 9 及以上 原生安卓:设置 > 网络和互联网 > 高级-私人DNS(Private DNS),手动输入 DoT 地址(只支持DoT),无需前缀的tls:// 只需要:dns.example.com 小米MIUI:设置 > 连接与共享 > 私人DNS,手动输入DoT(只支持DoT),例如:dns.example.com 华为EMUI:设置 > 无线和网络 > 加密DNS,手动输入DoT(只支持DoT),例如:dns.example.com 其他安卓机型类似,如果没有,可下载第三方软件实现。
     
  • Windows10 及以上 截至目前,正式版还没支持,加入Windows测试(Beta)后, 设置 > 网络和Internet > WIFI/以太网 > DNS服务器,开启DoH 选项。在首选DNS中填入服务器IP,在DNS over HTTPS模板自定义中填入 DoH 地址,如:https://dns.example.com/dns-query,完成后保存。 此外,尚未支持的版本可通过改注册表,第三方软件等方式开启 DoH/DoT,由于该功能早晚合入正式版,在此不赘述。
     
  • Chrome浏览器(桌面端) 设置 > 隐私设置和安全性 > 安全 > 高级 > 使用安全DNS > 自定义,输入 DoH地址,如:https://dns.example.com/dns-query
     
  • Firefox浏览器(桌面端) 设置 > 常规 > 网络设置 > 设置 > 启用基于 HTTPS 的 DNS > 自定义,输入 DoH地址,如:https://dns.example.com/dns-query

完成设置后,网页访问 DNS检测,看看DNS地址是否与我们服务器运营商地址一致。也可以结合AdGuardHome查询日志判断。

疑难解答

  • Q:使用 AdGuardHome 有什么好处?
  • A:AdGuardHome 基于 DNS 实现拦截和过滤,恰当的配置后可以帮助拦截一些网络跟踪器和广告,同时也可以一定程度上解决 DNS 劫持与污染,保护隐私和上网体验。
     
  • Q:AdGuardHome 支持什么规则/规则怎么写?
  • A:AdGuardHome 的过滤规则兼容 Adblock 语法、Hosts 语法及 Domain-only 语法。具体规则可在官方 知识库 查看。
     
  • Q:使用 AdGuardHome 可以完全避免 DNS 污染吗?
  • A:显然不可以。经过上文配置流程不难发现 AdGuardHome 本质上只是中转,DNS 污染在上游就存在。但至少你可以选择相对干净的 DNS,这已经是极大的提升了。
     
  • Q:去广告效果不好/有些广告去不掉?
  • A:首先有针对性的添加广告规则;其次,AdGuardHome 不是万能的,某些广告不能通过DNS去除,可搭配 AdGuardHome 客户端/浏览器插件使用
     
  • Q:出现误杀,某地方正常内容被拦截了?
  • A:排查规则;通过过滤日志排查,添加白名单
     
  • Q:设置DNS后速度很慢?
  • A:排查DNS设置,如服务器和网络没问题的话
     
  • Q:如何让国内和国外的域名使用不同的上游解析?
  • A:AdGuardHome 本身并不支持分流,当然可以通过直接在 DNS中添加上游解析信息来实现,不过更建议物理增加分流层,比如部署 SmartDNS、MosDNS 作为 AdGuardHome 上游

部分内容参考自:石头实验-加密DNS,为你的设备开启DoH或DoT


  1. DNS over HTTPS(缩写:DoH)是一个进行安全化的域名解析方案。其意义在于以加密的HTTPS协议进行DNS解析请求,避免原始DNS协议中用户的DNS解析请求被窃听或者修改的问题(例如中间人攻击)来达到保护用户隐私的目的。Google及Mozilla基金会正在测试此协议,提高网络安全性。   ↩︎

  2. 根据我国相关法规,在公网上建立 DNS 解析服务需要申请相关资质并进行备案,运营商可能会扫描53端口进行检查。因此在国内不推荐开放相应端口,使用 DoH/DoT 即可,也更加安全。 ↩︎

  3. 如需要通过 hosts 规则进行重新解析实现直连加速(比如上文提到的 Github520、Steam Hosts 规则),那么需要保持拦截模式为 默认 ↩︎