常见问题
为什么 AdGuard Home 无法拦截广告或阻止其他威胁?
假设用户希望 AdGuard Home 拦截 somebadsite.com,但由于某些原因无法拦截它。 让我们试图解决这个问题。
可能的原因是,用户尚未配置设备使用 AdGuard Home 作为默认 DNS 服务器。 要检查 AdGuard Home 是否默认 DNS 服务器请执行以下操作:
在 Windows 上,打开命令提示符 (「开始」→「运行」→
cmd.exe)。 在其他系统上,打开终端应用程序。执行
nslookup example.org。 它将打印如下内容:Server: 192.168.0.1
Address: 192.168.0.1#53
Non-authoritative answer:
Name: example.org
Address: <IPv4>
Name: example.org
Address: <IPv6>检查
ServerIP 地址是否为 AdGuard Home 运行的 IP 地址。 如果不是,请配置设备。 请参阅了解如何操作。确保您的
example.org请求显示在 AdGuard Home 用户界面的「查询日志」页面上。 如果没有,要将 AdGuard Home 配置为侦听指定的网络接口。 最简单的设置方法是使用默认设置重新安装 AdGuard Home。
如果您的设备使用 AdGuard Home 作为默认 DNS 服务器,但问题仍然存在,那么原因可能是 AdGuard Home 配置错误。 请检查以下设置:
在「设置」→「常规设置」页面上启用「使用过滤器和 Hosts 文件以拦截指定域名」设置。
在同一页面上启用适当的安全机制,例如「家长控制」。
在「过滤器」→「DNS 拦截列表」页面上启用相应的过滤器。
在「过滤器」→「DNS 白名单」页面上没有任何例外规则列表可能允许启用请求。
在「过滤器」→「DNS 重写」页面上没有任何可能干扰的 DNS 重写。
在「过滤器」→「自定义过滤规则」页面上没有任何可能干扰的自定义过滤规则。
查询日志中的「按 CNAME 或 IP 拦截」是什么意思?
AdGuard Home 检查 DNS 请求和 DNS 响应,以防止称为 CNAME 伪装的广告拦截规避技术。 如果用户的过滤规则包含域名,例如 tracker.example,并且其他域名的 DNS 响应,例如 blogs.example,在其 CNAME 记录中包含此域名,则该响应将被拦截,因为它实际上指向被拦截的跟踪服务。
在哪里可以查看日志?
纯文本日志的默认位置 (不要与查询日志混淆) 取决于操作系统和安装模式:
OpenWrt Linux: 使用
logread -e AdGuardHome命令。带有 systemd 的 Linux 系统和其他带有 SysV-style init 的 Unix 系统:
/var/log/AdGuardHome.err。macOS:
/var/log/AdGuardHome.stderr.log。带有 Snapcraft 的 Linux 系统使用
snap logs adguard-home命令。FreeBSD:
/var/log/daemon.log。OpenBSD:
/var/log/daemon。Windows: 使用 Windows 事件日志。
如何配置 AdGuard Home 以写入详细级别的日志?
若要解决复杂的问题,有时需要详细级别的日志记录。 启用方法如下:
停止 AdGuard Home:
./AdGuardHome -s stop配置 AdGuard Home 以写入详细级别的日志:
在编辑器中打开
AdGuardHome.yaml。将
log.file设置为日志文件的所需路径,例如/tmp/aghlog.txt。 请注意,该目录必须存在。将
log.verbose设置为true。
重新启动 AdGuard Home 并重现问题:
./AdGuardHome -s start完成调试后,将
log.verbose设置为false。
如何显示自定义拦截页面?
在执行操作之前,请注意,现代浏览器设置为使用 HTTPS,因此它们会验证 Web 服务器证书的真实性。 这意味着使用其中任何一个证书将导致出现一个警告。
有许多扩展被建议使用,如果得到客户端的合理支持,它们将提供更好的用户体验,包括 RFC 8914 Extended DNS Error codes 和 DNS Access Denied Error Page RFC draft。 当浏览器开始支持它们时,我们将应用它们。
先决条件
要使用这些方法中的任何一种来显示自定义拦截页面,用户需要在某个 IP 地址上运行的 HTTP 服务器,并在所有路由上提供相关页面。 类似于 pixelserv-tls。
「家长控制」和「安全浏览」过滤器的自定义拦截页面
目前无法从用户界面设置这些参数,因此需要手动编辑配置文件:
停止 AdGuard Home:
./AdGuardHome -s stop在编辑器中打开
AdGuardHome.yaml。将
dns.parental_block_host或dns.safebrowsing_block_host设置为服务器的 IP 地址 (在本例中为192.168.123.45):# …
dns:
# …
# NOTE: Change to the actual IP address of your server.
parental_block_host: 192.168.123.45
safebrowsing_block_host: 192.168.123.45重新启动 AdGuard Home:
./AdGuardHome -s start
其他过滤器的自定义拦截页面
打开网页界面。
前往「设置」→「DNS 设置」。
在「DNS 服务器配置」部分中,选择「拦截模式」选择器中的「自定义 IP」单选按钮,然后输入服务器的 IPv4 和 IPv6 地址。
点击「保存」。
如何更改仪表盘界面的地址?
停止 AdGuard Home:
./AdGuardHome -s stop在编辑器中打开
AdGuardHome.yaml。将
http.address设置为新的网络接口。 例如:0.0.0.0:0监听所有网络接口;0.0.0.0:8080监听所有端口为8080的网络接口;127.0.0.1:0仅监听本地环回接口。
重新启动 AdGuard Home:
./AdGuardHome -s start
如何将 AdGuard Home 设置为默认 DNS 服务器?
请参阅「入门」页面上的「配置设备」部分。
是否有任何已知限制?
以下是 DNS 级拦截器无法拦截的内容的一些示例:
YouTube、Twitch 广告。
Facebook、X (以前称为 Twitter)、Instagram 赞助帖子。
基本上,任何与内容共享域的广告都无法被 DNS 级拦截器屏蔽,除非用户愿意拦截其他内容。
将来是否有可能处理这个问题?
DNS 永远不足以做到这一点。 用户唯一的选择是使用内容拦截代理,就像我们在独立 AdGuard 应用程序中所做的那样。 我们打算在 AdGuard Home 添加对该功能的支持。 遗憾的是,即便如此,在某些情况下还是不够用,或者需要相当复杂的配置。
在 Ubuntu 上尝试安装时收到 bind: address already in use 错误
发生这种情况的原因是 localhost 上用于 DNS 的端口 53 已被另一个程序占用。 Ubuntu 附带一个名为 systemd-resolved 的本地 DNS,它使用地址 127.0.0.53:53,因此阻止 AdGuard Home 绑定到 127.0.0.1:53。 用户可以通过运行以下命令来查看:
sudo lsof -i :53
输出应类似于:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
systemd-r 14542 systemd-resolve 13u IPv4 86178 0t0 UDP 127.0.0.53:domain
systemd-r 14542 systemd-resolve 14u IPv4 86179 0t0 TCP 127.0.0.53:domain
要解决此问题,必须禁用 systemd-resolved 守护进程,或选择其他网络接口,并将 AdGuard Home 绑定到其上的可访问 IP 地址,例如网络内路由器的 IP 地址。 不过,如果要在本地主机上监听,则有几种解决方案。
首先,如果用户按下安装屏幕上 address already in use 消息旁边的「修复」按钮,AdGuard Home 可以检测到此类配置并禁用 systemd-resolved。
其次,如果这不起作用,请按照以下说明操作。 请注意,如果您将 AdGuard Home 与 docker 或 snap 一起使用,必须自行执行此操作。
如果需要,请创建
/etc/systemd/resolved.conf.d目录:sudo mkdir -p /etc/systemd/resolved.conf.d停用
DNSStubListener并更新 DNS 服务器地址。 为此,请创建一个新文件/etc/systemd/resolved.conf.d/adguardhome.conf,内容如下:[Resolve]
DNS=127.0.0.1
DNSStubListener=no
必须将 127.0.0.1 指定为 DNS 服务器地址。否则,名称服务器将为 127.0.0.53,如果没有 DNSStubListener,它将无法工作。
激活另一个
resolv.conf文件:sudo mv /etc/resolv.conf /etc/resolv.conf.backup
sudo ln -s /run/systemd/resolve/resolv.conf /etc/resolv.conf重新启动
DNSStubListener:sudo systemctl reload-or-restart systemd-resolved
之后,systemd-resolved 不应显示在 lsof 的输出中,并且 AdGuard Home 应该能够绑定到 127.0.0.1:53。
如何为 AdGuard Home 配置反向代理服务器?
如果您已经在运行 Web 服务器,并且想要从 http://YOUR_SERVER/aghome/ 等 URL 访问 AdGuar Home 仪表盘用户界面,那么可以为您的 Web 服务器使用此配置:
nginx
location /aghome/ {
proxy_cookie_path / /aghome/;
proxy_pass http://AGH_IP:AGH_PORT/;
proxy_redirect / /aghome/;
proxy_set_header Host $host;
}
caddy
:80/aghome/* {
route {
uri strip_prefix /aghome
reverse_proxy AGH_IP:AGH_PORT
}
}
或者,如果您只想使用自动 TLS 为 AdGuard Home 提供服务,请使用类似于以下示例的配置:
DOMAIN {
encode gzip zstd
tls YOUR_EMAIL@DOMAIN
reverse_proxy AGH_IP:AGH_PORT
}
Apache
<VirtualHost *:80>
ProxyPass "/" "http://AGH_IP:AGH_PORT/"
ProxyPassReverse "/" "http://AGH_IP:AGH_PORT/"
PreserveHost On
</VirtualHost>
请不要在 Apache 反向 HTTP 代理中使用子目录。 It’s a known issue (#6604) that Apache handles relative redirects differently than other web servers. 这会导致 AdGuard Home 网络界面出现问题。
在 AdGuard Home 上禁用 DoH 加密
如果在反向代理服务器上使用 TLS,那么无需在 AdGuard Home 上使用 TLS。 在 AdGuardHome.yaml 中设置 allow_unencrypted_doh: true 以允许 AdGuard Home 在没有 TLS 加密的情况下响应 DoH 请求。
客户端的真实 IP 地址
用户可以将参数 trust_proxies 设置为 HTTP 代理的 IP 地址 (可以是多个),以使 AdGuard Home 考虑包含真实客户端 IP 地址的标头。 请参阅配置和加密页面了解更多信息。
如何修复 Fedora 上的 permission denied 错误?
将
AdGuardHome二进制文件移动到/usr/local/bin。以
root身份执行以下命令来更改文件的安全上下文:chcon -t bin_t /usr/local/bin/AdGuardHome添加所需的防火墙规则,使其可通过网络访问。 例如:
firewall-cmd --new-zone=adguard --permanent
firewall-cmd --zone=adguard --add-source=192.168.0.14/24 --permanent
firewall-cmd --zone=adguard --add-port=3000/tcp --permanent
firewall-cmd --zone=adguard --add-port=53/udp --permanent
firewall-cmd --zone=adguard --add-port=80/tcp --permanent
firewall-cmd --reload
如果您仍然收到 code=exited status=203/EXEC 或来自 systemctl 的类似错误,请尝试卸载 AdGuard Home,并使用安装脚本的 -o 选项将其直接安装到 /usr/local/bin 中:
curl -s -S -L 'https://raw.githubusercontent.com/AdguardTeam/AdGuardHome/master/scripts/install.sh' | sh -s -- -o '/usr/local/bin' -v
请参阅 issue 765 和 issue 3281。
如何修复不兼容的文件系统错误?
您应该将 AdGuard Home 安装或工作目录移至其他位置。 请参阅「入门」页面上的「限制」部分。
Error: control/version.json 是什么意思?
此错误消息表示 AdGuard Home 无法访问 AdGuard 服务器以检查更新和/或下载更新。 这可能意味着服务器被您的 ISP 拦截或暂时关闭。 如果错误在一段时间后仍未自行解决,可以尝试执行手动更新或通过使用 --no-check-update 命令行选项运行 AdGuardHome 可执行文件来禁用自动更新检查。
如何手动更新 AdGuard Home?
如果该按钮未显示或自动更新失败,可以手动更新服务。 在下面的示例中,我们将使用适用于 AMD64 CPU 的 Linux 和 Windows 的 ADGuard Home 版本。
Unix (Linux, macOS, BSD)
从发布页面下载新的 AdGuard Home 软件包。 如果您要从命令行执行此步骤,请键入:
curl -L -S -o '/tmp/AdGuardHome_linux_amd64.tar.gz' -s\
'https://static.adguard.com/adguardhome/release/AdGuardHome_linux_amd64.tar.gz'或者,使用
wget:wget -O '/tmp/AdGuardHome_linux_amd64.tar.gz'\
'https://static.adguard.com/adguardhome/release/AdGuardHome_linux_amd64.tar.gz'导航到 AdGuard Home 的安装目录。 在大多数 Unix 系统上,默认目录是
/opt/AdGuardHome,但在 macOS 上是/Applications/AdGuardHome。停止 AdGuard Home:
sudo ./AdGuardHome -s stop:::注意 OpenBSD
在 OpenBSD 上,您可能需要使用
doas而不是sudo。:::
备份数据。 也就是说,您的配置文件和数据目录 (默认为
AdGuardHome.yaml和data/)。 例如,要将数据备份到名为~/my-agh-backup的新目录:mkdir -p ~/my-agh-backup
cp -r ./AdGuardHome.yaml ./data ~/my-agh-backup/将 AdGuard Home 压缩包解压到临时目录。 例如,如果您将压缩包下载到
~/Downloads目录,并希望将其解压缩到/tmp/:tar -C /tmp/ -f ~/Downloads/AdGuardHome_linux_amd64.tar.gz -x -v -z在 macOS 上,键入如下内容:
unzip -d /tmp/ ~/Downloads/AdGuardHome_darwin_amd64.zip将旧的 AdGuard Home 可执行文件替换为新的可执行文件。 在大多数 Unix 系统上,该命令如下所示:
sudo cp /tmp/AdGuardHome/AdGuardHome /opt/AdGuardHome/AdGuardHome在 macOS 上,类似:
sudo cp /tmp/AdGuardHome/AdGuardHome /Applications/AdGuardHome/AdGuardHome您可能还希望复制软件包的文档部分,例如更改日志 (
CHANGELOG.md)、README 文件 (README.md) 和许可证 (LICENSE.txt)。现在,您可以删除临时目录。
重新启动 AdGuard Home:
sudo ./AdGuardHome -s start
Windows(使用 PowerShell)
在下面的所有示例中,PowerShell 必须以管理员身份运行。
从发布页面下载新的 AdGuard Home 软件包。 如果要从命令行执行此步骤:
$outFile = Join-Path -Path $Env:USERPROFILE -ChildPath 'Downloads\AdGuardHome_windows_amd64.zip'
$aghUri = 'https://static.adguard.com/adguardhome/release/AdGuardHome_windows_amd64.zip'
Invoke-WebRequest -OutFile "$outFile" -Uri "$aghUri"导航到 AdGuard Home 的安装目录。 在下面的示例中,我们将使用
C:\Program Files\AdGuardHome。停止 AdGuard Home:
.\AdGuardHome.exe -s stop备份数据。 也就是说,您的配置文件和数据目录 (默认为
AdGuardHome.yaml和data/)。 例如,要将数据备份到名为my-agh-backup的新目录:$newDir = Join-Path -Path $Env:USERPROFILE -ChildPath 'my-agh-backup'
New-Item -Path $newDir -ItemType Directory
Copy-Item -Path .\AdGuardHome.yaml, .\data -Destination $newDir -Recurse将 AdGuard Home 压缩包解压到临时目录。 例如,如果您已将压缩包下载到
Downloads目录,并希望将其解压缩到临时目录:$outFile = Join-Path -Path $Env:USERPROFILE -ChildPath 'Downloads\AdGuardHome_windows_amd64.zip'
Expand-Archive -Path "$outFile" -DestinationPath $Env:TEMP将旧的 AdGuard Home 可执行文件替换为新的可执行文件。 例如:
$aghExe = Join-Path -Path $Env:TEMP -ChildPath 'AdGuardHome\AdGuardHome.exe'
Copy-Item -Path "$aghExe" -Destination .\AdGuardHome.exe您可能还希望复制软件包的文档部分,例如更改日志 (
CHANGELOG.md)、README 文件 (README.md) 和许可证 (LICENSE.txt)。现在,您可以删除临时目录。
重新启动 AdGuard Home:
.\AdGuardHome.exe -s start
如何卸载 AdGuard Home?
根据您安装 AdGuard Home 的方式,有不同的卸载方法。
在卸载 AdGuard Home 之前,请不要忘记更改设备的配置并将它们指向其他 DNS 服务器。
常规安装
在这种情况下,请执行以下操作:
注销 AdGuard Home 服务:
./AdGuardHome -s uninstall.删除 AdGuard Home 主目录。
Docker
只需停止并删除图像即可。
Snap Store
snap remove adguard-home