树莓派Docker部署AdGuard Home

本文更新于2025年12月2日,改为Docker方法安装
设备:树莓派4B
系统:Ubuntu Server 24.03LTS

效果

部署过程

一、Docker部署

首先你需要创建两个文件夹用于存储adguard home的数据,任意位置均可。

接着直接执行命令创建容器:(把文件夹名字改了)

1
2
3
4
5
6
sudo docker run --name adguardhome \
--restart unless-stopped \
--network host \
-v /my/own/workdir:/opt/adguardhome/work \
-v /my/own/confdir:/opt/adguardhome/conf \
-d adguard/adguardhome

在上面的命令中,我使用的是host模式,host模式即直接使用宿主机的网络命名空间,而不创建虚拟网桥。使用host模式的好处是可以区分本地请求的客户端来源,如果不使用host模式,IP都会显示为Docker子网的网关IP,例如172.17.0.1

如果你本地不想走adguard home就随便,毕竟ubuntu server上也没什么广告对吧,解析速度也没什么追求对吧,那就用官方Docker Hub中提供的命令,即:

1
2
3
4
5
6
7
8
9
10
11
docker run --name adguardhome\
--restart unless-stopped\
-v /my/own/workdir:/opt/adguardhome/work\
-v /my/own/confdir:/opt/adguardhome/conf\
-p 53:53/tcp -p 53:53/udp\
-p 67:67/udp -p 68:68/udp\
-p 80:80/tcp -p 443:443/tcp -p 443:443/udp -p 3000:3000/tcp\
-p 853:853/tcp\
-p 784:784/udp -p 853:853/udp -p 8853:8853/udp\
-p 5443:5443/tcp -p 5443:5443/udp\
-d adguard/adguardhome

创建好容器后,管理面板的默认端口是3000。记得在防火墙中打开3000端口。

如果创建失败,报错可能提示端口53占用。大部分资料都提到了要关闭systemd-resolved这个服务,但实际上systemd-resolved 监听的是 127.0.0.53:53,不是监听的 127.0.0.1。之所以冲突是因为adguard home配置文件默认写的监听0.0.0.0,即本机的所有网络接口,则必然包含了127.0.0.53:53

所以我们只需在 conf/AdGuardHome.yaml 配置文件的 bind_hosts 那里修改为不要监听 0.0.0.0,而是监听 127.0.0.1 和本地局域网 ip,这样完全不用停用 systemd-resolved 服务。

systemd-resolved 是一个系统服务,负责管理系统的 DNS 解析。

直接修改conf/AdGuardHome.yamlbind_hosts部分为下面的内容:

1
2
3
bind_hosts:
- 127.0.0.1
- 192.168.3.40

其中,192.168.3.40是我树莓派的本地IP。如果需要ipv6就在下面加上::1和相应的ipv6的IP地址。

如果不希望树莓派本地的请求也走adguard home,就把127.0.0.1删掉,这样本地请求就走由systemd-resolved选定的服务器了。

上文部分内容引用了: https://blog.ehnap.com/posts/IT-Talks/servergeek-adguard-home.html

关于重启docker容器之类的命令就不在这写了。

执行命令查看一下53端口的使用情况:

1
2
3
4
$ sudo netstat -antp | grep '53'
tcp 0 0 192.168.3.40:53 0.0.0.0:* LISTEN 5525/AdGuardHome
tcp 0 0 127.0.0.53:53 0.0.0.0:* LISTEN 5618/systemd-resolv
tcp 0 0 127.0.0.54:53 0.0.0.0:* LISTEN 5618/systemd-resolv

现在,实现了adguard home和system-resolve互不干扰。(我没有监听本地)


二、配置

1. 修改上游DNS服务器

设置->DNS设置中修改上游 DNS 服务器,这里要使用解析速度快的。

下面有部分图片图文不符,因为文章内容有更新

我的配置:

1
2
3
4
5
223.5.5.5
223.6.6.6
119.29.29.29
https://dns.alidns.com/dns-query
https://doh.pub/dns-query

建议每个都ping一下。相关的DNS服务器可以百度一下,这里就不列举了。

下面的Bootstrap DNS 服务器配置填写两个你的运营商DNS服务器IP就可以了,我的是北京中国移动的,221.179.155.161 和 221.179.155.177

然后点测试上游,没问题就应用。


2. 关于负载均衡和并行请求选哪个

在上游DNS服务器配置的下方,有三个可用的请求模式

本人把前两个模式都试验了一下。其中,并行请求的请求速度是最快的,使用该模式后的平均解析时间一度达到了2ms。但是并行请求的问题是有的时候DNS直接解析失败,或有部分内容加载不出来,需要刷新多次。(但不排除是我上游DNS服务器的配置问题)

负载均衡的请求速度不如并行请求,但能保证请求的准确性和稳定性,使用负载均衡后不再出现网页加载不出来的情况。但是平均解析速度显著下降,一度最高达到150ms,但使用一周后可以降低到30ms左右。我认为这个模式是最稳妥的,我个人推荐使用这个模式。

最快的IP地址不推荐使用,因为它要等待所有服务器的响应。

如果还想增加解析速度,在本页面向下滑动至DNS 缓存配置部分,开启乐观缓存即可。


3. 修改速度限制

DNS 服务配置中,将速度限制改为0,然后保存


4. 配置DNS黑名单

这是adguard home的核心功能,原理是碰到黑名单里的域名就解析到错误的IP地址。

进入过滤器->DNS黑名单,修改DNS黑名单

把默认自带的AdGuard DNS filter勾选上,再在左下角“添加黑名单”里添加一个自定义列表:

https://gcore.jsdelivr.net/gh/217heidai/adblockfilters@main/rules/adblockdns.txt

这里不要添加太多,要不然会有一些奇怪的问题。经过我的测试,上面这个链接的屏蔽效果是比较好的,而且不会影响正常网站的使用。(除了墨迹天气打不开)


三、启动

对于mac系统,在设置->网络->详细信息中将DNS改为树莓派的IP即可

如果需要配置多个dns以方便切换,请参考https://blog.csdn.net/weixin_44722978/article/details/115463939 (以免树莓派宕机(bushi))


四、与“v2A”共存

由于树莓派上还有”v2A“,为实现这二者互不打扰,需要设置为redirect模式并关闭“防止DNS污染”(见官方文档https://v2raya.org/docs/advanced-application/advanced-dns/


原始文章

部署过程

一、安装

Adguard Home是开源的,官方也提供了详细的安装步骤:https://adguard-dns.io/kb/zh-CN/adguard-home/getting-started/

在github release下载最新的稳定版:https://github.com/AdguardTeam/AdGuardHome/releases/latest

将下载的压缩包放到树莓派的任意目录下,我放在了用户目录下。

解压:

1
2
tar -xzvf AdGuardHome_linux_arm64.tar.gz
# 将文件名替换为你的压缩包实际名字

进入到解压后文件夹内

1
cd AdGuardHome

将adguard home安装为服务:

1
./AdGuardHome -s install

记得在ufw中放行如下端口:

1
2
3
sudo ufw allow 3000
sudo ufw allow 80
sudo ufw allow 53

在浏览器中访问IP:3000就可以看到安装界面了

点击下一步,这两个端口默认即可,上面也可以换一个,比如3001,记得在ufw中放行

我这里提示53端口被systemd-resolved进程占用了,关掉它就行:

1
2
sudo systemctl stop systemd-resolved
sudo systemctl disable systemd-resolved

设置密码后,就安装成功了!


本文使用CC BY-NC-SA 4.0协议进行许可