Docker 部署 AdGuard Home 以及配置(超详细)

前言

我尝试过别人的私人 dns,但是发现一是速度慢,二是部分广告规则影响了我的正常使用。故希望自己配置,能够自己管理规则,隐私也有更高的安全性。

部分小伙伴不清楚 ad Home 的作用,这里简要说明一下:

AdGuard Home 的作用:

  1. 主要还是去广告,对我来说,移动端的广告太多了:能够去掉大量 APP 的开屏广告、网页广告、公众号广告等等,只要是涉及域名解析的都能去掉大部分。
  2. 避免 dns 劫持和污染,能够一定程度上避免这个问题;
  3. 当然还有一些其他的功能,比如重定向等等,对我来说用不到。

我的环境说明:

云服务器

系统 Ubuntu

部署有宝塔面板,方便一些配置的可视化操作

安装好 Docker,就可以开始了。

部署 AdGuard Home

  1. 找一个你存放 adguard 的文件夹,建议新建一个 adguard 的文件夹,新建一个 docker 的部署 yaml: docker-compose.yml

    version: "3.9"
    
    services:
      adguardhome:
        image: adguard/adguardhome:latest
        restart: always
        container_name: adguardhome2
        ports:
          - 53:53/tcp
          - 53:53/udp
          - 3000:3000/tcp
          - 3000:3000/udp
          - 801:80/tcp
          - 801:80/udp
          - 4431:443/tcp
          - 4431:443/udp
          - 853:853/tcp
          - 853:853/udp
        volumes:
          - ./workdir:/opt/adguardhome/work
          - ./confdir:/opt/adguardhome/conf
    

    说明:

    1. 53 端口:默认 dns 端口,关于 53 端口,国内 ip 的服务器不允许在未备案的情况下进行 dns 解析服务。参考:相关政策法规要求 (tencent.com)
    2. 3000 端口:AdGuard Home 的默认安装端口
    3. 80 端口:前端 WebUI 的端口,这里由于我的宿主机 Nginx 已经占用了这个端口,所以我使用 801:80 的方式将宿主机的 801 端口映射到容器 adguardhome 的 80 端口上。
    4. 443 端口:doh 的默认端口,由于我 443 宿主机已经有服务使用了 443,所以用宿主机的 2345 进行映射
    5. 853 端口:dot 的默认端口
    6. volumes:主要是容器持久化数据到本地的目录映射,这里放在了当前目录下的两个目录中
  2. 到目录部署 docker 容器:

    docker-compose up -d
    

    ​​端口问题:如果提示端口被占用,请关闭该端口所在的服务,或者强制停止该进程即可。

    Ubuntu 关闭 53 端口的进程参考:systemd-resolved 服务占用端口使用第一部分,如果是别的进程占用了 53 端口,就杀掉进程。

    #永久停止该服务
    systemctl stop systemd-resolved
    systemctl disable systemd-resolved
    vim /etc/systemd/resolved.conf #修改dns字段,建议国内的随便一个公共dns即可114.114.114.114
    ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf
    
    #查看53端口的进程PID
    sudo lsof -i :53
     netstat -lnpt|grep 53
    # 杀掉该进程
    kill pid数字
    

image

提示 started,就说明运行成功了。

宝塔面板中也可以查看到

image

安装

  1. 访问 ip:3000 端口进行安装
    image

  2. 端口配置:这里是根据你的 docker-compose.yaml 来进行配置即可,也就是 docker 容器的端口。这里是 801:80​,宿主机是 801,docker 中是 80,所以就不用改。
    image

  3. 用户名看你自己配置

  4. 配置完成后会自动跳转到前端 WebUI 端口,docker-compose 中配置的是 801,所以我们访问 ip:801 即可

WebUI 前端配置

常规设置

路径:「设置」→「常规设置」

  1. 安全配置看你自己需求,〖家长控制〗不建议开启,国内环境似乎会出现 dns 解析问题;
  2. 统计配置和日志配置的保留时间看需求,如果不是公开给别人使用,不用保留很久也行。

DNS 设置

此选项卡中,设置一个版块就保存一个版块,避免有的保存不上。

路径:「设置」→「常规设置」

  1. 「上游 DNS 服务器」,上游 DNS 很大程度上决定了你的查询速度,策略选择均衡负载即可,或者根据自己的服务器的位置自定义查询快的。
    不建议使用纯数字的 DNS,用加密的,不然 DNS 依旧会被污染和劫持

    推荐使用如下:

    tls://dns.pub
    https://dns.pub/dns-query
    tls://dns.alidns.com
    https://dns.alidns.com/dns-query
    

    image

  2. 「Bootstrap DNS 服务器」:Bootstrap DNS 服务器里填你最快的 DNS 服务器用于解析上面的 DoT/DoH,建议使用本地运营商 DNS,或者百度下载一个 DNS 优选软件(来自 52pojie 分享),测试一下你最快的 DNS 填入即可。测试正常后,保存

    推荐使用如下:

    9.9.9.10
    149.112.112.10
    2620:fe::10
    2620:fe::fe:10
    

    image

  3. 「DNS 服务配置」:

    1. 「启用 EDNS 客户端子网」:启用。前面提及的上游 DNS 服务器都是支持 EDNS 技术的,它有助于获取到更合适的 CDN 节点,建议勾选;
    2. 「启用 DNSSEC」:启用。用于效验 DNS 记录的签名,防止 DNS 缓存被投毒,建议勾选。勾选后会在日志页面请求列显示小绿锁图标;
    3. 「禁用 IPv6 地址的解析」:根据需求启用,如果你要用 ipv6 解析(比如有的人需要访问内网 ipv6 搭建的 nas),就不用关闭。

    image

  4. 「DNS 缓存配置」:

    1. 「缓存大小」:104857600(100MB,大概能缓存 100w 条)。根据你需要设置,一般来越稍微大点好,第一次通过上游 dns 查询后,后面可以通过缓存来返回数据,会更快点。

    2. 「覆盖最小 TTL 值」:600 (Time To Live​ ttl 为 0 时,表示每次都是通过上游 dns 解析,就比较慢,设置时间后,在该 TTL 时间内,则是通过缓存直接返回解析结果,会更快。)

    3. 「覆盖最大 TTL 值」:3600

    4. 「乐观缓存」:开启

      image

  5. 到这一步就可以初步测试一下 53 端口的解析是否有效了。

    1. 第一种:在 wifi 连接的高级设置中,设置 dns 首选为你的服务器 ip(移动端同理),然后访问某个网页;

      image

    2. 第二种:采用 nslookup 命令更方便

      nslookup www.qq.com 服务器ip
      

      image

  6. 查询后在前端面板中「查看日志」:有日志就说明无加密 53 端口的 dns 服务成功了。

    image

宝塔域名解析以及证书

域名解析解析

在配置加密协议设置之前,我们需要配置域名解析,来指向这些解析服务。

  1. 到服务商设置域名解析,因为是服务器 IP,所以一般是添加 A 记录,由于我的域名托管到了 Cloudflare,所以在 cloudflare 添加 dns 记录。

  2. 这里你可以添加一个或者两个都可以,两个的目的是为了让 WebUI(80 端口)与 dns 解析服务的域名不一样,这里建议是两个。(但是我是用的一个,因为一个方便记忆,两个方便管理。)

  3. 此处我只添加了一条:注意在 CF 中,国内 IP 的服务器要关闭「代理状态」更好,因为国内走 CF 会增加延迟。image

  4. 在宝塔中添加一个网站,配置域名:「网站」→ 点击「添加网站」→ 输入域名 → 下方的 php 版本用不着,纯静态,因为这里的网站主要是用来反代 docker 中的服务的。

    image

域名反代、SSL 证书申请

在宝塔中继续之前的域名解析配置,开始反向代理设置和证书配置:

  1. 点击你添加的域名的「设置」→「反向代理」→「添加反向代理」:

  2. 首先是前端的 801 端口(容器中是 80 端口)的,添加后通过域名访问一下是否能够成功访问。

    image

  3. 然后是 doh 协议:这里的 4431 端口是宿主机的端口,443 是容器内部映射的,注意不要配置错了。目标 url 是配置容器映射到宿主机,也就是宿主机的端口。

    image

  4. 「SSL 证书」:点击「Let'sEncrypt」申请证书,验证方式默认是文件,注意申请的域名与你配置 dot、doh 协议的域名需要相同,保存即可。

    image

  5. 现在测试一下https:域名 的方式访问,测试 ssl 是否成功(是否有 🔒 的样子)

    image

dot、doh 加密设置

路径:「设置」→「加密设置」

加密配置

  1. 「启用加密(HTTPS、DNS-over-HTTPS、DNS-over-TLS)」:启用;
  2. 「服务器域名称」:输入域名;
  3. 「HTTPS 端口」:映射时 4431:443,根据容器的来,填 443 即可
  4. 「DNS-over-TLS 端口」:同上;
  5. 「DNS-over-QUIC 端口」:同上。

image

证书配置

「设置」→「加密设置」对证书进行配置,设置在宝塔中申请的 ssl 证书即可。

注意证书的主机名与你设置的域名相同。

image

验证 DOH

  1. 如果你之前宝塔的 doh 协议反代(容器 443 端口,宿主机 4431)已经设置了,就可以测试 doh 协议了。

    移动端安卓或者 ios 可以安装 app 〖intro〗 测试 dot 协议。edge 浏览器设置中可以设置 dns doh 协议:

    image

URL 填写:https://域名:端口/dns-query (此处的端口填写反代宿主机端口,也就是 4431,在容器中是 443)

  1. 访问随便一个域名网站后查看 AdGuard HOme 前端中的日志:能看到 doh 协议就说明配置成功。

    image

验证 DOT

dot 一般配置在安卓手机中,在「设置」→「更多链接」→「加密 DNS」中进行配置:

URL 填写域名即可,不用添加端口和协议,直接就是域名。

访问域名网站后,「查看日志」:看到 dot 就说明成功。

image

过滤器规则

推荐首推使用别人公开的私人 DNS 网站所使用的规则:

  1. 18bit DNS 规则列表
  2. BlueSkyXN/AdGuardHomeRules
  3. Potterli20/hosts: 冷莫(trli)

「黑名单」 我的推荐使用如下:

adgk手机去广告规则
https://ghproxy.net/https://raw.githubusercontent.com/banbendalao/ADgk/master/ADgk.txt
我说的对不对
https://raw.githubusercontent.com/qq5460168/dangchu/main/black.txt
大萌主
https://ghproxy.net/https://raw.githubusercontent.com/damengzhu/banad/main/jiekouAD.txt
消失的DD
https://ghproxy.net/https://raw.githubusercontent.com/afwfv/DD-AD/main/rule/dns.txt
酷安 那个谁520
https://raw.githubusercontent.com/qq5460168/dangchu/main/adhosts.txt
某群合并规则
https://mirror.ghproxy.com/raw.githubusercontent.com/qq5460168/666/master/rules.txt
trli's Ad Filter for Pro for AdguardHome
https://ghproxy.net/https://github.com/Potterli20/file/releases/download/ad-hosts-pro/ad-adguardhome.txt
杏子
https://adrules.top/adblock_plus.txt
AdGuardHomeRules
https://mirror.ghproxy.com/https://raw.githubusercontent.com/BlueSkyXN/AdGuardHomeRules/master/all.txt

FAQ

  1. 端口问题:有的 dot 和 doh 协议不生效,端口号填多少?

    • 容器中的,也就是 WebUI 中的端口都是填容器内的端口;而宝塔中的反向代理,都是填的容器协议映射到宿主机的端口号。具体可以参考部署时的映射文件 docker-compose.yaml 中的映射关系,比如 4431:443,那么就是宿主机 4431 映射到容器内的 443 端口,所以宝塔中的代理目录 /dns-query​就是填写 4431 端口,而容器内的就是填写 443。
  2. 证书问题:

    • 注意填写正确即可,宝塔和 AdGuard Home 中的位置是反着的。
  3. 延迟问题:

    • 审查上游 DNS 速度如何;广告规则是否冲突或者是否过多。主要就是这两个原因,然后就是缓存的时间和大小,别的因素根据实际情况依次递归审查。
  4. 关于 53 端口:

    1. 一般 linux 是 systemd-resolved 占用了 53 端口的,一般来说停止服务并关闭开机自启服务就好了。如果只是简单杀掉 kill 进程,重启服务器后,docker 可能会跑不起来,需要重新 kill 53 端口的进程。

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...