DNS 加密
AdGuard Home 开箱即支持所有现代 DNS 加密协议。
AdGuard Home 同时支持客户端和服务端的 DNSCrypt。了解如何将 AdGuard Home 配置为 DNSCrypt 服务器。
本指南介绍如何使用 AdGuard Home 搭建加密 DNS 服务器。
服务器安装
加密 DNS 流量的目的是保护其免受第三方(例如 ISP)的分析或篡改。
这意味着您需要一台拥有公网独立 IP 地址的服务器。有很多廉价的云服务器提供商:DigitalOcean、Vultr、Linode 等。任选一家,在其上创建云服务器,然后在服务器上安装 AdGuard Home。
注册域名
首先,您需要一个域名。如果您从未注册过域名,这里有一份简单的教程可以帮助您。
获取 SSL 证书
DNS-over-HTTPS 和 DNS-over-TLS 都基于 TLS 加密,因此使用它们需要 SSL 证书。
SSL 证书可以从证书颁发机构(CA)购买。CA 是受浏览器和操作系统信任、为域名颁发 SSL 证书的公司。
或者,您也可以从 Let’s Encrypt CA 免费获取证书。Let's Encrypt 是由互联网安全研究组(ISRG)开发的免费证书颁发机构。
本指南介绍如何获取证书。
使用 CertBot
Certbot 是一个易于使用的客户端,用于从 Let's Encrypt 获取证书。
- 访问 certbot.eff.org,选择「以上都不是」软件以及您的操作系统。
- 按照安装说明操作,在进入「入门」部分之前停止。
使用 DNS 挑战获取证书
如果您已有域名,使用 DNS 挑战是获取证书的最简单方式。
运行以下命令并按 Certbot 的提示操作:
sudo certbot certonly --manual --preferred-challenges=dns --preferred-chain="ISRG Root X1"
最后,您会得到两个文件:
fullchain.pem:PEM 编码的 SSL 证书privkey.pem:PEM 编码的私钥
配置 AdGuard Home 时需要这两个文件。
续期现有证书时需要使用完全相同的方法。
使用 Lego
还有一个非常不错且易于使用的 CertBot 替代方案:LEGO。
此外,这里有一个简单的脚本,可用于自动化证书生成和续期。
配置 AdGuard Home
-
打开 AdGuard Home 网络界面并前往「设置」。
-
选择「加密」部分。

-
将
fullchain.pem文件的内容复制/粘贴到「证书」下的输入字段中,或指定文件路径。 -
将
privkey.pem文件的内容复制/粘贴到「私钥」下的输入字段中,或指定文件路径。 -
在「服务器名称」中输入您的域名。
-
看到验证成功的提示后,点击「保存设置」。
当通过文件路径指定的证书和/或私钥发生更改时,AdGuard Home 会自动重新加载。也可通过 SIGHUP 信号触发重新加载。
与反向代理一起使用
我们已有一篇关于配置反向代理服务器以访问 AdGuard Home Web 界面的指南。
AdGuard Home 能够限制来自未加入「受信任」列表的代理服务器的 DNS-over-HTTPS 请求。默认情况下,它被配置为接受来自 IPv4 和 IPv6 本地回环地址的请求。
要让 AdGuard Home 处理来自反向代理服务器的 DNS-over-HTTPS 请求,请在 AdGuardHome.yaml 中将 trusted_proxies 设置为该代理服务器的 IP 地址。如果有多个代理服务器,可以使用 CIDR 而不是单个 IP 地址。
Nginx 反向代理
要将 AdGuard Home 配置为接受来自 Nginx 反向代理服务器的请求,请确保反向代理服务器本身已正确配置。
nginx.conf 文件中应包含相应的指令,以向请求添加支持的转发头,这些头是 X-Real-IP 或 X-Forwarded-For。这可以通过 ngx_http_realip_module 实现。简而言之,该模块会获取客户端的真实 IP 地址,并将其写入 HTTP 请求的头信息中。 AdGuard Home 将接收该头部的值,并将其解析为真实的客户端地址。反向代理服务器的地址也将被接收,并同样与「受信任」代理列表进行核对。
您可能希望代理的另一个头部是 Host 头,该头用于使 AdGuard Home 能够识别来自主机名中包含 ClientID 的客户端的请求。
例如,如果反向代理服务器的配置包含以下指令:
location /dns-query {
# …
proxy_set_header Host $host;
proxy_set_header X-Real-IP '1.2.3.4';
proxy_bind 192.168.1.2;
# …
}
AdGuard Home 会将 192.168.1.2 作为代理服务器的地址,并与 trusted_proxies 进行核对。如果该代理是「受信任的」,则 1.2.3.4 将受到访问设置的控制。
Cloudflare CDN
Cloudflare 的内容分发网络充当反向代理,会将其自己的头部(CF-Connecting-IP 和 True-Client-IP)附加到转发的请求中。 AdGuard Home 也支持这些头部,因此反向代理服务器的地址可以直接添加到 trusted_proxies 列表中。有关恢复原始访问者 IP 的详细信息,请参阅 Cloudflare 官方参考文档。
其他头部
未来 AdGuard Home 可能会支持其他 HTTP 头部。不过,任何与 HTTP 头部相关的功能请求,应首先尝试通过配置反向代理自身来解决。
例如,要修改 HTTP 严格传输安全机制以包含实验性的 preload 指令,可以使用类似如下的配置片段:
location /dns-query {
# …
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
# …
}
配置设备
Android
- Android 9 及以上版本原生支持
DNS-over-TLS。要配置它,请前往「设置」→「网络和互联网」→「高级」→「私人 DNS」,并在其中输入您的域名。 - AdGuard Android 版支持
DNS-over-HTTPS、DNS-over-TLS、DNSCrypt和DNS-over-QUIC。 - Intra 为 Android 添加了
DNS-over-HTTPS支持。
iOS
- iOS 14 及以上版本通过配置描述文件原生支持
DNS-over-TLS和DNS-over-HTTPS。为简化操作,AdGuard Home 可以为您生成这些配置描述文件。只需前往「设置向导」→「DNS 隐私」,然后滚动到 iOS 部分即可。 - AdGuard for iOS 支持
DNS-over-HTTPS、DNS-over-TLS、DNSCrypt和DNS-over-QUIC。 - DNSCloak 支持
DNS-over-HTTPS,但要将其配置为使用您自己的服务器,需要为其生成一个 DNS Stamp。
Windows
- Windows 10 版本 19628 及更高版本原生支持
DNS-over-HTTPS。 - AdGuard Windows 版支持
DNS-over-HTTPS、DNS-over-TLS、DNSCrypt和DNS-over-QUIC。
macOS
- macOS Big Sur 及更高版本通过配置描述文件原生支持
DNS-over-TLS和DNS-over-HTTPS。为简化操作,AdGuard Home 可以为您生成这些配置描述文件。只需前往「设置向导」→「DNS 隐私」,然后滚动到 iOS 部分即可。
其他实现方式
- AdGuard Home 本身可以在任何平台上作为安全的 DNS 客户端使用。
- dnsproxy 支持所有已知的安全 DNS 协议。
- dnscrypt-proxy 支持
DNS-over-HTTPS。 - Mozilla Firefox 支持
DNS-over-HTTPS。
配置 DNSCrypt
AdGuard Home 能够作为 DNSCrypt 服务器工作。不过,此功能只能通过配置文件启用,无法通过 Web 界面进行设置。本指南将说明如何操作。
生成配置文件
以下是生成 DNSCrypt 配置文件并让 AdGuard Home 指向它的方法:
确保您的 TLS 设置有效且加密已启用。
-
获取适用于您系统的最新版
dnscrypt工具。解压缩归档文件,并进入生成的目录。-
在 Unix 系统上,使用兼容 POSIX 的 shell:
(此处及下文均以
linux-amd64为例。请务必下载并使用适用于您平台的版本。)-
提取文件:
tar -f ./dnscrypt-linux-amd64-v2.2.3.tar.gz -v -x -z输出示例:
linux-amd64/linux-amd64/README.mdlinux-amd64/LICENSElinux-amd64/dnscrypt -
转到提取的目录:
cd ./linux-amd64/ -
生成配置文件:
./dnscrypt generate --provider-name '2.dnscrypt-cert.example.org' --out ./dnscrypt.yaml输出示例:
2022/01/02 12:34:56 [info] Generating configuration for 2.dnscrypt-cert.example.org2022/02/02 12:34:56 [info] Configuration has been written to ./dnscrypt.yaml2022/02/02 12:34:56 [info] Go to https://dnscrypt.info/stamps to generate an SDNS stamp2022/02/02 12:34:56 [info] You can run a DNSCrypt server using the following command:2022/02/02 12:34:56 [info] dnscrypt server -c ./dnscrypt.yaml -f 8.8.8.8
-
-
在 Windows 上,使用 PowerShell:
(此处及下文中,
windows-amd64用作示例。请确保下载并使用适用于您的 CPU 架构的版本。)-
提取文件:
Expand-Archive -Path .\dnscrypt-windows-amd64-v2.2.3.zip -
转到提取的目录:
Set-Location -Path .\dnscrypt-windows-amd64-v2.2.3\windows-amd64\ -
生成配置文件:
.\dnscrypt.exe generate --provider-name '2.dnscrypt-cert.example.org' --out .\dnscrypt.yaml输出示例:
2022/01/02 12:34:56 [info] Generating configuration for 2.dnscrypt-cert.example.org2022/02/02 12:34:56 [info] Configuration has been written to .\dnscrypt.yaml2022/02/02 12:34:56 [info] Go to https://dnscrypt.info/stamps to generate an SDNS stamp2022/02/02 12:34:56 [info] You can run a DNSCrypt server using the following command:2022/02/02 12:34:56 [info] dnscrypt server -c .\dnscrypt.yaml -f 8.8.8.8
-
其中
example.org是您的主机名,./dnscrypt.yaml是配置输出文件的名称。您可以将二进制文件的路径添加到您的
PATH/$env:PATH中。 -
-
在配置文件(通常为
AdGuardHome.yaml)中,添加以下内容:'tls':# N.B. The encryption must be enabled.'enabled': true# …'port_dnscrypt': 5443'dnscrypt_config_file': './dnscrypt.yaml'其中
5443是您的 DNSCrypt 服务器端口,./dnscrypt.yaml是步骤 2 中生成的配置文件的名称。重要信息修改配置文件前,请先停止 AdGuard Home。
tip在 Windows 上,建议使用配置文件的完整路径。例如,
C:\用户\Me\文件\dnscrypt.yaml。
生成 DNSCrypt stamp
以下是如何生成 DNSCrypt stamp 并检查安装:
-
输入来自您的 DNSCrypt 配置文件中的数据。「提供方公钥」即您 DNSCrypt 配置文件中
public_key字段的值。note输入带有自定义端口的主机。
-
现在您会得到一个类似这样的印章:
sdns://AQcAAAAAAAAADTEyNy4wLjAuMTo0NDMg8R3bzEgX5UOEX93Uy4gYSbZCJvPeOXYlZp2HuRm8T7AbMi5kbnNjcnlwdC1jZXJ0LmV4YW1wbGUub3Jn运行以下命令检查安装:
./dnscrypt lookup-stamp \--domain 'example.com' \--stamp 'sdns://AQcAAAAAAAAADTEyNy4wLjAuMTo0NDMg8R3bzEgX5UOEX93Uy4gYSbZCJvPeOXYlZp2HuRm8T7AbMi5kbnNjcnlwdC1jZXJ0LmV4YW1wbGUub3Jn' \--type 'a'或者,在 Windows 上:
.\dnscrypt.exe lookup-stamp `--domain 'example.com' `--stamp 'sdns://AQcAAAAAAAAADTEyNy4wLjAuMTo0NDMg8R3bzEgX5UOEX93Uy4gYSbZCJvPeOXYlZp2HuRm8T7AbMi5kbnNjcnlwdC1jZXJ0LmV4YW1wbGUub3Jn' `--type 'a'其中
example.com是要查询的域名。
配置设备以使用 DNSCrypt
所有平台
dnscrypt-proxy(参考实现)。 DNSCrypt-Proxy 是一个命令行代理,支持 Linux、BSD、Windows、macOS、Android 等系统。
Android
- AdGuard Android 版支持 DNSCrypt。
iOS
- AdGuard iOS 版支持 DNSCrypt。
- DNSCloak 内部使用
dnscrypt-proxy,并支持 DNSCrypt。
Windows
- AdGuard Windows 版支持 DNSCrypt。
- Simple DNSCrypt 是一个在 Windows 上配置和运行
dnscrypt-proxy的简易管理工具。
更多信息请参阅 DNSCrypt 官网和 DNS 隐私项目列表。